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

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

آموزش میکروکنترلر 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 بیان می‌کند.

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

 

حمایت از مهدی عبدالهی

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

مهدی عبدالهی
مهدی عبدالهی

کانال میکروالکترونیک @microstm32

دیدگاه ها

3 دیدگاه

  • محمد عزیز
    محمد عزیزپور
    ۳ آبان ۱۳۹۹

    سلام مهندس
    من در برنامه 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

    • Zeus ‌
      zeus
      ۵ خرداد ۱۴۰۰

      سلام دوست عزیز برای فعال کردن c99 در کیل مطابق عکس زیر عمل کنید

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 11 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک