با سلام
در ادامه آموزش های میکرو STM32 در این قسمت (اتصال STM32 به کامپیوتر) به تکمیل بخش راه اندازی پروتکل سریال بخش مقدماتی( STM32 UART ) میپردازم. امیدوارم که پست قبل رو مطالعه کرده باشید تا درک بهتری از برنامه نویسی میکرو های STM و کتابخانه HAL داشته باشید.
در این بخش دیگه توضیح آنچنانی نداریم و سعی میکنم که پروژه را تکمیل کنم.
اتصال STM32 به کامپیوتر
اینکه شما چه جوری میکرو رو به کامیپوتر وصل کنید بستگی به خودتون داره میتونید از ارتباط rs232 استفاده کنید یا Wifi یا بلوتوث یا TTL به USB که من از آخری استفاده میکنم .
برای استفاده از ارتباط TTL به USB شما نیاز به ماژول هایی از این نوع دارید . انواع ماژول هایی که در بازار هستند عبارتند از : PL2303 , CP1202 و … .
من از PL2303 استفاده میکنم و نحوه نصب درایور اون رو هم به عهده خودتون میگذارم . اما اگر از ویندوز 10 استفاده میکنید. این ماژول یک مشکلی داره که من در انتها یک لینک قرار میدم که راهکار رفع این مشکل رو نشون داده.
تصویر PL2303 و نحوه قرارگیری پایه ها
برای اتصال این میکرو به ماژول باید RX میکرو به TX ماژول و TX میکرو به RX ماژول وصل بشه.
برای دریافت اطالاعات در کامپیوتر هم نرم افزار های مختلفی وجود داره که من از نرم افزار Terminal استفاده میکنم و شما میتونید از هر نرم افزاری که دوست دارید استفاده کنید.
دانلود نرم افزار Tera Term ( ترمینال پورت سریال )
دلیل اینکه من توضیح زیادی در مورد نحوه برقراری ارتباط نمیدم آموزش های زیادی هست که در همین سایت و توی نت وجود داره و حالا به هر صورت میکرو های مختلف رو به کامپیوتر وصل کردند .لینک هایی رو در زیر قرار میدم از اونها استفاده کنید.
اگر همه ابزار رو آماده کرده باشید , نوشتن برنامه باقی میمونه.
ارسال اطلاعات
توی این پروژه اول ارسال رو بررسی میکنیم یعنی وقتی کلید زده شد یک 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 رو مساوی ۱ قرار بدید
(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 برنامه رو میذارم تا شما همه چیز رو خودتون ببینید.
تابع RxCpltCallback تابعی است که بعد از پایان همه دستورات اینتراپت از جمله فعال کردن دوباره اینتراپت و … توسط خود HAL صدا زده میشه تا User کد های خودش رو اونجا وارد کند.
این تابع یک بار در stm32fxxx_hal_uart.c تعریف شده است.
اما تعریف اون تابع قبل از خودش __weak داره که یک کلمه خاص کامپایلر هست. و به معنی این هست که اگر جای دیگه این تابع با این اسم تعریف شد ارور داده نشود و اگر تعریف نشد از این تابع استفاده شود که در اصل کاری نمیکند!
در تابعی که من تعریف کردم میبینید که ابتدا اطلاعات گرفته شده توسط تابع Buffercmp با LED مقایسه میشوند و اگر شرط برقرار بود led روشن یا خاموش میشود
در نهایت دوباره باید تابع Receive صدا زده شود .
نکته های پایانی
در پایان چند نکته لازمه تا گفته بشه
۱- این برنامه باگ هایی داره. توی این برنامه شما باید LED رو بفرستید. و اگر چیز دیگه ای رو بفرستید شاید دیگه دریافت شما کار نکنه که اونم امیدوارم خودتون حلش کنید چون کار سختی نیست.
۲- بابت اینکه نتونستم فیلمی مبنی بر درست بودن دریافت بزارم عذر خوهی میکنم ولی مطمئن باشید که کار میکنه!
لینک ها
راه اندازی واحد usart میکروکنترلر های PIC
امیدوارم این قسمت هم تونسته باشه توی یادگیری میکرو های STM بهتون کمک کنه
اگر هر گونه سوال یا پیشنهادی داشتید میتونید توی نظرات ارسال کنید
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
سلام فایل main کار نمیکنه لطفا اصلاح کنید با تشکر
سلام ، لطفا متن خطا ها را بفرستید.
سلام فایل main کجاست. پس چرا هر چی رو لینکش میزنم باز نمیشه.
سلام.
فایل main رو قرار بدید لطفا…
سلام، ممنون بابت یادآوری، فایل ضمیمه شد.