در جلسه گذشته، به معرفی مقدماتی نرم افزار KEIL پرداختیم و یک کد ساده برای راه اندازی GPIO را در محیط این نرم افزار به وسیلهی کتابخانه HAL انجام دادیم. در این جلسه با توجه به آشنایی نسبی به نرمافزارهای معرفی شده در جلسات گذشته به راه اندازی اینتراپت خارجی میپردازیم و با استفاده از این دو نرمافزار، کد پروژهی مذکور را در این محیط برنامه نویسی آغاز میکنیم. با ما همراه باشید…
اینتراپت چیست؟
ابتدا قبل از شروع پروژه لازم است تا با مفهوم اینتراپت و دلایل استفاده از آن آشنا شویم.
اینتراپت یا وقفه درواقع اصطلاحی فنی است که طی آن سیگنالی به پردازشگر داده می شود تا پردازنده با ایجاد وقفه ای در عملکرد قبلی خود به عملکرد جدید بپردازد و ادامه عملکرد قبلی را به بعد از فعالیت جدید موکول کند. برای مثال شما در حال آبیاری باغچه هستید و در حین آبیاری تلفن شما زنگ میخورد، شما آبیاری را متوقف کرده و تلفن را جواب داده و در ادامه به آبیاری باغچه میپردازید. درنتیجه این زنگ خوردن تلفن نوعی وقفه در کار شماست.
مراحل اجرای وقفه در میکروکنترلر:
پس از آنکه پردازنده درخواست وقفه را دریافت کرد مراحل زیر انجام میشود :
- به دستوری که در حال اجرای آن است پایان میدهد و آدرس دستور بعدی را در حافظه ذخیره میکند.
- به آدرس سرویس وقفه مراجعه می کند.
- زیر برنامه اینتراپت را اجرا میکند.
- آدرسی که در حافظه ذخیره شده بود را برمی دارد و اجرای ادامه برنامه قبلی را از سر میگیرد.
ساخت پروژه در نرمافزار CubeMX
در گام اول با استفاده از نرم افزار CubeMX پروژه را ساخته و تنظیمات آنرا تا بخش کلاک به مانند جلسه ۲ انجام میدهیم. در ادامه در بخش تنظیم پایه های میکروکنترلر مانند تصاویر تنظیم کرده و ورودی PA0 را به عنوان ورودی حساس به تغییر(اینتراپت) و پایه PB15 را تحت نام LED1 به عنوان خروجی تعریف میکنیم.
برای فعال کردن تابع اینتراپت لازم است تا تیک مربوط به آن را در نرمافزار فعال کرده تا در صورت رخداد وقفه(اینتراپت) به تابع آن رجوع کند و دستورهای لازم را اجرا کند.
در ادامه برای انتخاب حساس بودن اینتراپت به چه نوع سیگنالی باید مطابق شکل زیر گزینه مذکور را انتخاب کرده و نوع GPIO mode را بر اساس اینتراپت خارجی و حساس به لبه بالارونده و پایین رونده انتخاب کنیم.
تا به اینجا تنظیمات لازم پروژه در محیط نرمافزار CubeMX انجام شده و میتوان با تولید کد توسط این نرمافزار و مراجعه به نرمافزار KEIL ادامه کد نویسی پروژه را انجام داد. اما قبل از تولید کد لازم است تا با بخش دیگر نرمافزار Cube آشنا بشویم:
در بخش مدیریت پروژه(Project Manager) پس از انتخاب نام پروژه و مکان ساخت آن و همچنین نرمافزار مورد استفاده جهت تولید کد(KEIL 5.27) به بخش Code Generator میرویم. در قسمت اول این بخش تنظیمات مربوط به کتابخانه پروژه است که ما با انتخاب گزینه دوم می توانیم فقط کتابخانه هایی را که در این پروژه استفاده میشوند به پروژه استفاده کنیم و از اضافه کردن کتابخانه های اضافی که سبب شلوغی و افزایش حجم پروژه می شوند خودداری کنیم.
در بخش دوم یعنی Generated file، چهار گزینه وجود دارد که میتوان کد تولیدی را مدیریت کرد. با انتخاب گزینه اول میتوان تنظیمات اولیه پایه ها را در فایلی جداگانه در قالب .c/.h به پروژه اضافه کرد تا درصورتی که در ادامه کار نیاز به تغییری در تنظیمات اولیه پروژه وجود داشت به این فایل ها مراجعه کرده و بدون مراجعه به نرمافزار CubeMX کد را اصلاح کرد. گزینه دوم نیز مربوط به پشتیبان گرفتن از کد قبلی پس از تولید دوباره کد توسط نرمافزار است، یعنی در صورتی که کدی توسط CubeMX تولید گردید و در ادامه نیاز به تغییرات یا اصلاحاتی در کد تولیدی وجود داشت، با فعال بودن این گزینه کد قبلی حذف نشده و کد جدید در فایلی جداگانه تولید میگردد. گزینه سوم و چهارم نیز که در حالت اولیه فعال هستند، مربوط به تولید دوباره کد هستند و در صورت تولید دوباره کد، کدهای تغییر نکرده حذف و کدهایی که تغییر می کنند جایگزین کد قبلی شوند.
بخش های سوم و چهارم نیز به ترتیب مربوط به کتابخانه HAL و همچنین ساخت کد براساس template هستند.
حال کد را تولید کرده و به نرمافزار KEIL برای ادامه پروژه مراجعه می کنیم.
ادامه پروژه در نرمافزار KEIL
فایل پروژه برای نرمافزار KEIL را از مسیر انتخاب شده و واقع در پوشه MDK-ARM پروژه انتخاب کردن و باز میکنیم.
در بخش فانکشن در نوار سمت چپ نرمافزار زیر گروه gpioرا باز کرده و توابع مربوط به این کتابخانه را در آن مشاهده می کنید
با رخداد وقفه میکروکنترلر به تابع IRQHandler میرود که تابع عملکردی آن را با دابل کردن بر روی آن میتوان دید که مطابق شکل زیر است:
همانگونه که مشاهده میشود با فعال شدن این تابع، تابع کالبک فراخوانی شده و عملیات های در درون آن اجرا می گردد. لذا با استفاده از این تابع میتوان در صورت رخداد وقفه توابع و دستورات خاصی را اجرا کرد.
در نتیجه میتوان کد زیر را برای تولید خروجی(روشن و خاموش شدن LED) متناسب با صفر و یک شدن ورودی نوشت و بر روی میکروکنترلر پروگرام کرد تا با یک شدن ورودی LED روشن و با صفر شدن آن LED خاموش گردد.
خط۵۴ به منظور جداسازی اینتراپت های مختلف قرار گرفته است. یعنی درصورتی که دو اینتراپت فعال گردد به وسیله این خط کد میتوان این دو اینتراپت را از همدیگر جدا کرد.
خط ۵۵ همانگونه که در جلسه قبل تابع آن توضیح داده شد، سطح ولتاژ ورودی را خوانده و در صورت برقرار بودن شرط وارد تابع if میشود.
تا به اینجا کد تکمیل شده است و میتوان با پروگرام کردن میکروکنترلر به روشی که در جلسه قبل گفته شد کد را اجرا کرد.
در جلسه بعدی به آموزش استفاده از واحد آنالوگ به دیجیتال میکروکنترلر (ADC) میپردازیم.
نویسنده: اشکان راکی