ARM, STM32, آموزش های متنی

راه اندازی واحد سریال UART در STM32

راه اندازی واحد سریال UART در STM32

راه اندازی واحد سریال UART در STM32

در این مطلب به نحوه ی استفاده از واحد UART در میکروکنترلرهای STM32 می پردازیم. برای این منظور از HAL استفاده می کنیم.

قبلا یک مقاله برای شروع کار با STM32 در سایت قرار گرفته است، اگر به تازگی قصد کردید ماجراجویی تون را با میکروکنترلر STM32 شروع کنید، اینجا کلیک کنید.


ویدئو آموزش راه اندازی واحد سریال USART در STM32


تنظیمات محیط stm32CubeMX برای واحد UART

مطابق تصویر زیر واحد UART را برای میکروکنترلر تنظیم می کنیم. از آنجایی که از برد مینی STM32 استفاده می کنیم، پایه ی 9 و 10 این میکروکنترلر مربوط به واحد UART1 می شود.

راه اندازی واحد سریال UART در STM32

مابقی تنظیمات مورد نیاز در محیط stm32CubeMX را از مقاله قبلی در این لینک می توانید پیگیری کنید که در تمام پروژه ها مشترک هستند.

بعد از تولید فایل های پروژه، آماده ایم که کار را در محیط KEIL شروع کنیم.


توابع UART در سبک HAL

برای ارسال و دریافت اطلاعات چند روش وجود دارد، روش عادی، روش استفاده از وقفه، روش استفاده از DMA . با توجه به اینکه پیاده سازی UART در سبک HAL چندان مناسب نیست، صرفا به روش اول، که روش عادی است می پردازیم.


تعریف Handler برای واحد UART

UART_HandleTypeDef huart1;

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


تابع پیکربندی واحد USART

MX_USART1_UART_Init();

این تابع کار پیکربندی اولیه ی واحد UART را انجام می دهد. تنظیمات پایه ها و همینطور تنظیمات مربوط به Baud Rate در این تابع انجام می شود.


تابع ارسال اطلاعات UART

HAL_UART_Transmit(&huart1, &bufSend, 1, 100);
  • آرگومان اول هندلر مربوط به واحد UART است که پیش تر به صورت Global تعریف شده است.
  • آرگومان دوم، بافری است که قصد ارسال آن را داریم.
  • آرگومان سوم، طول این بافر است. به عبارت دیگر تعیین می کند که چند بایت می خواهیم انتقال دهیم.
  • آگومان چهارم، میزان تایم اوت برای ارسال داده را بر حسب میلی ثانیه تعیین می کند.

تابع دریافت اطلاعات UART به روش Polling

HAL_UART_Receive(&huart1, &bufRecv, 1, 100);
  • آرگومان اول هندلر مربوط به واحد UART است که پیش تر به صورت Global تعریف شده است.
  • آرگومان دوم، بافری است که اطلاعات دریافتی قرار است در آن ذخیره شود.
  • آرگومان سوم، طول این بافر است. به عبارت دیگر تعیین می کند که چند بایت می خواهیم دریافت کنیم.
  • آگومان چهارم، میزان تایم اوت برای دریافت داده را بر حسب میلی ثانیه تعیین می کند.

توجه : برای استفاده از این روش نیاز به چک کردن دوره ای تابع دریافت داریم که روش بهینه و مناسبی برای گرفتن اطلاعات ورودی نیست! چرا که بخشی از توان CPU بابت چک کردن دوره ای دریافت اطلاعات تلف می شود. همینطور تنضمینی برای دریافت همه اطلاعات دریافتی نیست! بنابراین بهتر است که دریافت اطلاعات به صورت وقفه ای صورت گیرد.


تابع دریافت اطلاعات UART به روش وقفه ای

HAL_UART_Receive_IT(&huart1, &bufRecv, 32);
  • آرگومان اول هندلر مربوط به واحد UART است که پیش تر به صورت Global تعریف شده است.
  • آرگومان دوم، بافری است که اطلاعات دریافتی قرار است در آن ذخیره شود. به ازاء هر دریافت در روتین وقفه این بافر پر می شود.
  • آرگومان سوم، طول این بافر است. به عبارت دیگر تعیین می کند که چند بایت می خواهیم دریافت کنیم.

توجه : دریافت اطلاعات به روش وقفه ای در پیاده سازی HAL دارای محدودیت هایی است. از این جهت که تنها برای دریافت اطلاعات با طول مشخص قابل استفاده است. بنابراین اگر دریافت اطلاعات با طول متغییر صورت گیرد، این روش راه حل قابل قبولی نخواهد بود.

و اما راه حل چیست؟

در آموزش زیر این موضوع با جزئیات بررسی شده است.

آموزش وقفه پورت سریال UART در STM32

منابع پیشنهادی جهت یادگیری بیشتر STM32

می توانید در دوره آموزش STM32 پروتکل های رایج در لینک زیر شرکت کنید.


لینک های مفید

آموزش STM32 راه اندازی وقفه خارجی EXTI

برنامه نویسی به روش RTOS امروز یک ضرورت است؟

دانلود کتاب الکترونیکی RTOS

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


اگر سوال، پیشنهاد، نظر و یا … دارید، از قسمت نظرات در پایین همین صفحه، می توانید با ما و بقیه ی خوانندگان درمیان بگذارید.

author-avatar

درباره مرتضی زندی

خلق کردن شماره 1 علاقه مندی های من هست. برنامه نویسی بهترین ابزاری بوده که تا الان برای این کار پیدا کردم. بیس الکترونیک دارم و دستی بر آتش در دنیای رشته های مجاور. تجربه سال ها فعالیت در تیم های R&D رو دارم، در این بین در حوزه ی امبدد سیستم ها فعالیتم پررنگ تر هست. عاشق یادگیری و یاد دادن هستم و تلاش می کنم تجربیاتم رو به زبانی ساده از طریق EasyMCU.org به نحوی کاربردی و موثر با علاقه مندان این حوزه به اشتراک بذارم.

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

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.