در جلسه گذشته، به معرفی مقدماتی نرم افزار CubeMX پرداختیم و تنظیمات GPIO را برای انجام یک پروژه ساده در محیط نرم افزار CubeMX انجام دادیم. در این جلسه به آموزش مقدماتی نرم افزار KEIL میپردازیم و با منتقل کردن کد ساخته شده توسط نرم افزار CubeMX به این نرم افزار و وارد کردن کد پروژه ی هدف در این محیط برنامه نویسی را آغاز میکنیم. با ما همراه باشید…
اجرای کد تولید شده در محیط نرم افزار KEIL
در گام اول به پوشه MDK-ARM در مسیر داده شده که در نرم افزار CubeMX در بخش مدیریت پروژه نوشتیم، مراجعه می کنیم و برنامه ساخته شده برای نرم افزار KEIL را باز می کنیم.
پس از بازکردن پروژه ساخته شده، برنامه ما در محیط نرم افزار KEIL مطابق عکس زیر نمایش داده می شود:
حال با باز کردن پوشه های بخش Project نرم افزار واقع در سمت چپ تصویر فایل main.c را باز می کنیم
در این بخش ما می توانیم کد اصلی پروژه مدنظر را وارد کنیم.
قبل از شروع برنامه نویسی با بخش های مختلف این نرم افزار آشنا می شویم.
شکل زیر که چهار بخش مختلف تب project ترم افزار هست را نشان می دهد که تب اول آن(project) در سمت چپ تصویر نمایان است. در این بخش فایل های مختلف پروژه و کتابخانه های آن قرار دارد. و در صورتی که بخش مشخص شده در تصویر(Driver/STM32…) را باز کنیم با کتابخانه های HAL موجود در این پروژه رو به رو می شویم(نظیر کتابخانه تایمر یا خروجی و ورودی و فلش و…) و با باز کردن هرکدام، کدهای این کتابخانه را مشاهده کنیم و می توان از توابع ان برای راه اندازی بخش های مختلف استفاده کرد.
در بخش دوم که کتاب ها نام دارند، یک سری فایل و راهنما برای استفاده کاربر جهت برنامه نویسی قرار داده شده است و دیتاشیت و یوزر منوآل و دیگر فایل های مورد نیاز را بجای جست و جو در اینترنت مستقیما از این بخش میتوان مطالعه کرد.
بخش سوم مربوط به توابع مورد استفاده در کتابخانه های موجود در پروژه می باشد و با باز کردن آنها مطابق شکل زیر میتوان آن توابع را مشاهده کرد. به طور مثال در تصویر زیر توابع کتابخانه gpio که در این پروژه به آن نیاز داریم را مشاهده می کنید:
بخش دیگر از نرم افزار که باید با آن آشنا بشویم در تصویر زیر آورده شده است
با استفاده از گزینه build یا دکمه F7 روی صفحه کلید که در کادر۱ مشخص شده است میتوان پروژه را کامپایل کرد تا در صورت وجود خطا را هشدار، کاربر از آن مطلع شود.
بخش مشخص شده در کادر۲، گزینه Rebuild را برای کاربر فراهم میکند و کاربر با این گزینه build قبلی را پاک کرده و از دوباره کل پروژه build می شود (تفاوت آن دو را به صورت فلوچارت در تصویر زیر مشاهده میکنید).
و با استفاده از کادر ۳، میتوان پروژه ساخته شده را در صورت عدم وجود ایراد در پروژه در حافظه میکروکنترلر بارگذاری نمود.
کادر ۴ نیز مربوط به تنظیمات کامپایلر و خروجی های نرم افزار میباشد که در ادامه این جلسه به صورت مختصر توضیح داده خواهد شد.
بخش ۵ نیز مربوط به دیباگ کد میباشد و به کمک آن می توان عملیات دیباگ را انجام داد و به اشکالات احتمالی کد پی برد.
حال پس از آشنا شدن با نرمافزار به سراغ کدنویسی رفته و کدی را جهت روشن و خاموش کردن LED مینویسیم.
همانگونه که در بخش توابع کتابخانه دیدیم، توابعی در کتابخانه gpio قرار دارد که به کمک آنها میتوانیم کد مد نظر خود را بنویسیم. برای نوشتن این پروژه به سه تابع آخر یعنی :
HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
نیاز خواهیم داشت.
به کمک تابع اول میتوانیم اطلاعات (یک یا صفر بودن) یک پین از پورتی مشخص در حالتی که آن پین به عنوان ورودی تعریف شده باشد را بخوانیم.
به کمک تابع دوم میتوانیم وضعیت یک پین از پورتی مشخص در حالتی که آن پین به عنوان خروجی تعریف شده باشد را معکوس کنیم. یعنی اگر قبلا آن پین سطح صفر ولتاژ منطقی را در اختیار میداشت با اجرا شدن این قطعه از کد سطح آن به ۱ منطقی تغییر مییابد.
به کمک تابع سوم میتوانیم حالت یک پین از پورتی مشخص در حالتی که آن پین به عنوان خروجی تعریف شده باشد را تعیین کنیم و آنرا برابر صفر را ۱ قرار دهیم.
پس برای فعال کردن LED میتوانیم کد زیر را بنویسیم:
* قبل از ذکر نکته دیگر توجه شود که قطعه کدهای نوشته شده سعی گردد میان دو قسمت BEGIN و END نوشته شود تا در صورت تغییر در نرم افزار CubeMX این تکه کدها از دست نرود.
با این کد LED فقط روشن خواهد شد و به همان صورت باقی میماند. برای خاموش کردن آن باید همین کد را نوشت ولی بجای عدد ۱ عدد ۰ را قرار داد. منتها میان این دو قطعه کد باید تاخیری وجود داشته باشد تا چشمک زدن آن توسط چشم انسان قابل تشخیص باشد. لذا با استفاده از تابع hal_delay که در کتابخانه پروژه اصلی قراردارد استفاده میکنیم:
و کد نهایی به شکل زیر خواهد بود:
با این کد LED متصل شده به میکروکنترلر ابتدا روشن میگردد و در ادامه پس از ۵۰۰ میلی ثانیه خاموش میشود و همچنین دوباره پس از گذشت ۵۰۰ میلی ثانیه روشن میشود و این حلقه تا بینهایت ادامه مییابد.
شیوه دیگر پیاده سازی این کد استفاده از تابع toggle میباشد. و به صورت زیر میتواند پیاده شود و همان کار بالا را انجام دهد:
تا به اینجا ما کد پروژه را زدیم. در ادامه باید این کد را در میکروکنترلر بارگذاری کرده و آنرا اجرا کنیم.
بدین منظور ابتدا به بخش option torget رفته و تنظیمات را مطابق شکل زیر انجام می دهیم و پس از آن میکروکنترلر را پروگرام میکنیم.
با این کار میکروکنترلر در هر بار پروگرام شدن به صورت نرمافزاری ریست شده و دیگر نیازی به ریست خارجی نمیشود.
نکته دیگری که در عکس فوق حايز اهمیت است بخشprograming algorithm میباشد که همانگونه که مشاهده میکنید در این قسمت نوع میکروکنترلر و مقدار حافظه آن و محدوده آن مشخص است.
سایر بخش ها این تب و سایر تبها نیز در ادامه و در بخش مربوط به خودشان توضیح داده خواهد شد. پس با ما همراه باشید با ادامهی آموزش میکروکنترهای STM32 .
در جلسه بعدی به آموزش استفاده از اینتراپت خارجی میپردازیم.
نویسنده: اشکان راکی