واحد DMA در میکروکنترلر WCH - قسمت 15 آموزش CH

blog
22 بازدید
۱۴۰۴-۰۱-۱۸
7 دقیقه

با سلام، در این قسمت از آموزش‌ها میریم سراغ واحد DMA و ADC، در این آموزش می‌خواهیم یک دیتای آنالوگ رو بخونیم و بدون درگیرشدن CPU از Data Register واحد ADC منتقلش کنیم به یک متغیر یا یک آرایه که بتوان از آن استفاده نمود.

DMA چیست؟

خود DMA به معنای دسترسی مستقیم به حافظه هست، به این معنا که هر وقت لازم باشه دیتایی از آدرسی به آدرس دیگه بره ما میتونم از DMA استفاده بکنیم، معمولاً برای این‌جور انتقالات از CPU استفاده میشه، ولی اگر حجم دیتا زیاد باشه، یا سرعت انتقال زیاد باشه، میتونه CPU رو به چالش بکشه پس مجبوریم از DMA استفاده کنیم.

DMA چیست

حتی می‌توان DMA رو طوری برنامه‌ریزی کرد که کاملاً مستقل از CPU کار کند؛ یعنی حتی نیاز به دستور مستقیم CPU برای انتقال نیز نداشته باشد، مثلاً یک تایمر می‌تواند بدون درگیرکردن CPU مثلاً هر 10 میلی ثانیه یک بار اطلاعات را از جایی به جای دیگر منتقل کند.

DMA یک مبدأ دارد، یک مقصد، یک عامل تحریک شروع انتقال، یک جهت برای انتقال و سایز دیتایی که باید منتقل شود، DMA قابلیت افزایش آدرس در حافظه رو نیز دارد، مثلاً می‌تواند بدون درگیرشدن CPU یک آرایه رو پیمایش کند و اطلاعات آن را آپدیت کند.

اینکه بتوانیم بدون درگیرشدن CPU دیتاهایی رو از جایی به جای دیگر انتقال دهیم نیازمند DMA هست.

مدهای کاری DMA در این میکروکنترلر

مدهای کاری DMA در این میکروکنترلر

در این میکرو هر کانال  DMAسه مد کاری دارد:

  • حافظه به حافظه، یعنی انتقال یک دیتا از یک حافظه خاص به یک حافظه خاص،
  • پریفرال به حافظه، یعنی انتقال دیتای یک پریفرال به یک حافظه، مشابه همین مثال ADC
  • حافظه به پریفرال، یعنی انتقال دیتا از یک حافظه به یک پریفرال، مثل DAC

شما میتونید جهت انتقال رو عوض کنید ولی نیاز به کانفیگ مجدد دارد و نمی‌تواند به طور هم‌زمان توسط یک کانال در دوجهت باشد و این کار نیز مستلزم پشتیبانی پریفرال نیز هست که ما در این میکرو چنین پریفرالی نداریم.

انتقال داده با DMA

خب بریم سراغ واحد DMA در این میکرو:

 

به این دو جدول در برنامه امون به‌شدت نیاز داریم، متأسفانه دیاگرام داخلی خاصی برای واحد DMA در اختیارمون قرار نداده‌اند، البته لازم هم نداریم در این بخش.

مثال مشابه MEM to MEM همون تابعی هست که هممون در زیان C می‌شناسیم و از توابع خود زبان C هست؛ ولی اون تابع باعث اشغال‌شدن CPU میشه ما می‌توانیم، ارائه‌ای که می‌خواهیم کپی کنیم در آرایه دیگر رو با استفاده DMA به‌صورت موازی و با سرعت بالا کپی کنیم و فقط CPU از شروع و پایانش اطلاع پیدا میکنه. چند نکته در مورد MEM to MEM  بگم خدمتتون:

اگر فقط خواستید یک مقدار ثابت رو ست کنید داخل کل ارائه نباید آدرس آن مقدار ثابت رو افزایش بدید و فقط آدرس ارائه رو افزایش بدید مقدار سایز هم ارائه تعیین میکنه.

اگر سایز دو تا ارائه یکی نبود مقدار سایز کوچیک‌ترین آرایه در نظر گرفته می‌شود.

اگر سایز ارائه داینامیک بود یا مقدار دیتا در آن هر سری تفاوت داشت، باید قبل از شروع ارسال سایز آن مجدداً تنظیم شود.

سایزهای ارائه‌ها با دقت انتخاب کنید و اگر سایزها رو افزایش یا کاهش می‌دید، مطمئن شوید هیچ‌وقت از سایز ارائه بیشتر نشود که باعث دیتاهای نادرست و در گاهی اوقات هنگ کردن میکرو می‌شود.

خب این در مورد MEM to MEM بود بریم سراغ MEM to Device

 در این مد یک ارائه یا یک متغیر رو ست می‌کنیم تا دیتا رو به یک پریفرال ارسال کند.

مثلاً در مثال DAC دیدیم که کلی ارائه ۳۶۰تایی داشتیم از شکل موج‌های مختلف با استفاده از DMA می‌توانستیم بدون استفاده از CPU همه مقادیر رو روی DAC ست کرد، حتی می‌شد از CPU برای تریگ کردن انتقال استفاده نکرد و با یک تایمر این کار رو انجام داد.

 و در آخر پریفرال به حافظه رو داریم که دیتا رو از یک پریفرال به حافظه انتقال می‌دهیم مثل مثالی که می‌خواهیم انجام بدهیم.

بریم سراغ راه‌اندازی این مثال و ببینیم هر خط از کد کارش چیه؟

راه‌اندازی DMA برای ADC

فعال‌سازی کلاک واحدهای موردنیاز

اول کلاک‌های واحدهای موردنیاز رو فعال می‌کنیم.

فعال‌سازی کلاک واحدهای موردنیاز

تنظیم GPIO

سپس شروع می‌کنیم به کانفیگ کردن هر بخش، اول‌ازهمه GPIO رو روی مد ورودی آنالوگ قرار می‌دهیم، به‌صورت پیش‌فرض روی همین مد هست. ما برای اطمینان تنظیمات رو انجام می‌دهیم.

تنظیم GPIO

تنظیم تایمر برای تحریک DMA

سپس تایمر رو تنظیم می‌کنیم که DMA رو تریگ بکنه:

 

تنظیم تایمر برای تحریک DMA

انتخاب این تایمر و نوع تریگ کردنش برمیگرده به لیستی که اول آموزش خدمتتون فرستادم اگر نگاه کنید تایمر دو آپدیت رو ما استفاده کردیم که ما رو به کانال 2 DMA میرسونه، پس برای این انتقال از کانال دو DMA استفاده می‌کنیم.

تنظیم تایمر برای تحریک DMA

از SPI1_RX , USART3_TX,TIM1_CH1,TIM3_CH3 هم میتونید برای این آپدیت استفاده کنید.

همه کدهای تایمر در بخش تایمر توضیح داده شدند فقط خط آپدیت DMA استفاده شده که تعیین شده با استفاده از آپدیت شدن تایمر، DMA تریگ میشه و یک انتقال رو انجام میده.

تنظیم ADC

حالا نوبت بخش ADC هست:

تنظیم ADC

همه کدها در آموزش ADC توضیح داده شده‌اند جز خط ADC_DMACMD که تعیین می‌کند که آیا با DMA انتقال انجام بشود یا نه که ما فعالش می‌کنم.

تنظیم DMA

بعدش می‌رسیم به خود DMA:

 

تنظیم DMA

اول‌ازهمه سایز دیتا رو تعیین می‌کنیم که سایز ارائه ما هست، با استفاده از تابع sizeof() مقدارش رو به ورودی برمیگردونیم.

طرف انتقال دیتا از پریفرال به حافظه است، پس DMA_DIR_PeripheralSRC می‌زاریم به معنای اینکه منبع ما پریفرال هست.

با غیرفعال‌کردن M2M یعنی مقصد یا مبدأ ما حتماً یک پریفرال را دارد و ما با پریفرال کار داریم.

آدرس شروع پریفرال رو میدیم که میتونیم با استفاده از پوینترها به دست بیاریم.

مد رو چرخشی انتخاب می‌کنیم تا به‌صورت چرخشی انتقال رو انجام بده اگه نرمال بزاریم باید قبل از هر انتقال یک‌بار تریگ بشه.

سایز دیتای انتقالی رو 16 بیتی یا HALFWORD قرار دادیم چون دیتای ADC ما 12 بیتی هست و 16 بیت براش کافی هست.

چون پریفرال ما فقط یک رجیستر تکی برای دیتا دارد و نباید روی این رجیستر حرکت کرد برای خوندن اطلاعات پس ما آدرس پریفرال رو افزایش نمیدیم.

اولویت انتقال رو اینجا روی HIGH تعیین کردیم. آدرس شروع ارائه رو بهش میدیم. سایز حافظه هم 16 بیتی در نظر می‌گیریم.

ولی در اینجا چون ما ارائه داریم و می‌خواهیم هر دیتا داخل یکی از این خونه ها قرار بگیرد پس آدرس آن را افزایشی انتخاب می‌کنیم که پس از هر انتقال بره به آدرس بعدی.

و در آخر DMA رو فعال می‌کنیم.

خواندن داده از آرایه بدون درگیر شدن CPU

الان میتونیم ارائه DATA رو بخونیم بدون اینکه CPU درگیر انتقال این دیتا به ارائه شده باشه.

خواندن داده از آرایه بدون درگیر شدن CPU

بقیه مدهای انتقالی هم به همین شکل هستن فقط باید مبدأ و مقصد رو تعیین کنید و با استفاده از نرم‌افزار یا سخت‌افزار DMA رو تریگ کنید تا شروع به انتقال کند.

کد کامل این بخش:

 

اطلاعات
22
0
0
لینک و اشتراک
profile

عرفان رفیعی

متخصص الکترونیک

erixson.elc@gmail.com

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

سیسوگ‌شاپ | فروشگاه محصولات Quectel

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
family

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ

سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت

سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم

سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ

آی‌سی

موتور جستجوی قطعات الکترونیکی

سیسوگ آکادمی

پالت

بازار خرید و فروش قطعات الکترونیک

دیدگاه ها

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله