سلام دوستان. در مقاله پنجم آموزش میکروکنترلر STM32، آموزشداد که چطور چند وقفه خارجی در برنامه داشتهباشیم و چطور باید آنها را از یکدیگر تفکیککنیم. در این مقاله در ابتدا، تنظیم لبه بالارونده و پایین رونده هر پین از پورت را آموزش میدهیم و سپس طریقهکار با تایمر واتچ داگ و درنهایت وقفههای خطا را معرفی میکنیم. با ما همراه باشید.
تنظیم لبه بالارونده و پایینرونده هر پین
خوب حالا که یادگرفتیم چطور میتوانیم ازطریق توابع کتابخانه hal لبه وقفه خارجی خود را تغییردهیم، بهتراست یک راهحل مناسب و سادهتر برای اینکار پیداکنیم آنهم راهحل استفادهاز کار مستقیم با رجیسترها است. برای اینمنظور فقط لازم است با دو رجیستر ساده با نامهای EXTI->RTSR که به انتخاب لبه بالارونده هر پین از پورت مربوط میشود و رجیستر EXTI->FTSR که به انتخاب لبه پایینرونده هر پین از پورت مربوط میشود، کارکنیم. روندکار هم بسیارساده است، بدینصورت که هربیت از هرکدام از رجیسترها متناظر با همان پین از پورت است، یعنی اگر ما بعنوان مثال بخواهیم یک پین مشخص را با لبه بالارونده تنظیم کنیم باید بیت متناظر با این پین را در رجیستر EXTI->RTSR یک کنیم و متقابلاً همان بیت را در رجیستر EXTI->FTSR صفر نمائیم، یا اگر بخواهیم آن پین را روی لبه پایین رونده تنظیمکنیم بالعکس این عمل را انجام میدهیم و اگر بخواهیم پین موردنظر را همزمان هم روی لبه بالارونده و هم روی لبه پایینرونده تنظیمکنیم بیت متناظر با آن پین را در هردو رجیسترهای EXTI->FTSR و EXTI->FTSR یک میکنیم بههمینراحتی… برای فهم بیشتر مسئله به مثالهایزیر توجهکنید.
*کادر قرمز: تنظیم روی لبه پایین رونده*
*کادر بنفش: تنظیم روی لبه بالا رونده کادر سبز: تنظیم روی لبه بالا رونده و پایین رونده*
حالا اگر بهمثالبالا توجهکنید ما از ماکروهای SET_BIT و CLEAR_BIT استفادهکردیم که اینها یکسری ماکرو ابتدائی هستند که در برگه stm32f1xx.h قراردارند برای فهم بیشتر عملکرد این ماکروها به عکسزیر توجهکنید:
توجهداشتهباشید ما در آینده نیز در آموزشهای بعدی از ماکروهای بالا که ماکروهای عمومی هستند استفاده خواهیمکرد.
تایمر واتچ داگ
در اینقسمت طریقهکار با تایمر واتچ داگ را خواهیمآموخت، طبقمعمول نرمافزار cubemx را باز میکنیم و بعداز تنظیم بخش کلاک میکرو و پروگرامر و دیگر تنظیمات موردنیاز طبق عکسزیر گزینه IWDG را از قسمت Pinout انتخاب میکنیم.
اولینکاری که میکنیم به صفحه Clock Configuration میرویم و طبق عکسزیر میزان کلاک واتچ داگ را مشاهده میکنیم.
همانطورکه در عکسبالا میبینید، برای امنیت و پایداری بیشتر، کلاک تایمر واتچ داگ از یک اسیلاتور ۴۰کیلوهرتز داخلی تامینشدهاست. بعداز این مرحله به صفحه Configuration میرویم و دکمه IWDG را میزنیم تا صفحهزیر باز شود.
*کادر قرمز: تقسیم کننده کلاک واچ داگ*
*کادر بنفش: دوره تناوب شمارش تایمر واچ داگ*
همانطورکه در عکسبالا میبینید ما در اینجا دو گزینه برای تنظیم داریم اولی تقسیمکننده کلاک تایمر واتچ داگ هست، که طبق عکسزیر گزینههای مختلفی دارد و کلاک تایمر واتچ داگ که همان ۴۰کیلوهرتز هست را به عدد موردنظرما تقسیم میکند:
و گزینه بعدی هم که محدوده آن در قسمت توضیحات پایین کادر نشاندادهشده همان دوره تناوب تایمر واتچ داگ است:
شیوه عملکرد هم بدینصورت است که کلاک تایمر واتچ داگ ابتدا بر مقدار گزینه تقسیمکننده اول تقسیم میشود و درمرحلهی بعد طی تعداد شمارشی که ما توسط گزینهی دوم مشخصکردیم سرریز تایمر صورت میپذیرد و باعث ریستشدن میکروکنترلر میگردد. ما در اینجا میخواهیم اعداد را طوری قراردهیم که هر ۲ثانیه سرریز تایمر واتچ داگ صورتپذیرد بدینمنظور اگر ما تقسیمکننده را مساوی ۲۵۶قراردهیم و دورهی تناوب را هم مساوی ۳۱۲ قراردهیم ۲ثانیه حاصل میشود. توضیح اینکه ۴۰۰۰۰/۲۵۶=۱۵۶ (که منظور از ۴۰۰۰ همان کلاک کار تایمر و منظور از ۲۵۶ همان مقدار تقسیمکننده است) یعنی ما برای یک ثانیه احتیاج به ۱۵۶ شمارش داریم درنتیجه با قراردادن دوره تناوب با ۳۱۲ دوثانیه تا زمان سرریز تایمر خواهیمداشت. حال در قدمبعدی از نرمافزار CubeMX خروجی میگیریم و به محیط نرمافزار keil میرویم تا برنامه را کاملکنیم. در عکسزیر میتوانید روال اصلی برنامه را مشاهدهکنید:
*کادر قرمز: پیکربندی تایمر واچ داگ*
*کادر بنفش: بازنشانی تایمر واچ داگ برای جلوگیری از ریستشدن میکروکنترلر*
همانطورکه در عکس میبینید، شکل عملکرد برنامه بسیارساده است به اینصورتکه ما هر ۱ثانیه وضعیت یک خروجی را بالعکس میکنیم و همان ۱ثانیه یکبار هم تایمر واتچ داگ را بازنشانی میکنیم تا قبلاز رسیدن به ۲ثانیه (که قبلا برای تایمر واتچ داگ تنظیمکردیم) از ریستشدن میکروکنترلر جلوگیریشود.
وقفه خطا
در میکروکنترلر STM32 ما چهار وقفه خطا متفاوت داریم. که در برگه stm32f1xx_it.c میتوانید روتینهای وقفه مربوطه را ببینید:
همانطورکه میبینید داخل همه این روتینهای وقفه یک حلقه بینهایت وجود دارد، که یک فایده آن ایناست که باعث میشود برنامه درهمینجا متوقف بماند تا تایمر واتچ داگ سرریز شود و میکرو ریست شود، همانطورکه میبینید شما میتوانید کدهای موردنظرتان را که درهنگام رخدادن خطای موردنظر در بین کدهای USER CODE BEGIN و USER CODE END قراردهید. البته معمولا بهترین کدی که میتوانیم قراردهیم فرمان HAL_NVIC_SystemReset(); است که کار آن ریست نرمافزاری میکروکنترلر است. توجهداشتهباشید در CubeMX که برنامه را تنظیم میکنیم، اجبارا باید این وقفهها فعال باشد ولیکن ما میتوانیم از طریق همان فرمان HAL_NVIC_EnableIRQ و فرمان HAL_NVIC_DisableIRQ درطول برنامه آنها را فعال و غیرفعال کنیم.
در قسمت هفتم آموزشهای میکروکنترلر STM32 تنظیمات نرمافزار CubeMX برای رابط سریال uart را آموزش خواهیمداد. با ما همراه باشید.
منبع: سیسوگ