روشن کردن LED با میکرو STM32

سلام خدمت همه دوستانی که منو با پست هایی از تراشه ARM و میکرو STM32شرکت ST همراهی میکنند

اگر پست قبلی منو دیده باشید پس با نرم افزار CubeMX آشنا شدید.

کار با نرم افزار CubeMX

تو این قسمت من میخوام با ی توضیح نسبتا کامل برم به سراغ برنامه ریزی روی این تراشه ها

ابتدا جا داره بگم که من از برد STM32F746G-DISCO که محصول خود شرکت ST هست استفاده میکنم . توی محصولات ST فرقی نمیکنه شما با چه پردازنده ای کار میکنید پس نگران نباشید با یک سری تغییرات کوچیک میتونید به نتیجه من برسید ولی جا داره که به اهمیت یک برد آموزشی اشاره کنم . به دلیل اینکه پردازنده های ARM شرکت ST پکیج DIP کم دارند یا اصلا ندارند (دقیق نمیدونم) پس استفاده از اونها روی BreadBoard  امکان پذیر نیست و برای برنامه ریزی زوی آنها به روش دیگه نیاز دارید که الان همه از برد آموزشی استفاده میکنند . الان دیگه همه Arduino رو میشناسند پس میتونید تصور کنید که منظور من یک برد مثل همان با یک پردازنده STM است .

 برنامه ریزی روی پردازنده های ST

برای برنامه ریزی روی این پردازنده های چند روش وجود داره مثل Jtag , SWD , UART

من فعلا نمیخوام وارد اون بشم و فقط میخوام به ابزار اشاره کنم

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

پروگرمر ST-LINK : این پروگرمر توسط خود شرکت ST ارائه میشود و فقط برای محصولات خود این شرکت است و از روش SWD استفاده میکند . برد من روی خودش این پروگرمر رو داره و من فقط با استقاده از یک کابل USB روی اون برنامه میریزم . دقت کنید که برای این پروگرمر هم شما نیاز به نصب درایور هستید که به صورت رایگان در سایت ST قرار دارد . در ضمن شما میتوانید این پروگرمر را خودتون بسازید . میتونید گوگل کنید;)

ساخت پروژه

خوب میریم سراغ ساخت اولین پروژه که همون روشن کردن یک led هست

حتما در ادامه این مطلب را هم بخوانید:  آموزش برنامه نویسی میکروکنترلرهای ARM [از شی گرایی تا توابع CMSIS]

اولین کاری که نیاز است انجام بشه اینه که بفهمید led به کدوم یکی از پایه های میکروتون متصل شده اگر برد طراحی خودتون است که خوب کارتون راحته ولی اگر مثل من از یک برد Discovery استفاده میکنید باید توی User Manual اون برد برای فهمیدن این موضوع بگردید.

خوب من از یک سری مرحله که مخصوص انختاب میکرو توی CubeMX است و توی پست قبلی بهش اشاره شده میگذرم .

خوب بعد از انتخاب میکرو من پایه ها رو که به صورت اولیه نتظیم شده بودن از منو Pinout پاک میکنم و توی پایه ها دنبال پایه ۱ در PORT Iمیگردم یا برای میکرو هایی که پایه زیاد دارن میتونی از قسمت Find پایه مورد نظر رو پیدا کنید بعد از انتخاب پایه اون رو روی حالت GPIO_Output قرار بدید

مبینید که هر پایه کار های زیادی میتونه انجام بده ولی دقت کنید که در یک زمان فقط یک کار رو میتونه انجام بده.

سربرگ بعدی که باید بهش توجه کنیم مربوط به تنظیات clock میکرو میشه . توی این پروژه من اجازه میدهم همین چیزی که هست باقی بمونه . خوبه که بدونید تا زمانی که CubeMX اروری تو این بخش بهتون نداده مشکلی ندارید ولی خوب اگر شما از یک کریستال خارجی برای میکرو خودتون استفاده میکنید باید ابتدا از سربرگ Pinout و قسمت Peripherals  تنظیماتش رو انجام بدید تا قسمت های (HSE(High Speed External و یا (LSE(Low Speed External در سربرگ Clock Configuration برای شما قابل استفاده باشد .

یک نکته پیشرفته تر توی این قسمت که دوست دارم بهتون بگم و به معماری میکرو بر میگرده اینه که GPIO ها هم به عنوان یک نوع Peripheral روی یکی از باس های میکرو شما قرار دارند . برای اطلاع از اینکه مثلا GPIO I روی کدوم باس قرار داره باید به دیتاشیت میکرو قسمت (Memory Map ) سر بزنید.

این یک تکه از دیتاشیت که مربوط به قسمت Memory Map هست میشه . اگر به دنبال یادگیری اصولی و حرفه این میکرو ها هستید کنجکاوی توی این قسمت رو فراموش نکنید .

خوب حالا میتونید بفهمید توی قسمت Clock Configuration  باید به چه چیزی دقت کنید .

حتما در ادامه این مطلب را هم بخوانید:  پروژه سیستم حضورغیاب RFID و SMS با میکروکنترلر ARM

سربرگ بعدی که configuration است مربوط به تنظیمات جزئی هسته میکرو و Peripheral ها است .

توی این سربرگ ما باید نتظمیات قسمت GPIO رو انجام بدیم

در این قسمت شما میتونید برای هر پایه یک سری تنظیمات رو انجام بدید که من در اینجا حالت اولیه پایه رو روی High قرار دادم یعنی اول کار led روشن هست. Pull up و Pull Down در نظر نگرفتم و GPIO mode رو روی Push Pull قرار دادم . در مورد این ها بعدا صحبت میکنیم . یکی دیگه از بخش ها سرعت خروجی هست که در اصل سرعت Fall time و Rise time اون پایه است که جز موارد خاص اون رو روی low قرار میدیم تا باعث ایجاد نویز نشوند . آخرین قسمت که User label هست نوعی Define به حساب می آید یعنی اگر شما اینجا کلمه LED رو قرار دادید توی برنامه به جای GPIOI1  از LED استفاده میکنه که من اینکار رو نمیکنم .

خوب الان میمونه بخش ساخت و ورود به نرم افزار IAR

خوب من اسم پروژه و محل ذخیره پروژه رو انتخاب میکنم و بعد IDE رو روی (EWARM(IAR قرار دهید سپس از طریق دکمه OK پروژه خودتون رو بسازید و بازش کنید

 خوب وقتی پروژه رو توی IAR باز میکنید به این صفحه میرسید . سمت راست تابع main رو میبینید که داخلش سه تابع فراخوانی شده . خیلی دوست داشتم براتون از این تابع ها و لایه های زیرین این پروژه بگم ولی خوب میدونم که تا همین الان هم حوصلتون سر رفته ولی خوب نمیشه از یک توضیح خیلی کوچیک از MX_GPIO_Init گذشت 😉 قبل از اون سمت چپ عکس رو نگاه کنید . میبینید که یک سری کتابخانه از Peripheral های میکرو که شما نیاز ندارید به برنامه اضافه شدن . شما میتونید توی تنظیمات CubeMX  از این اتفاق جلوگیری کنید . این کتابخانه های HAl هستن که شما قبلا یک فایل Firmware دانلود کردید و این کتابخانه ها در اون قرار داشت و CubeMX به برنامه اضافه کرد .

خب MX_GPIO_Init

در اولین تابع میبینید که کلاک مربوط به GPIO I فعال شده است . آگر شما یکی از کسانی باشید که از AVR به ARM مهاجرت میکنید این نکته برای شما جالبه . در ARM میتوان clock های هر Peripheral رو فعال یا غیر فعال کرد که به اصطلاح به اون Clock gating گفته میشه . این کار برای کنترل توان مصرفی انجام میشه یعنی وقتی clock gating خاموش باشه شما به هیچ یک از رجیستر های اون قسمت دسترسی ندارید .

حتما در ادامه این مطلب را هم بخوانید:  ساخت چراغ قوه با 500 تا LED

در قسمت بعدی حالت اولیه پایه را که در نرم افزار CubeMX به ۱ تغییر دادیم رو انجام میده و در ادامه هم همون تغییرات فقط به صورت کد C !!! فکر کنم الان نعمت بودن برنامه CubeMX رو درک کردید .

خوب حالا بریم سر یک LED چشمک زن

خوب برنامه خیلی ساده هست ۱ ثانیه LED خاموش و ۵. ثانیه روشن هست .

کد هاتون رو بین USER CODE BEGIN و USER CODE END بگذارید تا اگر نیاز بود پروژه رو توسط CubeMX تغییری بدید مشکلی برای کد ها پیش نیاد .

تابع Delay در کتابخانه  stm32fxxx_hal است و تابع WritePin در کتابخانه stm32fxxx_hal_GPIO . تابع های دیگری هم در این کتابخانه وجود داره که وقعا از حوصله بحث خارجه ولی توصیه میکنم حتما توش کنجکاو باشید .

و در نهایت روش انتقال برنامه به میکروتون.

ابتدا باید توی تنظیمات , پروگرمر خودتون رو انتخاب کنید .

پروگرمر برد من ST_LINK است. شما باید این گزینه رو روی پروگرمی که خودتون دارید قرار بدید(دقت کنید فایلی که انتخاب کردید و توی تنظیماتش رفتید پروژه باشه وگرنه یک صفحه دیگه باز میشه).

بعد برای انتقال فایل به میکرو از منو PROJECT گزینه Download و سپس روی Download active application رو انتخاب کنید.

 

خوب این پروژه تموم شد

چند تا نکته نیازه تا بگم

۱: من از کتاب طراحی میکروکنترلر های STM32 مهندس نجفی توی این پست کمک گرفتم ولی به هیچ عنوان هیچ قسمتی کپی نشده است

۲: شما میتونید برای برد آموزشی از بردی که توی این کتاب معرفی شده استفاده کنید . میتونید از سایت خود مهندس نجفی  سفارش بدید(کاملا در جریان نحوه سفارش نیستم)

۳: پروژه بعدی از همین فایل ها استفاده میکنیم و یک کلید رو هم به پروژمون اضافه میکنیم.

امیدوارم این بحثی که یکم طولانی شد به دردتون خورده باشه

متشکر بابت همراهی :X

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

درباره ی علیرضا صادقی

پاسخ دهید

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

4 + 11 =