برد STM سخت افزار

آموزش میکروکنترلرهای STM32 بخش سوم ارسال اطلاعات با ارتباط USART

نوشته شده توسط علی زاهدی

پیش از این دو قسمت از مجموعه آموزش های میکروکنترلر STM32 منتشر شده است. که با کلیک بر روی این لینک می‌توانید لیست آموزش‌ها را مشاهده نمایید. پیشنهاد میکنم در صورتی که آموزش‌های قبلی را مطالعه نکرده‌اید. ابتدا قسمت های قبلی این مجموعه آموزشی را مطالعه کرده و سپس مطالعه ی این آموزش را ادامه دهید. در این پست قصد داریم تا نحوه ارسال اطلاعات از طریق ارتباط USART یا همان ارتباط سریال (USART) میکروکنترلرهای STM32 را آموزش دهیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 


ارتباط سریال USART


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

ارتباط Parallel میکروکنترلرها - دیجی اسپارکارتباط Serial یا UART میکروکنترلرها - دیجی اسپارک

 


ارتباط USART در میکروکنترلرها


تعداد پایه بیشتر در میکروکنترلرها اغلب افزایش قیمت میکروکنترلر را به همراه دارد. ارتباط سریال به ما کمک می‌کند تا برای رفع نیاز پروژه از تعداد پایه های کمتری استفاده کنیم. برخی از باس های سریال که در میکروکنترلرها مورد استفاده قرار می‌گیرند، عبارتند از SPI, I2C, Dc-bus, UIN/O, and 1 _WIRE و USART. واژه سریال اغلب به پورت RS232 کامپیوترهای اصلی IBM اشاره داشت. و اغلب به عنوان پورت سریال از آن نامبرده می‌شد. و کابل‌های سریال برای اتصال به این پورت استفاده می‌شد. و بسیاری از دستگاها برای انطباق داشتن با آن طراحی شد.

تفاوت ارتباط Serial & Parallel در میکروکنترلرها - دیجی اسپارک

 


اتصالات برد STM32


برد میکروکنترلر STM32 یا همان Bluepill برای پروگرام کردن به مبدل نیاز دارد. در این آموزش با استفاده از یک مبدل USB to TTL میکروکنترلر STM32 را به کامپیوتر متصل می‌کنیم. همانطور که در تصویر مشاهده می‌کنید. پایه RX مبدل USB to TTL به پایه شماره ۹ میکروکنترلر متصل شده است. و پایه TX مبدل به پایه شماره ۱۰ میکروکنترلر متصل شده است.

اتصالات برد کنترل STM32 با مبدل usb to ttl - دیجی اسپارک

 


پیکربندی درگاه ارتباط USART


در صورتی که آشنایی کافی با میکروکنترلرهای ARM را ندارید. و یا نحوه ساخت پروژه جدید در نرم افزار STM32CubeMX را نمی‌دانید. به ترتیب آموزش های معرفی انواع میکروکنترلرهای STM32 و آموزش میکروکنترلرهای STM32 بخش اول شناخت GPIO راه اندازی نرم افزاری و آموزش میکروکنترلرهای STM32 بخش دوم آشنایی با وقفه خارجی EXTI که قسمت های قبلی این آموزش هستند را مطالعه کنید.

پس از انتخاب میکروکنترلر مورد نظر در نرم افزار STM32CubeMX ابتدا مطابق آموزش قبل قسمت های SYS و RCC را تنظیم نمایید. بایستی از منو سپت چپ در قسمت A->Z بر روی گزینه USART1 کلیک کنید. و گزینه Mode را بر روی Asynchronous سپس در قسمت Parameter Setting می‌توانید تنظیماتی از جمله تنظیم Baud Rate ، Parity و … را انجام دهید. در این آموزش تنها بخش Baud Rate را بر روی مقدار ۹۶۰۰ تنظیم می‌کنیم. پس از آن همانند تصویر زیر مشاهده می‌کنید که پایه‌ PA10 بعنوان RX و پایه PA9 بعنوان TX تعریف شده است. در ادامه مشاهده می‌کنید که با اتصال مبدل USB to TTL به این پایه ها میتوان انواع دیتا های مختلف را به سمت کامپیوتر ارسال نمود.

فعال کردن USART در نرم‌افزار STM32CubeMX

 

سپس به صفحه Clock Configuration رفته و قسمت HCLK را به ۷۲ مگاهرتز تغییر دهید.

تنظیمات فرکانس میکروکنترلر STM32

سپس بایستی به صفحه Project Manager رفته و مطابق آموزش های قبلی این قسمت را نیز تنظیم نمایید. سپس پس از انجام کامل تنظیمات بر روی گزینه GENERATE CODE کلیک کنید تا پروژه ساخته شود. بر روی پس از ورود به نرم افزار KEIL فایل main.c را باز کنید. در ادامه توابع HAL مربوط به این بخش را با استفاده از مثال بصورت کامل توضیح خواهیم داد.

 


کد نویسی پروژه STM32


برای ارسال دیتا از طریق ارتباط USART در توابع HAL تنها تابع زیر موجود است. همانطور که در کد زیر مشاهده می‌کنید. این تابع دارای ۴ ورودی است که در ادامه هر ورودی به صورت جداگانه توضیح داده شده است.

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

UART_HandleTypeDef *huart: این ورودی برای مشخص کردن USART فعال شده می‌باشد. در این آموزش از USART1 استفاده شده است. به همین دلیل عبارت huart1& جایگزین این قسمت خواهد شد.

uint8_t *pData: این ورودی برای نوشتن دیتای مورد نظر برای ارسال است. در این قسمت می‌توانید رشته ی ارسالی خود را با استفاده از double quotation همانند “Digispark.ir” بنویسید.

uint16_t Size: در این ورودی باید طول رشته ارسالی که در ورودی قبلی نوشته شده است قرار گیرد. برای مثال طول رشته “DigiSpark.ir” برابر ۱۲ است.

uint32_t Timeout: این ورودی حداکثر زمان برای ارسال با USART است.

برای درک بهتر موارد بالا دستور زیر را داخل تابع main کپی کرده و برنامه رو بر روی ای‌سی پروگرام کنید. سپس همانند سپس داخل ترمینال در این مثال عبارت DigiSpark.ir به همراه کاراکتر Enter با مدت زمان ۱۰۰ میلی ثانیه ارسال می‌شود.

HAL_UART_Transmit(&huart1,(uint8_t *) "DigiSpark.ir\r\n",14,100);

برای ارسال دیتا با استفاده از دستور بالا روش بایستی برای هر بار ارسال تعداد کاراکتر های مورد رشته ی ارسالی به صورت دستی شمرده شود. برای رفع این مشکل بهتر است یک تابعی تعریف شود تا رشته ی مورد نظر را دریافت کرده و خود تابع طول رشته را بررسی کند و عدد بدست آمده را در قسمت طول رشته جایگزین کند. تابع زیر مشخصات گفته شده را دارد.

void Send(char*data)
{
   HAL_UART_Transmit(&huart1,(uint8_t*)data,strlen(data),100);	
}

برای استفاده از تابع بالا ابتدا بایستی کتابخانه string.h را به برنامه خود اضافه نمایید. پس از آن تابع بالا را قبل از main کپی کنید. و سپس داخل تابع main با فراخوانی تابع و نوشتن رشته مورد نظر خود در قسمت ورودی تابع بنویسید.

 


دستور printf


برای ارسال دیتا از طریق ارتباط USART در میکروکنترلر های Stm32 راه دیگری نیز وجود دارد که آن استفاده از دستور printf موجود در کتابخانه stdio.h است. اما در پیکربندی میکروکنترلرهای Stm32 تعریف نشده است که پس فراخوانی دستور printf دیتا از طریق کدام یک از USARTهای میکروکنترلر ارسال شود. برای این که موقع فراخوانی دستور printf خظایی دریافت نکنید. بایستی کد زیر را به برنامه خود در یکی از قسمت های مشخص شده قبل از تابع main اضافه کنید.

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif 
PUTCHAR_PROTOTYPE
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  return ch;
}

پس از اضافه نمودن کد بالا به برنامه خود میتوانید با استفاده از دستور printf بدون هیچ دردسری دیتای مورد نظر خود را به سمت کامپیوتر ارسال نمایید.

نحوه پروگرام کردن برنامه بر روی میکروکنترلر در قسمت قبلی آموزش توضیح داده شده است. در صورتی که با نحوه پروگرام کردن میکروکنترلر های Stm32 آشنا نیستید. لطفا بخش اول این آموزش را مطالعه نمایید.

 


لوازم مورد نیاز


 

چنانچه در مراحل راه اندازی میکروکنترلرهای stm32 با مشکل مواجه شدید. بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 


پروژه و دریافت بن ارسال رایگان


برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های #دیجی_اسپارک ،  #دانشجوکیت ،  digispark#  و  daneshjookit# منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

دانسته هایتان را مانند یک ساعت مچی در دست کنید، نه صرفا به این خاطر که نشان دهید آن را دارید. بلکه به این خاطر که اگر کسی از شما ساعت را پرسید، برایش بگویید.
لرد چسترفیلد

تبادل نظر و رفع عیب با ثبت دیدگاه

۷ دیدگاه

  • سلام
    من دیتایی رو که میفرستم نمی تونم با هرکولس تو کامپیوتر ببینم با اینکه تو اسلیسکوپ نشونش میده

      • سلام وقتتون بخیر
        من میخواهم از طریق پنجره ارسال داده در کامپیوتر یک عددی رو برای میکرو بفرستم و سپس میکرو عدد رو چک کنه اگر کوچکتر از پنج بود عدد سه رو بفرسته واکر بزرگتر از پنج بود خود عدد پنج رو روی کامپیوتر ارسال کنه. ابتدا عدد ارسال شده توسط کامپیوتر رو توسط تابع hal_recive دریافت میکنم سپس توسط تابعatoi به عدد صحیح تبدیل میکنم و بعد با عدد پنج مقایسه میکنم و شرایط رو چک میکنم و اگر بزرگتر از پنج بود سه رو بفرست و اگر کوچکتر بود پنج رو بفرست. ولی میکرو همواره عدد سه رو می‌فرسته. هیچ وقت وارد else نمیشه. خودم احساس میکنم تبدیل اسکی به عدد صحیح درست انجام نمیشه. ممنون میشم علتشو بفرمایید

        • با سلام
          زمانی که عدد را به میکرو کنترلر ارسال میکند، با دستور ارسال عدد دریافتی را مجددا به سمت کامپیوتر ارسال کنید. و چک کنید، چه عددی توسط میکروکنترلر دریافت شده، اگر عدد همان عددی بود که ارسال کرده بودید، مشکل در قسمت شرط خواهد بود و باید آن قسمت بررسی شود.

  • سلام.ممنونم از راهنمایتون.
    من نمیتونم با این تابع اعداد رو ارسال کنم چطور میتونم مثلا یک عدد اعشاری رو بفرستم یا یک عدد صحیح.