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

راه اندازی واحد سریال UART در STM32
در این مطلب به نحوه ی استفاده از واحد UART در میکروکنترلرهای STM32 می پردازیم. برای این منظور از HAL استفاده می کنیم.
قبلا یک مقاله برای شروع کار با STM32 در سایت قرار گرفته است، اگر به تازگی قصد کردید ماجراجویی تون را با میکروکنترلر STM32 شروع کنید، اینجا کلیک کنید.
ویدئو آموزش راه اندازی واحد سریال USART در STM32
تنظیمات محیط stm32CubeMX برای واحد UART
مطابق تصویر زیر واحد UART را برای میکروکنترلر تنظیم می کنیم. از آنجایی که از برد مینی STM32 استفاده می کنیم، پایه ی 9 و 10 این میکروکنترلر مربوط به واحد UART1 می شود.
مابقی تنظیمات مورد نیاز در محیط 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 دارای محدودیت هایی است. از این جهت که تنها برای دریافت اطلاعات با طول مشخص قابل استفاده است. بنابراین اگر دریافت اطلاعات با طول متغییر صورت گیرد، این روش راه حل قابل قبولی نخواهد بود.
و اما راه حل چیست؟
در آموزش زیر این موضوع با جزئیات بررسی شده است.
منابع پیشنهادی جهت یادگیری بیشتر STM32
می توانید در دوره آموزش STM32 پروتکل های رایج در لینک زیر شرکت کنید.
لینک های مفید
آموزش STM32 راه اندازی وقفه خارجی EXTI
برنامه نویسی به روش RTOS امروز یک ضرورت است؟
بازار کار مهندسی امبدد سیستم و الکترونیک
اگر سوال، پیشنهاد، نظر و یا … دارید، از قسمت نظرات در پایین همین صفحه، می توانید با ما و بقیه ی خوانندگان درمیان بگذارید.
جهت مطلع شدن از آموزش های جدید به خبرنامه ی EasyMCU بپیوندید.
درباره مرتضی زندی
خلق کردن شماره 1 علاقه مندی های من هست. برنامه نویسی بهترین ابزاری بوده که تا الان برای این کار پیدا کردم. بیس الکترونیک دارم و دستی بر آتش در دنیای رشته های مجاور. تجربه سال ها فعالیت در تیم های R&D رو دارم، در این بین در حوزه ی امبدد سیستم ها فعالیتم پررنگ تر هست. عاشق یادگیری و یاد دادن هستم و تلاش می کنم تجربیاتم رو به زبانی ساده از طریق EasyMCU.org به نحوی کاربردی و موثر با علاقه مندان این حوزه به اشتراک بذارم.
نوشته های بیشتر از مرتضی زندیمطالب زیر را حتما مطالعه کنید
آموزش نصب و راه اندازی سیستم عامل Free RTOS برای آردوینو Arduino
آموزش نصب و راه اندازی سیستم عامل Free RTOS روی STM32
آموزش FreeRTOS نحوه استفاده از میوتکس Mutex
آموزش Free RTOS نحوه استفاده از سمافور Semaphore
آموزش STM32 راه اندازی وقفه خارجی EXTI
معرفی کتاب ARM
این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش میشوند.
دیدگاهتان را بنویسید