راه‌اندازی واحد ADC توسط DMA در STM32 | آموزش STM32 با توابع LL

blog
۱۴۰۰-۰۹-۲۴
2 دقیقه

در بخش دهم، با واحد ADC و در بخش قبلی هم با ریدایرکت کردن Printf و Scanf آشنا شدیم. در این بخش، می‌خواهیم نحوه‌ی راه‌اندازی واحد ADC توسط DMA (بورد Blue Pill) را توضیح دهیم و البته به کمک واحد DMA از این واحد اطلاعات را دریافت و در حافظه ذخیره کنیم. واحد DMA یا Direct Memory Access همان‌طور که از نام آن مشخص است برای کنترل ارتباط با حافظه به‌کار می‌رود. مزیت استفاده از DMA این است که این واحد مستقل از پردازنده اصلی می‌تواند ورود و خروج اطلاعات بین وسایل جانبی و حافظه را کنترل کند، درنتیجه توان پردازشی پردازنده می‌تواند صرف انجام کارهای دیگر شود.

 

مرحله اول ایجاد پروژه در محیط STM32CubeMX

برای راه‌اندازی واحد ADC توسط DMA ، مثل قبل تنظیمات کلاک و دیباگ و انتخاب پین‌های ورودی و خروجی موردنیاز انجام می‌شود. در صورت نیاز به ارسال اطلاعات دریافتی از ADC، تنظیم USART نیز باید به همان شکل قبل انجام شود. برای تنظیم ADC در منوی Analog، واحد ADC1 را انتخاب می‌کنیم. در بخش Mode کانال‌های موردنیاز انتخاب می‌شوند (در اینجا کانال 0 و کانال 1 انتخاب‌شده‌اند). در بخش Configuration و از تب پارامترها Continuous Conversion Mode را در حالت Enable قرار می‌دهیم (زیرا می‌خواهیم به‌طور پیوسته مقدار ورودی در کانال‌های ADC را بخوانیم) درصورتی‌که مانند این مثال بیش از یک کانال انتخاب‌شده باشند باید Scan Conversion Mode نیز فعال کنیم. بدین منظور ابتدا Number Of Conversion را روی تعداد موردنظر تنظیم می‌کنیم (در اینجا 2) اولویت تبدیل کانال‌ها و همچنین مدت‌زمان نمونه‌برداری را نیز طبق شکل زیر تنظیم می‌شوند:

 

نکته: تب بعدی که برای کار با واحد ADC، در صورت نیاز تنظیم می‌شود، NVIC یا تنظیم وقفه است. که در اینجا چون ما از DMA استفاده می‌کنیم، نیازی به تنظیم این بخش نیست.

سپس باید از تب DMA و کلید Add یک کانال از DMA را به ADC1 اختصاص دهیم. همچنین از بخش Mode در این تب، حالت انتقال اطلاعات را انتخاب می‌کنیم (در اینجا Circular انتخاب‌شده زیرا می‌خواهیم انتقال اطلاعات از ADC به‌طور پیوسته انجام شود).

بخش‌های Clock و Project Manager نیز مانند گذشته تنظیم می‌شوند.

 

مرحله دوم نوشتن کد پروژه

ابتدا باید کدهای مربوط به تنظیم و راه‌اندازی واحد ADC و DMA را بنویسیم. برای واحد ADC، به کدهای فعال‌سازی، کالیبره کردن، و استارت نرم‌افزاری تبدیل (و در صورت نیاز به فعال‌سازی وقفه) نیاز داریم:

ثابت مربوط به اندازه حافظه مورد نیاز و همچنین متغیرهای مورد استفاده را به کد اضافه می‌کنیم:

و سپس کدهای مربوط به تنظیم و شروع به کار DMA را می‌نویسیم:

با نوشتن این کد، آدرس اولین خانه حافظه موردنظر، و آدرس رجیستر مربوط به داده تبدیل‌شده توسط ADC1 تنظیم‌شده‌اند. همچنین مقدار اطلاعاتی که می‌خواهیم منتقل شوند (در اینجا 2) مشخص‌شده است.

اکنون می‌توانیم در بخش Debug و با تنظیم متغیر adc_read در watch1 مشاهده کنیم که مقادیر دو کانال 0 و 1 ADC پس از تبدیل در دو خانه حافظه که تعریف کرده‌ایم نوشته می‌شوند:

همچنین می‌توان این اطلاعات ذخیره شده در حافظه را از طریق واحد USART ارسال کرد، بدین منظور می‌توانیم کد زیر را در حلقه while(1) قرار دهیم:

خروجی در ترمینال :

خطاهای احتمالی

  • دستورات مربوط به تنظیم فعال‌سازی ADC و DMA، باید حتما در تابع int main و بعد از فراخوانی SystemClock_Config نوشته شود. در غیر این صورت، برنامه دچار خطا خواهد شد.
  • دقت شود که واحد ADC، حتما در مود Circular تنظیم شود. در غیر این صورت پس از یک بار تبدیل و یک بار پر شدن حافظه، اجرا متوقف خواهد شد و اطلاعات دیگری دریافت و در حافظه ثبت نمی‌شود.
  • دو تابع تنظیم آدرس و تنظیم مقدار داده‌هایی که باید منتقل شوند برای واحد DMA باید به‌درستی تنظیم شوند(مشابه کد ارائه‌شده)، زیرا در غیر این صورت واحد DMA راه‌اندازی نمی‌شود.

در بخش بعد با نحوه ارسال اطلاعات به وسیله USART و از طریق DMA آشنا خواهیم شد.

لینک پروژه در گیت هاب

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

سیاوش

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

کارشناس ارشد الکترونیک دیجیتال، علاقه‌مند به یادگیری

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

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

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

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

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

فروشگاه سیسوگ

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

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

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

نویسنده شو !

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

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

نویسنده شو !

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

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

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

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

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

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

فروشگاه سیسوگ

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

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

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

دیدگاه ها

profile
رضا گفت :
۱۴۰۱-۱۲-۰۳ ۱۷:۴۶

با سلام ارور
Error[Li005]: no definition for “LL_ADC_StartCalibration” [referenced from C:\Users\Farshid\Documents\Stm32F407ZGT6\STM32F407ZGT6\EWARM\STM32F407ZGT6\Obj\Application\User\Core\main.o]
و
Error[Li005]: no definition for “LL_ADC_IsCalibrationOnGoing” [referenced from C:\Users\Farshid\Documents\Stm32F407ZGT6\STM32F407ZGT6\EWARM\STM32F407ZGT6\Obj\Application\User\Core\main.o]
و
Error[Li005]: no definition for “LL_ADC_IsCalibrationOnGoing” [referenced from C:\Users\Farshid\Documents\Stm32F407ZGT6\STM32F407ZGT6\EWARM\STM32F407ZGT6\Obj\Application\User\Core\main.o]
برای چیه

profile
Zeus ‌ گفت :
۱۴۰۲-۰۷-۰۷ ۱۶:۵۸

یه سری فانکشن رو لینکر پیدا نمیکنه که میتونه به دلیل اضافه نشدن کتابخانه باشه

profile
احمد گفت :
۱۴۰۱-۰۵-۳۰ ۱۶:۴۶

سلام. ممنون از اموزش خوبتون و وقتی که میذارید
واحد timer+ADC+DMA رو هم میتونید اموزشش رو بذارید که زمان نمونه برداری دقیقا همون مقداری 1MHz؟ به نظر وقتی از تایمر استفاده نشه نرم افزاری زمان نمونه برداری 1Mhz تنظیم میشه و احتمال داره دقیقا هر 1 میکوثانیه داده برداری نکنه اگه اشتباه نکنم درسته؟
ممنون از لطفتون

profile
Zeus ‌ گفت :
۱۴۰۱-۰۶-۰۶ ۰۹:۰۰

سلام دوست عزیز
ببینید اگر نرخ نمونه برداری 1mhz مد نظر باشه این کار رو بدون دخالت تایمر هم میشه انجام داد، با تنظیم صحیح مقدار کلاک واحد ADC و کلاک سیستم میشه این کار رو انجام داد و نیازی به تایمر نیست
و چون کلاک سیستم پایدار هست دقیقا نمونه برداری همون ۱ میکروثانیه یک بار اتفاق خواهد افتاد

profile
محسن گفت :
۱۴۰۰-۱۰-۰۱ ۱۴:۱۱

سلام. از اموزش خوبتون ممنونم . اگه امکانش هست رابط i2c رو با توابع ll hal هم اموزش دهید ممنون

profile
سیاوش گفت :
۱۴۰۰-۱۰-۰۴ ۱۰:۰۵

سلام دوست عزیز. مرسی از همراهی شما. رابط I2C در قسمت 25ام این آموزش گفته میشه که در آینده منتشرش می‌کنیم.

profile
محسن گفت :
۱۴۰۰-۱۰-۰۴ ۱۷:۳۴

سلام . ممنون از وقتی که گذاشتید . سوالم اینه که آیا توابع وقفه ای که در فایل وقفه وجود دارند رو میشه در فایل main باز نویسی کرد که هر وقت وقفه ای رخ می دهد cpu تو همون فایل main به اون رسیدگی کنه و وارد فایل وقفه نشه . منظورم از فایل وقفه فایل
Stm32f2xx_it.c هست

ممنونم

profile
سیاوش گفت :
۱۴۰۰-۱۰-۰۵ ۰۹:۳۴

سلام مجدد. خواهش میکنم. بله امکان این کار وجود داره، به شرط اینکه تابع مورد نظرتون رو توی فایل stm32f2xx_it.c حذف یا کامنت کنین و توی فایل main.c تعریفشون کنین.

become a writer

نویسنده شو !

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

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

نویسنده شو !

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

ارسال مقاله