اتصال STM32 به کامپیوتر با پورت سریال (بخش تکمیلی راه اندازی پروتکل سریال STM32)

با سلام

در ادامه آموزش های میکرو STM32 در این قسمت (اتصال STM32 به کامپیوتر) به تکمیل بخش راه اندازی پروتکل سریال بخش مقدماتی( STM32 UART ) میپردازم. امیدوارم که پست قبل رو مطالعه کرده باشید تا درک بهتری از برنامه نویسی میکرو های STM و کتابخانه HAL داشته باشید.

در این بخش دیگه توضیح آنچنانی نداریم و سعی میکنم که پروژه را تکمیل کنم.

اتصال STM32 به کامپیوتر

اینکه شما چه جوری میکرو رو به کامیپوتر وصل کنید بستگی به خودتون داره میتونید از ارتباط rs232 استفاده کنید یا Wifi یا بلوتوث  یا TTL به USB  که من از آخری استفاده میکنم .

برای استفاده از ارتباط TTL به USB شما نیاز به ماژول هایی از این نوع دارید . انواع ماژول هایی که در بازار هستند عبارتند از : PL2303 , CP1202 و … .

من از PL2303 استفاده میکنم و نحوه نصب درایور اون رو هم به عهده خودتون میگذارم . اما اگر از ویندوز 10 استفاده میکنید.  این ماژول یک مشکلی داره که من در انتها یک لینک قرار میدم که راهکار رفع این مشکل رو نشون داده.

تصویر PL2303 و نحوه قرارگیری پایه ها

تصویر PL2303 و نحوه قرارگیری پایه ها

برای اتصال این میکرو به ماژول باید RX میکرو به TX ماژول و TX میکرو به RX ماژول وصل بشه.

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

دانلود نرم افزار Tera Term ( ترمینال پورت سریال )

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

مطلب پیشنهادی:  راه اندازی I2C در STM32

اگر همه ابزار رو آماده کرده باشید , نوشتن برنامه باقی میمونه.

ارسال اطلاعات

توی این پروژه اول ارسال رو بررسی میکنیم یعنی وقتی کلید زده شد یک Hello Wrold توی صفحه ترمینال کامپیوتر میبینید.

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

اگر شما هم پروژه رو با من در بخش قبلی ساخته باشید میبینید که هنوز ۴ خط دستوراتی که برای  LED چشمک زن داشتیم , هستن چون ما اون ها رو بین /* USER CODE BEGIN 3 */ و /* USER CODE END 3 */ نوشتیم و این باعث شد که CubeMX با اونها کاری نداشته باشه.

من اونها رو پاک میکنم چون فعلا نیازی به آنها ندارم.

اگر فایل  stm32fxxx_hal_uart.c رو باز کنید میبینید که توابع خیلی زیادی در اون قرار داره ولی ما قرار نیست از همه اونها استفاده کنیم و فقط ۲ تابع هست که برای ارسال و دریافت عادی استفاده میکنم. !

من اون توابع رو اینجا میذارم و یک توضیح خیلی کوچیکی بهتون میدم.

(HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size

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

این نکته مهم هست که ارتباط uart در هر ارسال یک بایت یا یک کاراکتر دریافت میکنه .(کاراکتر = یک بایت )

پس شما اگر میخواهید تعداد نامعلومی اطلاعات دریاف کنید size رو مساوی ۱ قرار بدید

مطلب پیشنهادی:  نرم افزار ARMwizard

(HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size

این تابع مانند تابع قبل است با این تفاوت که وقتی تعداد ارسال  به Size رسید اینتراپت میده!

کدها

خوب برای اینکه بتونیم یک کلمه کامل رو ارسال کنیم باید دونه دونه حروف رو به این تابع بدیم پس میایم و این تابع رو مینویسیم

برای خواند پایه ورودی که کلید بهش وصل شده هم از تابع زیر استفاده میکنیم

(HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin

خوب پس کدمون اینجوری میشه

کد خیلی ساده هست فقط اون while برای اینه که دستمون اگر روی کلید موند فقط یکبار Hello World رو بفرسته.

یک نکته جالب اگر در قسمت قبل هم با من همراه بودید دیدید که من اسم پایه ای که کلید بهش وصل هست رو Button گذاشتم و الان هم میبیند که من از Button به جای اسم پایه استفاده میکنم! این اتفاق خیلی ساده و در فایل main.h میوفته و این اسم ها به جای هم define شدند!

شما برای اینکه کتابخانه های مختلف  رو استفاده کنید باید اون کتابخانه رو با میکرو خودتون پورت کنید! در اصل به اینکار میگن پورت کردن .

ما توی ارسال نیازی به اینتراپت نداشتیم هر چند از تابعی استفاده کردیم که در اتمام کارش به ما اینتراپت میده!

اینم تنیجه مرحله اینتراپت

به تنظیمات برنامه ترمینال دقت کنید

دریافت اطلاعات

قدم بعدی میخوام  اگر از ترمینال کامپیوتر کلمه LED ارسال شد LED روی برد toggle بشه.

اینجا فقط یک بار قبل از while تابع دریافت رو صدا میزنم و بهش تعداد دریافت و آدرس بافر رو میدم و بقیه اتفاق ها توی تابع callback اینتراپت میوفته .

من اینجا دیگه عکسی از اتفاق های غیر از اینتراپت نمیگذارم ولی در آخر فایل main.c برنامه رو میذارم تا شما همه چیز رو خودتون ببینید.

مطلب پیشنهادی:  آموزش اتصال سروو موتور به STM32

 

تابع RxCpltCallback تابعی است که بعد از پایان همه دستورات اینتراپت از جمله فعال کردن دوباره اینتراپت و … توسط خود HAL صدا زده میشه تا User کد های خودش رو اونجا وارد کند.

این تابع یک بار در stm32fxxx_hal_uart.c تعریف شده است.

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

در تابعی که من تعریف کردم میبینید که ابتدا اطلاعات گرفته شده توسط تابع ‌Buffercmp با LED مقایسه میشوند و اگر شرط برقرار بود led روشن یا خاموش میشود

در نهایت دوباره باید تابع Receive صدا زده شود .

دانلوا سورس کد

نکته های پایانی

در پایان چند نکته لازمه تا گفته بشه

۱- این برنامه باگ هایی داره.  توی این برنامه شما باید LED رو بفرستید. و اگر چیز دیگه ای رو بفرستید شاید دیگه دریافت شما کار نکنه که اونم امیدوارم خودتون حلش کنید چون کار سختی نیست.

۲- بابت اینکه نتونستم فیلمی مبنی بر درست بودن دریافت بزارم عذر خوهی میکنم ولی مطمئن باشید که کار میکنه!

لینک ها

PL2303 در ویندوز ۱۰

راه اندازی ماژول esp8266

راه اندازی واحد usart میکروکنترلر های PIC

امیدوارم این قسمت هم تونسته باشه توی یادگیری میکرو های STM بهتون کمک کنه

اگر هر گونه سوال یا پیشنهادی داشتید میتونید توی نظرات ارسال کنید

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    

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

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

5 دیدگاه

  1. سید امیر حسین مشتاقیون

    سلام فایل main کار نمیکنه لطفا اصلاح کنید با تشکر

  2. hamed2018

    سلام فایل main کجاست. پس چرا هر چی رو لینکش میزنم باز نمیشه.

  3. سلام.
    فایل main رو قرار بدید لطفا…