جلسه بیست و چهارم _ نحوه راه اندازی واحد Uart و برنامه آن در محیط Keil
در ادامه آموزش راه اندازی واحد سریال (Uart) قصد داریم تا در این مطلب برنامه ای بنویسیم تا بصورت پیوسته رشته ای را به رایانه ارسال نماید و رایانه نیز رشته هایی را به سمت میکرو ما بفرستد و میکرو پس از دریافت این رشته ها آن ها را روی نمایشگر خود نمایش دهد. برای مانیتور کردن اطلاعات ارسال شده به سمت رایانه از نرم افزار Docklight استفاده می کنیم که قبلا این نرم افزار را معرفی نموده ایم. این نرم افزار همچنین قادر است تا رشته های مورد نظر را به سمت میکرو ارسال نماید.
نحوه نصب و کرک کردن نرم افزار DOCKLIGHT به صورت تصویری
در جلسه قبل با استفاده از نرم افزار STM32CubeMX تنظیمات مربوط به سریال را انجام دادیم و کد برنامه را در محیط Keil تولید نمودیم در این جلسه قصد داریم تا به شرح و معرفی کدهای تولید شده توسط نرم افزار STM32CubeMX بپردازیم و پس از آن به دستورات پر کاربرد واحد سریال بپردازیم و پس از آن برنامه را تشریح نماییم. با توجه به اینکه در این پروژه از LCD 2x16 برای نمایش داده های دریافتی استفاده می شود برای راه اندازی آن می توانید به جلسات آموزش LCD2x16 مراجعه نمایید.
در ابتدا به سراغ فایل main.c می رویم.
استراکچر مربوط به تنظیمات واحد Usart1 می باشد.
معرفی تابع تنظیمات و پیکربندی واحد Usart1
تابع مربوط به پیکربندی واحد Usart1 می باشد که در آن پارامترهای تنظیم شده در نرم افزار STM32CubeMX اعمال شده است. در این تابع مواردی همچون Baudrate واحد سریال و طول قالب داده و تعداد Stop bit و فعال بودن قسمت فرستنده یا گیرنده واحد سریال و دیگر موارد تنظیم می شوند.
حال به سراغ توابع کاربردی واحد سریال می رویم:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout
برای ارسال یک رشته از این تابع استفاده می شود. این تابع دارای 4 آرگومان می باشد که آرگومان اول اشاره گر به استراکچر واحد سریال مورد نظر می باشد.
آرگومان دوم، نام رشته مورد نظر برای ارسال است و آرگومان سوم نیز طول رشته مورد نظر برای ارسال را مشخص می کند و در آرگومان چهارم باید زمان Timeout را بر حسب میلی ثانیه مشخص نمود.
(HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size
از این تابع برای ارسال رشته به همراه وقفه و بدون توقف استفاده می شود و دارای سه آرگومان می باشد که اشاره گر به استراکچر واحد سریال مورد نظر و رشته مورد نظر برای ارسال و طول رشته به این تابع ارسال می شود.
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout
از این تابع برای دریافت اطلاعات وارد شده از واحد سریال استفاده می شود که دارای 4 آرگومان می باشد و در آرگومان اول استراکچر مربوط به واحد سریال مورد نظر قرار می گیرد و در آرگومان دوم یک رشته قرار می گیرد تا اطلاعات دریافتی در آن قرار گیرد و در آرگومان سوم طول دیتا دریافتی مشخص می شود و در آرگومان چهارم زمان Timeout بر حسب میلی ثانیه قرار می گیرد.
(HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size
وظیفه این تابع دریافت اطلاعات وارد شده از واحد سریال بدون توقف می باشد با دریافت اطلاعات اینتراپت نیز فعال می شود. این تابع دارای 3 آرگومان می باشد که در آرگومان های این تابع استراکچر تنظیمات واحد سریال مورد نظر، رشته ای برای ذخیره اطلاعات دریافتی و طول داده دریافتی قرار می گیرد.
حال به سراغ توضیح برنامه نوشته شده می رویم:
Uart_Data : متغیر مربوط به ذخیره اطلاعات وارد شده از واحد سریال می باشد.
Backup_Data: متغیر مربوط به ذخیره بایت به بایت اطلاعات دریافتی می باشد.
Len_Counter : طول رشته دریافتی با استفاده از این متغیر مشخص می شود
LCD_Allow_Show : این متغیر در صورتیکه اطلاعات جدیدی از واحد سریال دریافت شود یک می شود و مجوز نمایش اطلاعات دریافتی بر روی نمایشگر با یک شدن این متغیر صادر می شود.
توابع و دستورات مربوط به پیکربندی ال سی دی و نمایش متن بر روی آن در ابتدا اجرای برنامه می باشد. متن های بالا تا زمانیکه داده جدیدی به میکرو از طریق سریال ارسال نشود روی ال سی دی پاک نمی شوند.
با اجرای این خط واحد دریافت داده سریال با فعال شدن وقفه ، فعال می شود.
هر 3 ثانیه یک بار رشته مورد نظر به رایانه ارسال می شود.
درصورتیکه شرط برقرار باشد یا به عبارتی دیگر داده ای به میکرو ارسال شده باشد برنامه وارد شرط می شود و در ابتدا با پاک کردن نمایشگر داده دریافتی از واحد سریال را نمایش می دهد و پس از آن آرایه مربوط به دریافت داده را بصورت کامل پاک می کند و پس از آن مجددا اینتراپت دریافت داده سریال فعال می شود.
با توجه به اینکه ما برای دریافت داده سریال، اینتراپت دریافت را فعال کرده ایم در زمانیکه داده ای دریافت شود روتین مربوط به سریال فعال می شود پس برای خواندن داده ها باید به روتین وقفه سریال مراجعه نماییم که این روتین در فایل stm32f1xx_it وجود دارد پس به سراغ این تابع می رویم تا ادامه برنامه را شرح دهیم.
با فعال شدن وقفه برنامه به این تابع رجوع می کند که در ابتدا کار طول داده دریافتی را با استفاده از دستور huart1.RxXferCount مشخص می نماییم و پس از آن به یک حلقه می رسیم این حلقه به تعداد داده دریافتی ادامه پیدا می کند و داده ها را بصورت بایت به بایت می خواند و در ابتدا در Backup_Data قرار می دهد و پس از آن با توجه به مقدار Len_Counter بایت خوانده شده را در اندیس متناظر آرایه Uart_Data قرار می دهد و پس از خواندن کامل اطلاعات دریافتی متغیر LCD_Allow_Show را یک می کند تا مجوز نمایش اطلاعات دریافتی بر روی ال سی دی صادر شود.
در شکل زیر می توانید نحوه ارسال و دریافت داده ها در محیط نرم افزار Docklight را مشاهده نمایید.
در انتها می توانید شماتیک مربوط به این جلسه و برنامه (keil , STM32CubeMX) آنرا دانلود نمایید.
دلتون شاد و لبتون پرخنده
محمد هادی دشتی
دیگر آموزش ها مرتبط با STM32:
برای مشاهده آموزش جلسه اول(معرفی هسته آرم و میکروکنترلرهای 32 بیتی شرکت ST ) کلیک کنید.
برای مشاهده آموزش جلسه دوم( معرفی نرم افزارهای مورد نیازجهت برنامه نویسی و پروگرام ) کلیک کنید.
برای مشاهده آموزش جلسه سوم( نحوه دانلود آخرین نسخه از نرم افزار STM32CubeMX ) کلیک کنید.
برای مشاهده آموزش جلسه چهارم(نحوه انجام تنظیمات در نرم افزار STM32CubeMX ) کلیک کنید.
برای مشاهده آموزش جلسه پنجم(نحوه برنامه نویسی پروژه چشمک زن با نرم افزار Keil ) کلیک کنید.
برای مشاهده آموزش جلسه هشتم( نحوه راه اندازی ال سی دی کاراکتری-قسمت اول) کلیک کنید.