STM, STM32, آموزش, توصیه شده, مقاله

آموزش میکروکنترلر STM32 : رابط سریال UART

STM32 Uart

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

برای شروع آموزش میکروکنترلر STM32 به سراغ نرم‌افزار CubeMX می‌رویم و میکروکنترلر مورد نظرمان را که همان stm32f103c8t6 است، انتخاب می‌کنیم، بعد از تنظیم قسمت کلاک و پروگرامر STM32 حال می‌خواهیم رابط سریال UART1 را در مد آسنکرون فعال کنیم. دو راه حل پیش رو داریم یکی اینکه در کادر Pinout به علاوه قسمت UART1 را بزنیم و مانند عکس زیر از زبانه اول گزینه Asynchronous را انتخاب کنیم:

 

تنظیمات رابط سریال UART1

 

در این حالت پایه‌های میکروکنترلر STM32 به صورت عکس زیر در می‌آیند:

 

پایه های میکروکنترولر برای رابط سریال UART1

 

روش دیگری هم برای انتخاب پایه‌های UART وجود دارد ، اگر به دیتا شیت میکروکنترلر مراجعه کنیم، متوجه می‌شویم که UART1 روی پین‌های PB6 و PB7 نیز موجود است و ما می‌توانیم از آن پایه‌ها برای ارتباط UART1 استفاده کنیم. برای این‌کار طبق عکس زیر ابتدا روی آن‌ها کلیک چپ می‌کنیم و گزینه‌های مربوط به UART1 را انتخاب می‌کنیم.

 

تنظیمات رابط سریال UART1

 

سپس به کادر Pinout می‌رویم و به علاوه قسمت UART1 را می‌زنیم و مانند روش قبلی از زبانه اول گزینه Asynchronous را انتخاب می‌کنیم، تا پایه‌ها از رنگ زرد به رنگ سبز و انتخاب شده در آیند. پس تا این‌جا متوجه شدیم فایده این روش این است که ما می‌توانیم UART مورد نظر را به پایه‌های دیگر که در میکروکنترلر برای این واحد در نظر گرفته شده است انتقال دهیم.

بعد از یاد گرفتن این قسمت‌ها به قسمت Configuration می‌رویم و طبق عکس زیر دکمه UART1 را می‌زنیم تا تنظیمات این واحد را انتخاب کنیم:

 

 قسمت Configuration

 

بعد از زدن دکمه یاد شده صفحه زیر باز می‌شود:

 

UART1 Configuration

کادر قرمز: مشخصات ابتدائی و پایه رابط سریال مثل نرخ ارسال و امثالهم
کادر بنفش: فعال کردن قابلیت ارسال و دریافت رابط سریال

 

پس از مشخص کردن تنظیمات مانند عکس بالا دکمه OK را می‌زنیم و از CubeMX خروجی می‌گیریم و به محیط نرم‌افزار KEIL وارد می‌شویم. حالا باید دستورات کار با رابط UART را در کتابخانه hal مورد بررسی قرار دهیم، اولین فرمانی که تصمیم داریم بررسی کنیم فرمان ارسال یک رشته به رابط سریال است.

 

در آرگومان *huart تابع نام uart مورد استفاده ما قرار می‌گیرد و در آرگومان *pData رشته‌ای که قرار است به رابط سریال ارسال شود، مشخص می‌شود. در آرگومان Size سایز یا تعداد بایتی که قرار است از رشته مورد نظر ارسال شود را تعیین می‌کند و آرگومان Timeout حداکثر زمانی را مشخص می‌کند که این تابع باید در این مدت زمان رشته را به رابط سریال ارسال کند. برای درک بهتر نحوه عملکرد این تابع بهتر است به محل تعریف شدن این تابع برویم تا با جزئیات مسئله آگاه شویم. منتها قبل از این مسئله بهتر است نگاهی به شکل ساختار یا استراکچر UART_HandleTypeDef داشته باشیم بدین منظور به عکس زیر که جزئیات این ساختار را در برگه stm32f1xx_hal_uart.h نمایش می‌دهد توجه کنید.

برگه stm32f1xx_hal_uart.h

 

همان‌طور که میبینید در ساختار UART_HandleTypeDef اشاره‌گر اول از نوع ساختار USART_TypeDef است که به رجیسترهای رابط سریال uart مربوط می‌شود، که در عکس زیر می‌توانید ببینید.

ساختار USART_TypeDef

شش مولفه دیگر هم که کادر بنفش و قرمز دور آن‌ها کشیده شده، سه عدد اول مربوط می‌شود به ارسال و سه عدد بعدی هم به مقوله دریافت اختصاص دارد که در تابع دریافت توضیح داده خواهد شد. دو مولفه که دور آن کادر‌های آبی کشیده شده از نوع شمارش HAL_UART_StateTypeDef است که در عکس زیر مشاهده می‌کنید:

شمارش HAL_UART_StateTypeDef

 

که از طریق آن دو مولفه می‌توانید متوجه شوید آیا رابط uart برای ارسال یا دریافت آزاد هست یا نه. کاربرد این قابلیت را در بررسی توابع بیشتر خواهیم آموخت.

حال برای فهم بیشتر مسئله به متن تابع HAL_UART_Transmit مراجعه می‌کنیم. در عکس زیر می‌توانید قسمت‌هایی از بدنه این تابع را ببینید. همان‌طور که در عکس مشاهده می‌کنید، ابتدا بررسی می‌شود که آیا رابط سریال برای ارسال آماده است یا خیر. که اگر این‌گونه نباشد متن تابع اجرا نمی‌شود. در کدهای زیر مشخص گردیده که بعد برقراری شرط آزاد بودن رابط سریال برای ارسال در خط 662 رابط سریال به حالت مشغولی ارسال یعنی  HAL_UART_STATE_BUSY_TX در می آید و در پایان تابع که عمل ارسال تمام شد دوباره به حالت HAL_UART_STATE_READY یا همان حالت آزاد برمی‌گردد.

تابع HAL_UART_Transmit

 

طبق توضیحات بالا ما می‌توانیم از طریق چک کردن huart->TxXferCount که در این‌جا منظور از huart نام همان رابط uart مورد نظر ماست متوجه شویم تا الان چند بایت ارسال شده است.

حالا می‌رسیم به اینکه خروجی این تابع چه می‌باشد و چه مقداری را بر می‌گرداند. اگر به بدنه تابع نگاه کنیم مقدار برگشتی تابع یک ساختار است با نام HAL_StatusTypeDef حال اگر به محل تعریف این ساختار در برگه stm32f1xx_hal_def.h برویم کدهایی مطابق عکس زیر را مشاهده خواهیم کرد:

برگه stm32f1xx_hal_def.h

 

با توجه به عکس بالا، اولین نکته‌ای را که باید متذکر شد این است که این نوع خروجی مربوط به دیگر توابع hal هم می‌گردد. پس در آینده دیگر این قسمت را توضیح نخواهیم داد. ولیکن در مورد توضیح زیر مجموعه‌های ساختار HAL_StatusTypeDef که در بالا نشان داده شده است. سه گزینه اول که کاملا قابل فهم است. فقط در مورد گزینه HAL_TIMEOUT می‌خواهیم ببنیم اصولا چگونه کار می‌کند و مورد محاسبه قرار می‌گیرد. برای فهم بیشتر موضوع دوباره به متن تابع HAL_UART_Transmit بر می‌گردیم. حال به عکس زیر توجه کنید.

متن تابع HAL_UART_Transmit

تابع UART_WaitOnFlagUntilTimeout که داخل کادر قرمز قرار گرفته کارش این است که در مدت زمان مجاز یا همان Timeout پرچم مورد نظر ما، به وضعیت مقرر تغییر وضعیت می‌دهد یا نه. برای فهم بهتر مسئله بهتر است بدنه تابع مورد نظر را بررسی کنیم بدین منظور به عکس زیر توجه کنید.

همان‌طور که در کادر قرمز عکس بالا مشخص شده با استفاده از همان ()HAL_GetTick که برای محاسبه زمان فرمان HAL_Delay استفاده می‌شد، زمان مجاز Timeout را بررسی می‌کنیم ، پس توجه داشته باشید که اگر می‌خواهید از فرمان‌های hal که دارای قابلیت Timeout هستند استفاده کنید به هیچ عنوان نباید مانند برنامه فصل اول از فرمان ()HAL_SuspendTick برای متوقف کردن وقفه SysTick استفاده کنیم.

 

سیسوگ در قسمت هشتم آموزش میکروکنترلر STM32 مثال عملی برای عملکرد تابع HAL_UART_Transmit بیان می‌کند.

با سیسوگ همراه باشید.

 



انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.  همکاری با سیسوگ

 

نوشته های مشابه

پاسخی بگذارید

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