ARM, STM, STM32, آموزش, توصیه شده, مقاله

آموزش میکروکنترلر STM32 : تایمر واچ داگ و وقفه خطا

آموزش STM32 ، واتچ داگ

سلام دوستان. سیسوگ در مقاله پنجم آموزش میکروکنترلر  STM32 ، آموزش داد که چطور چند وقفه خارجی در برنامه داشته باشیم و چطور باید آن‌ها از یکدیگر تفکیک کنیم. در این مقاله در ابتدا، تنظیم لبه بالا رونده و پایین رونده هر پین از پورت را آموزش می‌دهد و سپس طریقه کار با تایمر واتچ داگ را آموزش می‌دهد و در نهایت وقفه‌های خطا را معرفی می‌کند. با سیسوگ همراه باشید.

 

تنظیم لبه بالا رونده و پایین رونده هر پین

خوب حالا که یاد گرفتیم چطور می‌توانیم از طریق توابع کتابخانه hal لبه وقفه خارجی خود را تغییر بدهیم، بهتر است یک راه حل مناسب و ساده‌تر برای اینکار پیدا کنیم آن هم راه حل استفاده از کار مستقیم با رجیسترها است. برای این منظور فقط لازم است با دو رجیستر ساده با نام های EXTI->RTSR که به انتخاب لبه بالا رونده هر پین از پورت مربوط می‌شود و رجیستر EXTI->FTSR که به انتخاب لبه پایین رونده هر پین از پورت مربوط می‌شود، کار کنیم. روند کار هم بسیار ساده است، بدین صورت که هر بیت از هر کدام از رجیسترها متناظر با همان پین از پورت است، یعنی اگر ما بعنوان مثال بخواهیم یک پین مشخص را با لبه بالا رونده تنظیم کنیم باید بیت متناظر با این پین را در رجیستر EXTI->RTSR یک کنیم و متقابلاً همان بیت را در رجیستر EXTI->FTSR صفر نمائیم، یا اگر بخواهیم آن پین را روی لبه پایین رونده تنظیم کنیم بالعکس این عمل را انجام می‌دهیم و اگر بخواهیم پین مورد نظر را همزمان هم روی لبه بالا رونده و هم روی لبه پایین رونده تنظیم کنیم بیت متناظر با آن پین را در هر دو رجیستر‌های EXTI->FTSR و  EXTI->FTSR یک می‌کنیم به همین راحتی … برای فهم بیشتر مسئله به مثال‌های زیر توجه کنید.

 

تنظیم لبه هر پین از پورت

کادر قرمز: تنظیم روی لبه پایین رونده کادر بنفش: تنظیم روی لبه بالا رونده کادر سبز: تنظیم روی لبه بالا رونده و پایین رونده

 

حالا اگر به مثال بالا توجه کنید ما از ماکروهای SET_BIT و CLEAR_BIT استفاده کردیم که اینها یک سری ماکرو ابتدائی هستند که در برگه stm32f1xx.h قرار دارند برای فهم بیشتر عملکرد این ماکروها به عکس زیر توجه کنید:

 

عملکرد ماکروهای SET_BIT و CLEAR_BIT

 

توجه داشته باشید ما در آینده نیز در آموزش‌های بعدی از ماکروهای بالا که ماکروهای عمومی هستند استفاده خواهیم کرد.

 

تایمر واتچ داگ

در این قسمت طریقه کار با تایمر واتچ داگ را خواهیم آموخت، طبق معمول نرم‌افزار cubemx را باز می‌کنیم و بعد از تنظیم بخش کلاک میکرو و پروگرامر و دیگر تنظیمات مورد نیاز طبق عکس زیر گزینه IWDG را از قسمت Pinout انتخاب می‌کنیم.

 

قسمت Pinout نرم افزار cubemx

 

 

 

اولین کاری که می‌کنیم به صفحه Clock Configuration می‌رویم و طبق عکس زیر میزان کلاک واتچ داگ را مشاهده می‌کنیم.

 

صفحه Clock Configuration

 

 

همان‌طور که در عکس بالا می‌بینید، برای امنیت و پایداری بیشتر، کلاک تایمر واتچ داگ از یک اسیلاتور 40 کیلوهرتز داخلی تامین شده است. بعد از این مرحله به صفحه Configuration می‌رویم و دکمه IWDG را می‌زنیم تا صفحه زیر باز شود.

 

بخش IWDG در صفحه Configuration

کادر قرمز: تقسیم کننده کلاک واچ داگ کادر بنفش: دوره تناوب شمارش تایمر واچ داگ

 

همان‌طور که در عکس بالا می‌بینید ما در اینجا دو گزینه برای تنظیم داریم اولی تقسیم کننده کلاک تایمر واتچ داگ هست، که طبق عکس زیر گزینه‌های مختلفی دارد و کلاک تایمر واتچ داگ که همان 40 کیلو هرتز هست را به عدد مورد نظر ما تقسیم می‌کند:

 

تنظیم تقسیم کننده کلاک تایمر واتچ داگ

 

و گزینه بعدی هم که محدوده آن در قسمت توضیحات پایین کادر نشان داده شده همان دوره تناوب تایمر واتچ داگ است:

 

دوره تناوب تایمر واتچ داگ

 

 

شیوه عملکرد هم بدین صورت است که کلاک تایمر واتچ داگ ابتدا بر مقدار گزینه تقسیم کننده اول تقسیم می‌شود و در مرحله بعد طی تعداد شمارشی که ما توسط گزینه دوم مشخص کردیم سرریز تایمر صورت می‌پذیرد و باعث ریست شدن میکروکنترلر میگردد. ما در اینجا میخواهیم اعداد را طوری قرار دهیم که هر 2 ثانیه سرریز تایمر واتچ داگ صورت پذیرد بدین منظور اگر ما تقسیم کننده را مساوی 256 قرا دهیم و دوره تناوب را هم مساوی 312 قرار دهیم 2 ثانیه حاصل میشود.

توضیح اینکه 40000/256=156 (که منظور از 4000 همان کلاک کار تایمر و منظور از 256 همان مقدار تقسیم کننده است) یعنی ما برای یک ثانیه احتیاج به 156 شمارش داریم در نتیجه با قرار دادن دوره تناوب با 312 دو ثانیه تا زمان سرریز تایمر خواهیم داشت.

حال در قدم بعدی از نرم افزار CubeMX خروجی می‌گیریم و به محیط نرم افزار keil می‌رویم تا برنامه را کامل کنیم.  در عکس زیر می‌توانید روال اصلی برنامه را مشاهده کنید:

 

 

محیط نرم افزار keil

کادر قرمز: پیکربندی تایمر واچ داگ
کادر بنفش: بازنشانی تایمر واچ داگ برای جلوگیری از ریست شدن میکروکنترلر

 

همان‌طور که در عکس می‌بینید، شکل عملکرد برنامه بسیار ساده است به این صورت که ما هر یک ثانیه وضعیت یک خروجی را بالعکس می‌کنیم و همان یک ثانیه یکبار هم تایمر واتچ داگ را بازنشانی می‌کنیم تا قبل از رسیدن به دو ثانیه (که قبلا برای تایمر واتچ داگ تنظیم کردیم) از ریست شدن میکروکنترلر جلوگیری شود.

 

وقفه خطا

در میکروکنترلر STM32 ما چهار وقفه خطا متفاوت داریم. که در برگه stm32f1xx_it.c می‌توانید روتین‌های وقفه مربوطه را ببینید:

 

روتین وقفه خطای سخت‌افزاری

روتین وقفه خطای سخت‌افزاری

 

روتین وقفه خطای مدیریت حافظه

روتین وقفه خطای مدیریت حافظه

 

روتین وقفه خطای دسترسی به حافظه

روتین وقفه خطای دسترسی به حافظه

 

روتین وقفه خطای دستورالعمل نامشخص یا مجوز غیرقانونی

روتین وقفه خطای دستورالعمل نامشخص یا مجوز غیرقانونی

 

 

همان‌طور که می‌بینید داخل همه این روتین‌های وقفه یک حلقه بینهایت وجود دارد، که یک فایده آن این است که باعث می‌شود برنامه در همین‌جا متوقف بماند تا تایمر واتچ داگ سرریز شود و میکرو ریست شود ، همان‌طور که میبینید شما می‌توانید کدهای مورد نظرتان را که در هنگام رخ دادن خطای مورد نظر در بین کدهای USER CODE BEGIN و USER CODE END قرار دهید. البته معمولا بهترین کدی که می‌توانیم قرار دهیم فرمان HAL_NVIC_SystemReset(); است که کار آن ریست نرم افزاری میکروکنترلر است.

توجه داشته باشید در CubeMX که برنامه را تنظیم می‌کنیم، اجبارا باید این وقفه‌ها فعال باشد ولیکن ما می‌توانیم از طریق همان فرمان HAL_NVIC_EnableIRQ و فرمان HAL_NVIC_DisableIRQ در طول برنامه آنها را فعال و غیر فعال کنیم.

 

در قسمت هفتم آموزش‌های میکروکنترلر  STM32 تنظیمات نرم افزار CubeMX برای رابط سریال uart را آموزش خواهیم داد. با سیسوگ همراه باشید.

 

نوشته های مشابه

دیدگاهتان را بنویسید

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