در قسمت پیشین از سری آموزش STM32 با توابع HAL، در مورد وقفهها صحبت شد. در این قسمت، با واحد USART و نحوه ارسال اطلاعات بهوسیله آن، آشنا میشویم. با سیسوگ همراه باشید.
هر دستگاه الکترونیکی برای ارتباط و تبادل داده با دستگاههای دیگر، نیاز به یک یا چند واحد و پروتکل ارتباطی دارد. ارتباطهای موجود، به انواع مختلفی دستهبندی میشوند که یکی از این دستهبندیها، ارتباط سریال و یا موازی است. USART یا UART، یکی از پراستفادهترین ارتباطهای سریال است که در این بخش میخواهیم به بررسی آن بپردازیم. ابتدا با جزییات و نحوه انتقال اطلاعات توسط آن آشنا میشویم. سپس یک پروژه ساده تعریف میکنیم و از این واحد برای انتقال اطلاعات و نمایش آن در پورت سریال استفاده خواهیم کرد.
معرفی ارتباط USART
Universal Asyncronous Receiver/Transmitter یا بهاختصار، UART یک مدار یا ماژول سختافزاری برای ارتباط سریال بهصورت دو طرفه و full-duplex است. این سختافزار در میکروکنترلرها و همچنین بهصورت IC جداگانه وجود دارد. این ماژول ارتباطی به دو صورت آسنکرون و سنکرون/آسنکرون وجود دارد؛
- UART – Universal Asynchronous Receiver/Transmitter
- USART – Universal Synchronous/Asynchronous Receiver/Transmitter
سنکرون یا آسنکرون بودن ارتباط، به معنی همزمان بودن یا نبودن تبادل داده با سیگنال کلاک است. به این صورت که در ارتباط سنکرون، فرستنده یک سیگنال کلاک را نیز همراه اطلاعات ارسال میکند و گیرنده با دریافت این سیگنال کلاک، نرخ اطلاعات دریافی را متوجه میشود. در مقابل در ارتباط آسنکرون، سیگنال کلاک ارسال نمیشود، پس هر دو سمت ارتباط باید از یک نرخ مشخص و برابر استفاده کنند. به این نرخ، baud rate گفته میشود.
واحد USART در STM32
گفتیم که USART یک ارتباط سریال دو طرفه و full-duplex است. به این معنی خط دریافت و ارسال اطلاعات از هم جدا هستند و میتوان در صورت نیز هر دو عمل را باهم انجام داد. علاوه بر این، این ارتباط از بازهی وسیعی از baud rate ها پشتیبانی میکند. در میکروهای STM32، واحد USART از ویژگیهایی نظیر ارتباط یکطرفه سنکرون، ارتباط یک سیمه half-duplex، ارتباط LIN (local interconnection network)، پروتکل کارت هوشمند (Smartcard)، IrDA (infrared data association) و SIR ENDEC و همچنین عملیات modem (CTS/RTS)، پشتیبانی میکند. علاوه بر اینها، امکان ارتباط multiprocessor و همچنین ارتباط پرسرعت بهوسیله DMA و تنظیمات multi-buffer، وجود دارد.
مشخصات و ویژگیهای اصلی USART در STM32:
- Full duplex, asynchronous communications
- Fractional baud rate generator systems – A common programmable transmit and receive baud rates up to 4.5 MBits/s
- Parity control
- Programmable data word length (8 or 9 bits)
- Configurable stop bits – support for 1 or 2 stop bits
- LIN Master Synchronous Break send capability and LIN slave break detection capability
- Transmitter clock output for synchronous transmission
- IrDA SIR Encoder-Decoder – Support for 3/16 bit duration for normal mode
- Smartcard Emulation Capability
- Single-wire half-duplex communication
- Configurable multi-buffer communication using DMA (direct memory access) – Buffering of received/transmitted bytes in reserved SRAM using centralized DMA
- Separate enable bits for Transmitter and Receiver
- Transfer detection flags: (Receive buffer full – Transmit buffer empty – End of Transmission flags)
- 4 error detection flags: (Overrun error – Noise error – Frame error – Parity error)
- 10 interrupt sources with flags
نحوه عملکرد USART
در این بخش جزییات سختافزاری و چگونگی عملکرد واحد USART را بررسی میکنیم. در هر ارتباط USART دو طرفه و full-duplex، به حداقل دو پایه یا سیم (بهجز سیم کلاک در حالت سنکرون) نیاز است؛ یک سیم برای دریافت اطلاعات (RX) و یک سیم برای ارسال اطلاعات (TX). در حالت عادی USART، توسط این دو پین، اطلاعات بهصورت سریال، ارسال و دریافت میشوند. درصورتیکه ارتباط بهصورت سنکرون باشد، یک پایه یا سیم CK نیز نیاز است. همچنین در حالت کاری Hardware flow control، دو پایه دیگر یعنی CTS و RTS موردنیاز هستند.
بلاک دیاگرام USART
در شکل زیر، بلاک دیاگرام سختافزار USART نشان دادهشده است. در این شکل مشاهده میکنیم که دو شیف رجیستر مستقل، یکی برای ارسال و یکی برای دریافت اطلاعات وجود دارد. هر دو شیفت رجیستر عملیات انتقال داده را با نرخی برابر با buad rate انتخابشده انجام میدهند. کلاک این انتقال (که تنظیمکننده baud rate است) توسط مدار BRG (Baud Rate Generator) تولید میشود.
پکت دیتای USART
هر کلمه ارسالی یا دریافتی توسط واحد USART، بسته به مقدار بیت M (در رجیستر USART_CR1)، میتواند 8 یا 9 بیت باشد. همانطور که گفته شد، عملیات ارسال و دریافت اطلاعات، بهوسیله یک واحد Baud Rate Generator کنترل میشود و کلاک فرستنده و گیرنده زمانی تولید میشود که بیت enable آنها فعال باشد. در هر پکت یا کلمه ارسالی روی پین TX، بیت شروع یا start صفر و بیت پایانی یا stop، یک است.
درصورتیکه یک پکت اطلاعات بعد از بیت شروع، تماماً از بیتهای یک تشکیلشده باشد، این فریم داده، کاراکتر Idle نامیده میشود. و درصورتیکه تمامی بیتهای پکت، بهجز یک یا دو بیت stop، صفر باشند، به این فریم، کاراکتر Break میگویند.
در شکل زیر یک پکت نمونه USART نشان دادهشده است:
فرستنده USART
فرستنده USART قابلیت ارسال پکتهای 8 یا 9 بیتی را دارد. فرایند ارسال اطلاعات بدینصورت است که هنگامیکه بیت فعالسازی ارسال (TE) یک شود، داده موجود در شیف رجیستر ارسال، بیت به بیت بر روی پایه TX، شیفت داده خواهد شد. فرایند شیفت اطلاعات، از کمارزشترین بیت (LSB) داده، صورت میگیرد. همانطور که اشاره شد، در شروع هر کاراکتر یا پکت ارسالی یک start bit و در پایان آن، (بسته به تنظیمات انجامشده) تعدادی بیت stop قرار دارد. تعداد بیتهای stop که توسط USART پشتیبانی میشوند 0.5، 1، 1.5 و 2 هستند.
اعداد 0.5 و 1.5 بین تعداد بیت ممکن برای stop، بدین معنی هستند که مدتزمانی که بعد از فرستادن بیتهای داده، خط ارتباطی در سطح ولتاژ High قرار میگرد، نصف یا 1.5 برابر مدتزمان هر بیت داده است. بهعنوانمثال اگر مدتزمان هر بیت داده 10 میکروثانیه باشد، بیت stop میتواند مدتزمانی برابر با 5 یا 15 میکروثانیه، به خود اختصاص دهد.
در زمان ارسال اطلاعات توسط USART، بیت TE نباید صفر شود. در غیر این صورت ارسال اطلاعات دچار خطا میشود و داده ارسالی خراب خواهد شد. زیرا در صورت صفر شدن بیت TE، سیگنال baud rate متوقف خواهد شد.
زمانی که بیت TE فعال میشود، یک فریم یا کاراکتر idle ارسال میشود.
برای ارسال داده توسط واحد USART مراحل زیر باید طی شوند:
- واحد USART با 1 کردن بیت UE در رجیستر USART_CR1، فعال میشود.
- طول کلمه، با مقدار دادن به بیت M در رجیستر USART_CR1، تنظیم میشود.
- تعداد بیت stop باید در رجیستر USART_CR2 تنظیم شود.
- (در صورت استفاده از ارتباط Multi buffer) DMA بهوسیله تنظیم رجیستر USART_CR3 تنظیم میشود (DMAT).
- baud rate موردنظر برای ارتباط، باید در رجیستر USART_BRR تنظیم شود.
- با یک کردن بیت TE در رجیستر USART_CR1، یک فریم idle بهعنوان اولین کلمه ارسالی، فرستاده خواهد شد.
- اطلاعات موردنظر برای ارسال باید در رجیستر USART_DR نوشته شوند (این عمل موجب صفر شدن بیت TXE خواهد شد). درصورتیکه تنها از یک بافر استفاده میشود، این مرحله برای هر داده تکرار خواهد شد.
- بعد از نوشتن آخرین داده در رجیستر USART_DR، مدتزمانی طول میکشد تا TC برابر با 1 شود. که این اتفاق نشاندهنده اتمام ارسال آخرین فریم از اطلاعات است. پس درصورتیکه بخواهیم واحد USART را بعد از انتقال اطلاعات (و بهقصد جلوگیری از خراب شدن آخرین انتقال) متوقف کنیم، باید 1 شدن TC چک شود.
نکات تکمیلی
زمانی که یک ارسال در حال انجام باشد، قرار دادن دستور write در رجیستر USART_DR، باعث میشود که داده در رجیستر TDR ذخیره شود و پس از پایان عملیات ارسال فعلی، محتوای رجیستر TDR در شیفت رجیستر کپی خواهد شد.
همچنین زمانی که ارسالی در جریان نباشد، دستور write باعث میشود که داده مستقیماً در شیفت رجیستر قرار بگیرد، ارسال اطلاعات آغاز شود و بیت TXE بلافاصله برابر با 1 قرار بگیرد. بعد از ارسال یک فریم، درصورتیکه بیت TXE یک باشد، بیت TC نیز یک خواهد شد. درصورتیکه بیت TCIE در رجیستر USART_CR1، فعال باشد، در زمان تکمیل شدن انتقال و یک شدن TC، یک وقفه تولید میشود. همانطور که پیشتر اشاره شد، بعد از نوشتن آخرین داده در رجیستر USART_DR، الزامی است که قبل از غیرفعال کردن USART یا low-power کردن میکروکنترلر، تا زمان 1 شدن بیت TC صبر کنیم.
فرآیند نرمافزاری پاک کردن (صفر کردن) بیت TC عبارت است از:
- خواندن رجیستر USART_SR.
- نوشتن در رجیستر USART_DR.
پاک کردن TC با نوشتن صفر در این بیت نیز امکان پذیر است.
در دیاگرام شکل زیر، فرایند و زمانبندی ارسال اطلاعات توسط فرستنده USART و همچنین تغییرات بیت TC و پرچم TXE، نشان داده شده است.
با توضیحات دادهشده تا اینجای کار، تا حدودی با جزییات سختافزاری و نحوه عملکرد فرستنده USART آشنا شدیم. در ادامه میخواهیم به سراغ توسعه پروژه برویم و بهوسیله واحد USART موجود در میکروکنترلر STM32، اطلاعات دلخواهی را به پورت سریال بفرستیم. اما قبل از آن، قطعه موردنیاز برای این قسمت، یعنی مبدل USB to TTL را معرفی میکنیم.
مبدل USB to TTL
مبدل USB to TTL ماژولی است که امکان اتصال سیگنال TTL (که سیگنالهای خروجی USART را نیز شامل میشود) به رابط USB را فراهم میکند. در شکل زیر تصویر یک نمونه از این بوردها نشان دادهشده است:
پایههای موجود روی این ماژول شامل تغذیه، پایه زمین و پایههای TXD و RXD میشوند. نکتهای که در مورد اتصال این ماژول به میکرو وجود دارد این است که اتصال پایههای TXD و RXD باید با ترتیب وارونه به پایههای با همین نام در سمت USART میکرو متصل شوند. به این معنی که پایه TXD میکرو به RXD ماژول و پایه RXD میکرو به TXD ماژول متصل میشود. پایه دیگری که نیاز به اتصال دارد نیز پایه GND ماژول است که به پایه زمین در میکرو وصل میشود. نیازی به وصل کردن پایههای 3V3 و 5v+ به پایههای میکرو نیست.
ایجاد پروژه
برای ایجاد پروژه این قسمت، بعد از انتخاب یک پروژه جدید، از تب Pinout & Configuration و بخش Connectivity، USART1 را انتخاب میکنیم. سپس باید از قسمت Mode گزینه Asynchronous را انتخاب کنیم. از قسمت Parameter Settings، پارامتر Data Direction را روی حالت Transmit Only تنظیم میکنیم. بقیهی پارامترها ازجمله Buad Rate، طول کلمه و Parity را میتوانیم بدون تغییر رها کنیم.
اکنون میتوانیم پروژه را ایجاد کنیم و به سراغ فایل کد برویم.
نوشتن کد پروژه
در کتابخانه HAL، تابع مورداستفاده برای ارسال داده توسط واحد USART، بهصورت زیر است:
همانطور که توضیحات تابع مشخص است، این تابع چهار پارامتر دارد که پارامتر اول اشارهگر به ساختار حاوی اطلاعات مربوط به تنظیمات ماژول UART، پارامتر دوم اشارهگر به بافر داده، پارامتر سوم طول داده و پارامتر چهارم مدتزمان Timeout است.
اکنون یک بافر برای نگهداری پیام ارسالی تعریف میکنیم:
1 | char message[] = "Connectd!\r\n"; |
حالا میتوانیم با استفاده تابع معرفیشده برای ارسال داده با USART، این پیام را به پورت سریال بفرستیم. برای این منظور کد زیر را در حلقه while(1) مینویسیم:
1 2 3 | /* USER CODE BEGIN 3 */ HAL_UART_Transmit(&huart1, message, sizeof(message), 5); HAL_Delay(500); |
در این کد بعد از هر ارسال داده، 500 میلیثانیه تأخیر ایجاد کردهایم. اکنون از پروژه build میگیریم و کد را روی میکرو دانلود میکنیم. برای نمایش اطلاعات ارسالی باید پورت سریال مربوطه را توسط کامپیوتر بخوانیم. به این منظور نیاز به یک نرمافزار خواندن پورت سریال داریم. نرمافزارهای متعددی برای این کار وجود دارند که از پراستفادهترین آنها، میتوان به Arduino IDE و یا نرمافزار RealTerm اشاره کرد. در اینجا از نرمافزار RealTerm استفاده میکنیم.
پس از نصب نرمافزار و اجرای آن، از تب Port، پورت COM موردنظر، که مبدل TTL to USB به آن متصل شده است را انتخاب میکنیم و همچنین Baud Rate را روی عدد 115200 تنظیم میکنیم. سپس باید روی کلید Change کلیک کنیم. در صورت درست انجام دادن مراحل میبینیم که پیام ارسالی ما نمایش داده میشود:
ترمینال سریال.
در این قسمت از سری آموزش STM32 با توابع HAL، با واحد USART و نحوه ارسال اطلاعات بهوسیله آن، آشنا شدیم. در قسمت بعدی نحوه دریافت اطلاعات بهوسیله USART را بررسی میکنیم. با ما همراه باشید.
سلام مهندس خسته نباشید
اگر من بخوام این پروتکل رو در proteus پیاده سازی کنم از چه آسی به عنوان فرستنده و گیرنده باید استفاده کنم
سلام دوست عزیز
از دو تا میکروکنترلر میتونید استفاده کنید
و تا اونجا که یادم میآد توی پروتئوس یه ترمینال سیمولاتور داشت که دقیقا مثل ترمینال عمل میکرد
استفاده از اون ساده تره
بسیار آموزش خوبی بود. امیدوارم که این آموزش ادامه داشته باشه. ممنون از شما
فوق العاده بود… واقعا ممنون… کاش زودتر ادامه بدین بقیه آموزش ها رو
سلام دوست عزیز، خوشحالم که این آموزش مورد استفاده و توجهاتون قرار گرفته
در آینده قسمتهای بعدی این آموزش هم حتما منتشر میشن.