ARM, STM32, آموزش, توصیه شده, دوره آموزشی 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 را آموزش خواهیم داد. با سیسوگ همراه باشید.

 

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

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

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

  1. Avatar for پوریا کاظم پوریا کاظم گفت:

    سلام از مطلب خوبتون تشکر میکنم.
    تو این سایت دقیقا همین مطلب با همین عکسا رو گذاشته بدون ذکر اینکه منبعش شمایید.گفتم بهتون بگم که باهاشون صحبت کنید ببینید چرا این کار رو انجام دادن.اینطوری زحمات شما دیده نمیشه و به نظرم این درست نیست.

    لینک حذف شده است.

    1. Avatar for Sisoog Os Sisoog Os گفت:

      سلام دوست عزیز
      ما این انتقاد را هم ازشون داشتیم و قرار شده حئداقل یک لینک از ما بگذارند و امیدواریم لطف کنند بزارند :-))

  2. Avatar for mohammad mohammad گفت:

    با عرض سلام و خسته نباشید و تشکر فراوانو
    من مبتدیم و خیلی خوب توضیح میدید فقط یه سوال داشتم اون TOGGLE_OUT1;بافر هستش یا چیز دیگه چون کمپایلر ایراد میگیره و اینکه
    delay_ms چرا استفاده شده و نه خود تابع HAL_DELAY()

    مرسی

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز
      TOGGLE_OUT1 در واقع یک ماکرو یا تابع است که یکی از خروجی ها رو برعکس میکنه – حالا میتونه هر خروجی دلخواهی باشه اگر صفر بود یک میکنه اگر هم یک بود صفر میکنه
      من به شخصه تابع HAL_DELAY() رو توصیه میکنم حالا نظر نویسنده این بوده که تابع تاخیر رو هم خودشون بنویسند

  3. Avatar for مهدی مهدی گفت:

    سلام. ممنون از مطالب خوبتان.
    در کامپایلر کیل خطای invalid c99 برای چیه میشه مشکلش رو حل کرد؟

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام برای رفع این خطا توی تنظیمات پروژه – قسمت c/c++ یه تیک هست که استاندارد c99 رو فعال میکنه و دقیقا عبارت c99 رو نوشته

  4. Avatar for سعید سعید گفت:

    با سلام و ممنون بابت مطلب مفیدی که گذاشتید
    من یه مشکل دارم با واچ داگ،اونم اینه که من یه برنامه دماسنج دارم که یه تایمر نزولی هم داره،وقتی واچ داگ رو در برنامه قرار میدم و مقدار واچ داگ رو بابر ۸ ثانیه میگذارم،درست زمانی که تایمر نزولی ۸ ثانیه ازش کم میشه،واچ داگ فعال میشه و میکرو رو ریست میکنه و تایمر و برنامه ها از دوباره شروع بکار میکنند و این روند همینطور ادامه داره،اگه میشه راهنمایی کنید که چیکار کنم؟

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      خوب دوست عزیز شما لازمه که ولچ داگ رو در سریعترین زمان ممکن ریست کنید
      وقتی واچ داگ رو ریست نکنید – واچ داگ سر ریز میکنه و میکرو رو ریست میکنه ! این عملکرد ذاتی واچ داگ هست
      شما باید توی برنامه بسته به نوع واچ داگ (ویندو واچ داگ یا واچ داگ معمولی ) اونو متناوبا ریست کنید.

  5. Avatar for مقدم مقدم گفت:

    سلام خیلی ممنون بابت مطالب مفیدتون واقعا عالیه
    یه درخواستی داشتم اینکه امکانش هست آموزش محاسبه طول پالس ورودی در پایه ی اینتراپت به واحد میکرو ثانیه را هم قرار دهید؟(برای محاسبه سیگنال دریافتی از رادیو کنترلر)

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام فکر میکنم در دستور آموزش های جدید که تحت عنوان STM32F4 داره منتشر میشه باشه

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

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