سلام دوستان. در مقاله ششم آموزش میکروکنترلر STM32 طریقهی کار با تایمر واتچ داگ را آموزش داد و به معرفی وقفههای خطا پرداخت. در این قسمت از آموزش میکروکنترلر STM32 قصد داریم تنظیمات نرمافزار CubeMX برای رابط سریال UART را آموزش دهیم. برای شروع آموزش میکروکنترلر STM32 به سراغ نرمافزار CubeMX میرویم و میکروکنترلر موردنظرمان را که همان stm32f103c8t6 است، انتخاب میکنیم، بعداز تنظیم قسمت کلاک و پروگرامر STM32 حال میخواهیم رابط سریال UART1 را در مد آسنکرون فعالکنیم. دو راهحل پیشرو داریم یکی اینکه در کادر Pinout بهعلاوه قسمت UART1 را بزنیم و مانند عکسزیر از زبانهاول گزینه Asynchronous را انتخابکنیم:
در این حالت پایههای میکروکنترلر STM32 بهصورت عکسزیر درمیآیند:
روشدیگری هم برای انتخاب پایههای UART وجود دارد، اگر به دیتاشیت میکروکنترلر مراجعهکنیم، متوجه میشویم که UART1 روی پینهای PB6 و PB7 نیز موجود است و ما میتوانیم از آن پایهها برای ارتباط UART1 استفادهکنیم. برای اینکار طبق عکسزیر ابتدا روی آنها کلیک چپ میکنیم و گزینههای مربوطبه UART1 را انتخاب میکنیم.
سپس به کادر Pinout میرویم و بهعلاوه قسمت UART1 را میزنیم و مانند روشقبلی از زبانه اول گزینه Asynchronous را انتخاب میکنیم، تا پایهها از رنگ زرد به رنگ سبز و انتخابشده درآیند. پس تا اینجا متوجهشدیم فایدهی اینروش این است که ما میتوانیم UART موردنظر را به پایههای دیگر که در میکروکنترلر برای این واحد درنظر گرفتهشدهاست انتقال دهیم. بعداز یادگرفتن این قسمتها به قسمت Configuration میرویم و طبق عکسزیر دکمه UART1 را میزنیم تا تنظیمات این واحد را انتخابکنیم:
بعداز زدن دکمه یادشده صفحهی زیر باز میشود:
*کادر قرمز: مشخصات ابتدائی و پایه رابط سریال مثل نرخ ارسال و امثالهم*
*کادر بنفش: فعال کردن قابلیت ارسال و دریافت رابط سریال*
پساز مشخصکردن تنظیمات مانند عکسبالا دکمه OK را میزنیم و از CubeMX خروجی میگیریم و به محیط نرمافزار KEIL وارد میشویم. حالا باید دستوراتکار با رابط UART را در کتابخانه hal موردبررسی قراردهیم، اولین فرمانی که تصمیم داریم بررسیکنیم فرمان ارسال یک رشته به رابط سریال است.
(HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout
در آرگومان *huart تابع نام uart مورداستفاده ما قرار میگیرد و در آرگومان *pData رشتهای که قرار است به رابط سریال ارسالشود، مشخص میشود. در آرگومان Size سایز یا تعداد بایتی که قرار است از رشته موردنظر ارسالشود را تعیین میکند و آرگومان Timeout حداکثر زمانی را مشخص میکند که این تابع باید در این مدت زمان رشته را به رابط سریال ارسالکند. برای درک بهتر نحوه عملکرد این تابع بهتر است به محل تعریفشدن این تابع برویم تا با جزئیات مسئله آگاه شویم. منتها قبلاز این مسئله بهتر است نگاهی به شکل ساختار یا استراکچر UART_HandleTypeDef داشتهباشیم بدینمنظور به عکسزیر که جزئیات این ساختار را در برگه stm32f1xx_hal_uart.h نمایش میدهد توجهکنید.
همانطورکه میبینید در ساختار UART_HandleTypeDef اشارهگر اول از نوع ساختار USART_TypeDef است که به رجیسترهای رابط سریال uart مربوط میشود، که در عکسزیر میتوانید ببینید.
شش مولفه دیگر هم که کادر بنفش و قرمز دور آنها کشیدهشده، سه عدد اول مربوط میشود به ارسال و سه عدد بعدی هم به مقوله دریافت اختصاص دارد که در تابع دریافت توضیحداده خواهد شد. دو مولفه که دور آن کادرهای آبی کشیدهشده از نوع شمارش HAL_UART_StateTypeDef است که در عکسزیر مشاهده میکنید:
که از طریق آن دو مولفه میتوانید متوجهشوید آیا رابط uart برای ارسال یا دریافت آزاد هست یا نه. کاربرد این قابلیت را در بررسی توابع بیشتر خواهیم آموخت. حال برای فهمبیشتر مسئله به متن تابع HAL_UART_Transmit مراجعه میکنیم. در عکسزیر میتوانید قسمتهایی از بدنه این تابع را ببینید. همانطورکه در عکس مشاهده میکنید، ابتدا بررسی میشود که آیا رابط سریال برای ارسال آماده است یا خیر؟ که اگر اینگونه نباشد متن تابع اجرا نمیشود. در کدهای زیر مشخصگردیده که بعد برقراری شرط آزادبودن رابط سریال برای ارسال در خط ۶۶۲ رابط سریال به حالت مشغولی ارسال یعنی HAL_UART_STATE_BUSY_TX در میآید و در پایان تابع که عمل ارسال تمامشد دوبارهبه حالت HAL_UART_STATE_READY یا همان حالت آزاد برمیگردد.
طبق توضیحاتبالا ما میتوانیم ازطریق چککردن huart->TxXferCount که دراینجا منظوراز huart نام همان رابط uart موردنظر ماست متوجهشویم تاالان چند بایت ارسالشدهاست. حالا میرسیم بهاینکه خروجی این تابع چه میباشد و چه مقداری را برمیگرداند. اگر به بدنه تابع نگاه کنیم مقدار برگشتی تابع یک ساختار است با نام HAL_StatusTypeDef حال اگر به محل تعریف این ساختار در برگه stm32f1xx_hal_def.h برویم کدهایی مطابق عکسزیر را مشاهده خواهیمکرد:
باتوجهبه عکسبالا، اولین نکتهای را که باید متذکرشد ایناست که این نوع خروجی مربوطبه دیگر توابع hal هم میگردد. پس در آینده دیگر این قسمت را توضیح نخواهیم داد. ولیکن درمورد توضیحزیر مجموعههای ساختار HAL_StatusTypeDef که در بالا نشانداده شدهاست. سه گزینه اول که کاملا قابلفهم است. فقط درمورد گزینه HAL_TIMEOUT میخواهیم ببنیم اصولا چگونه کار میکند و مورد محاسبه قرار میگیرد. برای فهم بیشتر موضوع دوباره به متن تابع HAL_UART_Transmit برمیگردیم. حال به عکسزیر توجهکنید.
تابع UART_WaitOnFlagUntilTimeout که داخل کادر قرمز قرارگرفته کارش این است که در مدت زمان مجاز یا همان Timeout پرچم موردنظرما، به وضعیت مقرر تغییر وضعیت میدهد یا نه. برای فهم بهتر مسئله بهتر است بدنه تابع موردنظر را بررسیکنیم بدینمنظور به عکسزیر توجهکنید.
همانطورکه در کادر قرمز عکس بالا مشخصشده بااستفادهاز همان ()HAL_GetTick که برای محاسبه زمان فرمان HAL_Delay استفاده میشد، زمان مجاز Timeout را بررسی میکنیم ، پس توجه داشتهباشید که اگر میخواهید از فرمانهای hal که دارای قابلیت Timeout هستند استفادهکنید بههیچعنوان نباید مانند برنامه فصل اول از فرمان ()HAL_SuspendTick برای متوقفکردن وقفه SysTick استفاده کنیم. در قسمت هشتم آموزش میکروکنترلر STM32 مثال عملی برای عملکرد تابع HAL_UART_Transmit بیان میکنیم.
با ما همراه باشید.
منبع: سیسوگ