راه اندازی پروتکل سریال میکروکنترلرهای STM32-بخش مقدماتی( STM32 UART )

سلام دوباره ، باز هم بعد از یک وقفه یک ماه خدمتتون رسیدم تا بحث مقدماتی راه اندازی پروتکل سریال میکروکنترلرهای STM32 یا STM32 UART  رو ادامه بدیم.

مقدمه

قصد داشتم در ادامه  روشن کردن LED با میکرو STM32 , اضافه کردن یک کلید به پروژه را توضیح بدم که به نظرم رسید واقعا یک چیز خیلی ساده هست و اصلا نمیصرفه که یک پست رو مخصوص اون گذاشت ! پس تصمیم گرفتم توی این پست اون کار رو به همراه اضافه کردن UART به برنامه و ارسال اطلاعت به ترمینال کامپیوتر انجام بدم.

هدف این پست صرفا راه اندازی واحد STM32 UART و انتقال اطلاعات نیست بلکه پی بردن از زیرساخت های برنامه است پس تا انتها با من بمونید چون بحث جذابی میشه.

خوب در انتهای پست روشن کردن LED با میکرو STM32 یک پروژه چشمک زن ساختیم . حالا همان پروژه رو با برنامه CubeMX  باز میکنیم و تغییرات رو توی اون اضافه میکنیم .اگر نمیدونید نرم افزار CubeMX چیه به این پست برید .کار با نرم افزار STM32CubeMX

پایه های STM32 UART

با یکم جست و جو  توی دیتاشیت برد میکرو فهمیدم که کلید USER روی پایه P11 قرار داره پس تو قسمت PINOUT از find کمک بگیرید و اون پایه رو پیدا کنید و در حالت GPIO_Input قرار بدید . از طرف دیگه بازم با جست و جو توی همون دیتاشیت فهمیدم که پایه های USART 6 به صورت پین در اختیار من هست پس مجبورم از اونها استفاده کنم . خوب پس اونو هم طبق شکل زیر فعال میکنم

راه اندازی پروتکل سریال میکروکنترلرهای STM32

خوب همانطور که میبینید USART رو در Mode آسنکرون قرار دادم پس میشه همون UART و نیازی به خط کلاک نداره . یک قسمت دیگه هم هست که من در حالت disable قرار دادم و امیدوارم توجهتون بهش جلب شده باشه . اون حالت برای ارتباطاتی هست که به صورت Handshaking اتفاق میوفته مثلا پرینتر و کامپیوتر ! اونجا باید با احترام از پرینتر اجازه بگیری که اطلاعات رو براش بفرستی و اون اجازه بده تا شما بتونی اینکار رو بکنی . اگر میخواهید بیشتر در موردش بدونید لینک یک رو در پایین صفحه باز کنید .خوب الان بریم سراغ سربرگ Configuration و تنظیمات UART . اگر تنظیمات خاصی مد نظرتون نیست با همین تنظیمات ادامه بدید.

تنظیمات STM32 UART

خوب در ادامه در سربرگ NVIC Setting در تنظیمات UART وقفه مربوط به این واحد رو هم فعال میکنیم سپس به تنظیمات GPIO میریم و تنظیمات رو به این ترتیب تغییر میدم . دقت کنید که من اینجا به هر کدوم از پایه ها اسم دادم تا درک بهتری داشته باشم

مطلب پیشنهادی:  واحد کنترل اینتراپت بخش دوم(NVIC)

 

اینکه چرا من حالت پایه رو روی PULLDOWN گذشتم رو از تصویر زیر که بازم از دیتاشیت پیدا کردم میفهمید . در این حالت من برای دستور به کلید باید اونو به VCC وصل کنم.

 

خوب بریم یک سر به تنظیمات واحد NVIC بزنیم . من قبلا در مورد این واحد در این پست ٔٔواحد کنترل اینتراپت به طور مفصل صحبت کردم فقط اینجا میخوام به صورت واضح نشون بدم که تنظیماتش چه جوریه !

تنظیمات اینتراپت USART6

ابتدا تنظیمات اینتراپت USART6 رو طبق تصویر انجام بدید . همونطور که میبینید تعدادی اینتراپت از واحد های مختلف وجود داره که بعضی از اونها به صورت اتوماتیک فعال هستند و اینجا شما نمیتونید غیرفعال یا بلااستفادشون کنید. در جلوی اونها میبینید که شما میتونید اولویت ها رو تغییر بدید .اگر بازم در مورد اولویت ها چیزی نمیدونید پست مربوط به اینتراپت رو بخونید .

بریم به سربرگ Code Generation

خوب در این سربرگ میبینید که CubeMX از شما میپرسه که برای کدوم یک از اینتراپت ها نیاز به بدنه خالی از IRQ اون اینتراپت داری!! معنیش اینه که CubeMX توی یک فایل جدا یک سری تابع تعریف میکنه و بدنه خالی اونها رو هم اونجا قرار میده تا شما در اونجا کد مربوط به اینتراپتتون رو بنویسید . میبنید که امکانش هست برای استثناهای سخت افزاری این میکرو ها هم IRQ نوشت . خوب این یک چیز طبیعی هست چون اونها هم اینتراپت هستند.

مثلا شما میتونید بسته به شرایط Hard fault رو جوری تنظیم کنید که توی یک (while(1 قرار بگیره یا میکرو رو ریست کنه یا کار های دیگه! ما اینجا بهشون نیاز نداریم پس کدشون رو تولید نمیکنیم . خوب در ادامه از منو PROJECT گزینه Generate Code رو میزنیم تا کد اصلاح بشه . دقت کنید که اسم پروژه من هنوز Test led هست.

الان وقت کنجکاویه!! این پست به دلیل اینکه قصد دارم توضیحات کلی در مورد کد های تولید شده بدم به دو بخشی تبدیل میشه . بخش دوم که برای نتیجه گیری و ارتباط با کامپیوتر هست رو در چند روز آینده ارسال میکنم

کد تولید شده برای تنظیمات STM32 UART

خوب این کد تولید شده برای تنظیمات UART هست

میبینید که به غیر از چند خط آخر تنظیمات همان تنظیماتی هستند که شما توی سربرگ Configuration برای UART انجام دادید . و اون if برای اجرای این تنظیمات روی رجیستر های میکرو هست . میبینید که تابع HAL_UART_Init یک مقدار بازگشتی داره که چک میکنه آیا این تنظیمات درست انجام شد یا نه!اگر درست بود که خوب خدا رو شکر اگر نبود تابع Error_Handler اجرا میشه !

مطلب پیشنهادی:  فیلم های آموزشی میکروکنترلرهای ARM

خوب بزارید همینجا تکلیفمون رو با این تابع مشخص کنیم و ببینیم چی هست! این تابع از اسمش مشخصه که ارور ها رو برای ما کنترل یا هندل میکنه ! دقیق ترش اینه که برای ما یک ریپورت تولید میکنه!همونطور که میبینید دو تا آرگومان ورودی داره ! اولی اسم source هست که ارور توش به وجود اومده و دومی خطی هست که این ارور توش وجود داره! اما یک چیز خیلی جالب و مهم!!! این تابع فقط اینجاها کاربر نداره!یادتونه توی چند خط بالا دیدیم که برای بعضی از استثناهای میکرو IRQ تولید نشده؟ خوب به صورت دقیق تر باید گفت که برای همه اونها IRQ تعریف شده ولی ارجاع داده شده به این تابع! یعنی وقتی Hardfault رخ میده تابع مخصوص اون اینتراپت همین Error Handler هست !!

خوب این واقعا یک نکته مهم بود و مطئنم باعث درک بهتر میشه ! انشالله اگر عمری باقی موند توی یک پست توضیح میدم که چه جوری خودمون میتونیم اینکار رو بکنیم هر چند که واقعا نیاز نیست! شاید بپرسید huart6 چیه ؟! میتونیم اول فایل main ببینیم که یک struct به اسم huart6 از نوع UART_HandleTypeDef تعریف شده است.

اینکه struct چی هست رو توی این پست ساختمان یا struct توضیح دادم ولی اینکه UART_HandleTypeDef چی هست رو با این مقدمه کوتاه توضیح میدم. شاید خیلی از شما کسایی باشید که از avr به سمت arm مهاجرت کرده باشید . توی avr هر peripheral ممکنه فوقش ۴ یا ۵ تا رجیستر برای تنظیمات داشته باشه و اگر شما حرفه ای باشید شاید برای peripheral مهم مثل تایمر اون ها رو حفظ هم باشید ولی توی ARM تعداد این رجیستر ها دو رقمی میشه و حفظ کردن اونها تقریبا کار بیهوده ای هست چون علاوه بر تعداد بالا ۳۲ بیتی هم هستند.

برای همین اهمیت کتابخونه ها بالا میره ولی اینکه فقط به کتابخونه اکتفا کنیم کار درستی نیست و  اگر از یک واحدی استفاده میکنیم حداقل یک بار رجیستر های اون رو بررسی کنیم . برای پی بردن به رجیستر های میکرو باید به Reference Manual اون سر بزنیم که همون اول که وارد بشید میفهمید که خوندن کل اون چه دردسری داره چون بالای ۱۰۰۰ صفحه هست .

من برای اینکه بفهمم UART_HandleTypeDef چیه روی این typedef کلیک راست میکنم و گزینه Go To Definition of”” رو میزنم و این مارو به جایی میبره که این ساختمان تعریف شده.

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

مطلب پیشنهادی:  تایمرهای میکروکنترلر LPC1768

لازم به ذکر هست که تمام واحد های USART میکرو ساختار یکسانی دارن و شما با مشخص کردن اینکه با کدوم یکی کار دارید میتونید به قسمت های اون دسترسی داشته باشید.

تصویر بالا که مقایسه Reference Manual و ساختمان رجیسترها هست کاملا گویای موضوع هست!من نحوه تعریف این ساختمان ها برای رجیسترها رو توی بخش های کتابخانه CMSIS توضیح دادم و اینجا دیگه حرفی نمیزنم!خوب شاید اگر الان حوصله داشته باشید بپرسید عضو های دیگه ساختمان UART_HandleTypeDef چی هستند.

واقعیتش تمام کاری که شما با میکرو دارید توی همین ساختمان رجیستر ها هست و بقیش ربطی به میکرو نداره فقط طراحان HAL اون قسمت ها رو اضافه کردن تا رجیستر ها رو به بخش کوچک تر با اسم های با معنی تر تبدیل کنند و از اون ها استفاده کنند و این رجیستر ها رو مقدار دهی کنند. اگر شما با رجیستر ها کار میکنید همین ساختمان USART_TypeDef کارتون رو راه میندازه ولی بدونید که انجام کار های رجیستری سخته ولی… . من جلوتر نمیرم ولی اگر میخواهید بدونید طراحان HAL چگونه از عضو های دیگه UART_HandleTypeDef استفاده کردند توی بدنه این تابع و زیر تابع هاش رو نگاه کنید.

"(HAL_UART_Init(UART_HandleTypeDef *huart"

یک نگاهی به پوشه USER پروژه ساخته شده توسط CubeMX بندازید.

 

اولی که main هست و بیشتر مخصوص user هرچند که بعضی از تنظیمات اونجا انجام میشه . بعدی فایل hal_msp که تنظیماتی مثل اینتراپت ها یا پایه های USART  هستند.  فایل بعدی it هست . در این فایل IRQ هایی که به برنامه CubeMX گفتید رو میسازه .

واقعیتش توی این دو تا فایل چیز خاصی برای توضیح دادن نیست و خودتون با نگاه کردن میفهمید که داستان چی هست! دقت کنید اگر خودتون پروژه رو میسازید و از CubeMX کمک نمیگیرید فرقی نمیکنه آیا این تنظیمات توی فایل های جدا باشه یا توی یک فایل ولی خوب برنامه نویسی ARM با AVR فرق میکنه و شما باید مهندسی تر کار کنید. اگر میخواهید در مورد RS-232_flow_control بیشتر بدانید لینک زیر (انگلیسی هست) را ببینید :

 https://www.lammertbies.nl/comm/info/RS-232_flow_control.html

خوب این بخش STM32 UART اینجا تموم میشه من سعی میکنم توی چند روز آینده بحث رو به صورت عملی نهایی بکنم و قرار بدم تا شما استفاده کنید. اگر سوال یا پیشنهادی داشتید میتونید از قسمت نظرات مطرح کنید.

مطالب مرتبط :

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

2 دیدگاه

  1. با سلام. من یک پروژه مربوط به میکروکنترلرهای STM32 دارم و احتیاج به کمک دارم. *****. مرسی

    • میلاد جهاندیده

      با سلام، متاسفانه پروژه کار نمیکنیم ولی اگر سوالتون عمومی بود و میتونستیم پاسخ بدیم در قسمت کامنت ها یا در قسمت پرسش و پاسخ بپرسید اگر بلد بودیم حتما جواب میدیم. البته اگر از دوستان STM32 کار کسی هم اگر این نظر را میخونه و میتونه کمک کنه اعلام کنه. البته به تاریخ نظر هم دقت داشته باشید یک سال دیگه نیایید بگید من کار میکنم 🙂 موفق باشید.