GebraBit

رابط UART

متن سربرگ خود را وارد کنید

chapter 9

رابط UART

  1. خانه
  2. »
  3. میکروکنترلر
  4. »
  5. رابط UART

بررسی

امروزه تعداد بسیار زیادی از پروتکل های ارتباطی سریال و رابط های سخت افزاری در صنعت الکترونیک موجود است. بیشتر آنها بر روی پهنای باند انتقال بالا متمرکز هستند، مانند استانداردهای اخیر USB 2.0 و 3.0، Firewire (IEEE 1394) و غیره. برخی از این استانداردها  قدیمی هستند، اما هنوز هم استفاده از آنها به عنوان پروتکل ارتباطی ویژه بین ماژول ها در یک برد رایج است. یکی از این رابط ها ، رابط  Universal Synchronous/Asynchronous Receiver/Transmitter  است که برای سادگی با نام USART نیز شناخته می شود.

تقریباً هر میکروکنترلر حداقل یک واحد جانبی UART دارد. همه MCU های STM32 حداقل دو رابط UART/USART ارائه می دهند، اما اکثر آنها بیش از دو رابط (برخی تا هشت رابط)  ، با توجه به تعداد I/O پشتیبانی شده توسط پکیج MCU ارائه می دهند.

در این فصل خواهیم دید که چگونه این ابزار جانبی مفید را با استفاده از CubeHAL راه اندازی کنیم. علاوه بر این، نحوه توسعه برنامه‌های کاربردی با استفاده از UART را هم در حالات polling and interrupt  مطالعه می‌کنیم .

Introduction to UARTs and USARTs

 قبل از شروع به تجزیه و تحلیل توابع ارائه شده توسط HAL برای تنظیمات واحد UART/USART ، بهتر است نگاهی کوتاه به رابط UART/USART و پروتکل ارتباطی آن بیندازیم.

هنگامی که می خواهیم بین دو (یا حتی بیشتر) دستگاه، دو دیتا مبادله کنیم، دو گزینه داریم: می توانیم دیتا را به صورت موازی ارسال کنیم، یعنی استفاده از تعداد معینی از خطوط ارتباطی برابر با اندازه هر Word داده (به عنوان مثال، هشت خط مستقل برای یک داده Word که از 8 بیت تشکیل شده است) ، یا می توانیم هر بیتی که داده Word را تشکیل می دهد، یک به یک انتقال دهیم. UART/USART واحدی است که دنباله‌ای موازی از بیت‌ها (معمولاً در یک بایت گروه‌بندی شده‌اند) را در یک جریان پیوسته از سیگنال‌هایی که روی یک سیم واحد جاری هستند را، ترجمه می‌کند.

هنگامی که اطلاعات ، بین دو دستگاه در داخل یک کانال مشترک جریان می یابد، هر دو دستگاه (در اینجا، برای سادگی،  آنها را به عنوان فرستنده و گیرنده نام میبریم) باید در مورد مدت زمانی که طول می کشد تا هر بیت جداگانه ارسال شود، به توافق برسند. در یک synchonous transmission  ، فرستنده و گیرنده یک کلاک مشترک تولید شده توسط یکی از دو دستگاه (معمولاً دستگاهی که به عنوان Master این اتصال عمل می کند) را به اشتراک می گذارند.

در شکل 1، یک دیاگرام زمان‌بندی معمولی داریم .  در این دیاگرام دستگاه A را نشان می‌دهد که یک بایت (0b01101001) را با استفاده از یک کلاک مرجع مشترک به‌صورت سریال به دستگاه B ارسال می‌کند. کلاک مشترک همچنین برای توافق در مورد زمان شروع نمونه برداری از دنباله بیت ها استفاده می شود: وقتی دستگاه Master شروع به کلاک کردن خط اختصاصی می کند، یعنی قرار است دنباله ای از بیت ها را ارسال کند.

در یک synchonous transmission  ، سرعت و مدت زمان انتقال توسط کلاک تعریف می شود: فرکانس آن تعیین می کند که ما با چه سرعتی می توانیم یک بایت را در کانال ارتباطی انتقال دهیم. اما اگر هر دو دستگاه درگیر در انتقال داده در مورد مدت زمان لازم برای انتقال یک بیت و زمان شروع و پایان نمونه‌برداری از بیت‌های ارسال شده توافق داشته باشند، می‌توانیم استفاده از فقط یک خط کلاک اختصاصی  اجتناب کنیم. در این حالت ما یک انتقال asynchonous transmission  داریم.

شکل 2 دیاگرام زمان بندی یک انتقال ناهمزمان را نشان می دهد. حالت بیکار idle state (یعنی هیچ انتقالی انجام نمی شود) با سیگنال HIGH نشان داده می شود. انتقال با یک بیت START آغاز شده که با سطح سیگنال Low نشان داده می شود. لبه منفی توسط گیرنده تشخیص داده شده  و پس از دوره 1.5 بیتی (در شکل 1s T1:5bit نشان داده شده است)، نمونه برداری از بیت ها آغاز می شود. هشت بیت داده نمونه برداری شده است. معمولاً بیت کم اهمیت (LSB) ابتدا ارسال می شود. سپس یک بیت برابری parity اختیاری (برای بررسی خطای بیت های داده) ارسال می شود. اگر کانال انتقال بدون نویز فرض شود یا اگر خطای بررسی بالاتری در لایه های پروتکل وجود داشته باشد، اغلب این بیت حذف می شود. انتقال با یک بیت STOP که 1.5 بیت طول می کشد به پایان می رسد.

UART Initialization

مانند همه واحدهای جانبی STM32، USARTs نیز در ناحیه واحدهای جانبی حافظه ، که از x4000 0000 شروع می‌شود قرار میگیرد . به عنوان مثال، می توانیم به سادگی از ماکرو USART2 برای اشاره به دومین واحد جانبی USART که توسط میکروکنترلرهای STM32 پکیج LQFP64 ارائه شده است، استفاده کنیم.

با این حال، تمام توابع HAL مربوط به مدیریت UART طوری طراحی شده اند که به عنوان پارامتر اول نمونه ای از ساختار UART_HandleTypeDef را که به شکل زیر تعریف شده است ، بپذیرند:

typedef struct

}

USART_TypeDef *Instance; /* UART registers base address */

UART_InitTypeDef       Init; /* UART communication parameters */

UART_AdvFeatureInitTypeDef AdvancedInit; /* UART Advanced Features              initialization parameters */

uint8_t *pTxBuffPtr;    /* Pointer to UART Tx transfer Buffer */

uint16_t TxXferSize;   /* UART Tx Transfer size */

uint16_t TxXferCount; /* UART Tx Transfer Counter */

uint8_t *pRxBuffPtr;    /* Pointer to UART Rx transfer Buffer */

uint16_t RxXferSize;   /* UART Rx Transfer size */

uint16_t RxXferCount; /* UART Rx Transfer Counter */

DMA_HandleTypeDef *hdmatx; /* UART Tx DMA Handle parameters */

DMA_HandleTypeDef *hdmarx; /* UART Rx DMA Handle parameters */

HAL_LockTypeDef Lock; /* Locking object */

__IO HAL_UART_StateTypeDef State; /* UART communication state */

__IO HAL_UART_ErrorTypeDef ErrorCode; /* UART Error code */

{UART_HandleTypeDef;

  • Instance: این پارامتر اشاره گر به توصیف کننده USART ایست که قرار است از آن استفاده کنیم. برای مثال، USART2 توصیفگر UART مرتبط با رابط ST-LINK در برد Nucleo است.
  • Init: نمونه ای از ساختار UART_InitTypeDef که برای پیکربندی رابط UART استفاده می شود.
  • AdvancedInit: این فیلد برای پیکربندی ویژگی های پیشرفته تر UART مانند تشخیص خودکار BaudRate و تعویض پین TX/RX استفاده می شود. برخی از کتابخانه های HAL این فیلد اضافی را ارائه نمی دهند. زیرا رابط های USART در همه MCU های STM32 برابر نیستند. این مورد موضوع مهمی است که باید هنگام انتخاب میکروکنترلر مناسب برای برنامه خود در نظر داشته باشید.
  • pTxBuffPtr و pRxBuffPtr: این فیلدها به ترتیب به بافر ارسال و دریافت اشاره می کنند. آنها به عنوان منبع انتقال بایت های TxXferSize بر روی UART و برای دریافت RxXferSize زمانی که UART در حالت Full Duplex پیکربندی شده است استفاده می شوند. فیلدهای TxXferCount و RxXferCount به صورت داخلی توسط HAL برای شمارش بایت‌های ارسالی و دریافتی استفاده می‌شوند.
  • LOCK: این فیلد به صورت داخلی توسط HAL برای قفل کردن دسترسی های همزمان به رابط های UART استفاده می شود.

همانطور که در بالا گفته شد، تقریبا  فیلد Lock برای کنترل دسترسی های همزمان در تمام روتین های HAL استفاده می شود. اگر نگاهی به کد HAL بیندازید، می توانید چندین کاربرد ماکرو __HAL_LOCK() را مشاهده کنید که به این صورت گسترش یافته است:

این مقاله را با دوستانتان به اشتراک بگذارید!

Be the first to write a review

لطفا با ارسال دیدگاه و امتیاز دهی تیم جبرا را در بهبود کیفیت همیاری کنید

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

Shopping cart
Start typing to see posts you are looking for.

Sign in

No account yet?