سلام دوستان. سیسوگ در مقاله ششم آموزش میکروکنترلر 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 مورد بررسی قرار دهیم، اولین فرمانی که تصمیم داریم بررسی کنیم فرمان ارسال یک رشته به رابط سریال است.
1 | (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 مراجعه میکنیم. در عکس زیر میتوانید قسمتهایی از بدنه این تابع را ببینید. همانطور که در عکس مشاهده میکنید، ابتدا بررسی میشود که آیا رابط سریال برای ارسال آماده است یا خیر. که اگر اینگونه نباشد متن تابع اجرا نمیشود. در کدهای زیر مشخص گردیده که بعد برقراری شرط آزاد بودن رابط سریال برای ارسال در خط 662 رابط سریال به حالت مشغولی ارسال یعنی 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 بیان میکند.
با سیسوگ همراه باشید.
سلام مهندس
من در برنامه keil طبق متن فوق کدی که برنامه بطور پیشفرض در برگه stm32f1xx_hal_uart.h > HAL_UART_Transmit هست رو کپی کردم و متغیرها رو نامگذاری کردم اما توابع lock ، unlock و UART_WaitOnFlagUntilTimeout رو خطا میگیره که تو c99 مجاز نیست.
چه باید کرد؟ با تشکر از سایت خوبتون
اینم مشخصات برنامه KEIL من :
IDE-Version:
µVision V5.15
Copyright (C) 2015 ARM Ltd and ARM Germany GmbH. All rights reserved.
License Information:
m aziz
bp
LIC=32BRA-1F5EG-8FWIE-57QXP-60JQI-WGN5U
Tool Version Numbers:
Toolchain: MDK-ARM Standard Version: 5.15.0
Toolchain Path: C:\Keil_v5\ARM\ARMCC\Bin
C Compiler: Armcc.exe V5.05 update 2 (build 169)
Assembler: Armasm.exe V5.05 update 2 (build 169)
Linker/Locator: ArmLink.exe V5.05 update 2 (build 169)
Library Manager: ArmAr.exe V5.05 update 2 (build 169)
Hex Converter: FromElf.exe V5.05 update 2 (build 169)
CPU DLL: SARMCM3.DLL V5.15.0
Dialog DLL: DCM.DLL V1.13.2.0
Target DLL: STLink\ST-LINKIII-KEIL_SWO.dll V2.0.15.0_KEIL
Dialog DLL: TCM.DLL V1.14.5.0
سلام دوست عزیز برای فعال کردن c99 در کیل مطابق عکس زیر عمل کنید