برد STM ترفند

بررسی تایمر Watchdog (سگ نگهبان) در میکروکنترلرهای STM32

Watchdog
نوشته شده توسط علی زاهدی

یکی از بزرگترین چالش هایی که در پروژه های مختلف با آن رو برو هستیم، جلوگیری از اختلال و هنگ کردن دستگاه است. برای جلوگیری از اختلال در روند کار دستگاه قبل از هر چیزی بایستی به نحوه کد نویسی صحیح و اصولی را بیاموزیم. پس از میتوان از امکاناتی که در پردازنده قرار داده می‌شود استفاده کنیم. یکی از این امکاناتی که برای جلوگیری از اختلال در روند کار داخل میکروکنترلر قرار داده شده، تایمر نگهبان یا Watchdog است. در این آموزش قصد داریم تا به معرفی و نحوه استفاده از تایمر Watchdog یا سگ نگهبان بپردازیم.  در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 


تایمر Watchdog چیست؟


Watchdog یا سگ نگهبان، یک تایمر الکترونیکی یا نرم افزاری است که برای شناسایی و بازیابی نقص در میکروکنترلرها استفاده می شود. تایمر نگهبان در میکروکنترلرها استفاده می شود تا تصحیح خودکار خطاهای سخت افزاری موقتی را تسهیل کنند. و همچنین برای جلوگیری از اختلال در عملکرد سیستم توسط نرم افزارهای اشتباه یا بدخواه استفاده می‌شود. در حالت عادی تایمر نگهبان به طور مداوم ریست می‌شود. اگر به دلیل خطای سخت افزاری یا خطای برنامه، میکروکنترلر نتواند دوباره تایمر نگهبان را راه اندازی کند، تایمر سپری می شود و سیگنال مهلت ایجاد می کند. از سیگنال مهلت زمانی برای شروع اقدامات اصلاحی استفاده می شود. اقدامات اصلاحی معمولاً قرار دادن سخت افزارهای مرتبط در حالت ایمن و استناد به راه اندازی مجدد است.

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

 


کاربرد تایمر نگهبان


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

Spaceship

در روبات ها و سایر ماشین های خودکار ، نقص در کامپیوتر کنترل می تواند باعث آسیب به تجهیزات یا صدمات قبل از واکنش انسان شود ، حتی اگر به راحتی به کامپیوتر دسترسی داشته باشید. یک تایمر نگهبان معمولاً در مواردی از این دست استفاده می شود. تایمرهای Watchdog همچنین برای نظارت و محدود کردن زمان اجرای نرم افزار در رایانه ای که عملکرد عادی دارد استفاده می شود. به عنوان مثال ، ممکن است هنگام اجرای کد غیرقابل اعتماد در یک SandBox، از یک تایمر نگهبان استفاده شود تا زمان پردازنده موجود در کد را محدود کند. بنابراین از برخی انواع حملات منع سرویس جلوگیری کند.

در سیستم عامل های بلادرنگ، می توان از یک تایمر نگهبان برای نظارت بر یک کار مهم استفاده کرد تا اطمینان حاصل شود. که در حداکثر زمان اختصاص داده شده خود به اتمام میَ‌رسد. و در صورت عدم انجام این کار، وظیفه را خاتمه داده و خرابی را گزارش می کند.

 


پیکربندی تایمر نگهبان در STM32Cube


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

IWDG Active

در قسمت Parameter Setting دو پارامتر در اختیار شما قرار داده می‌شود. با استفاده از این دو پارامتر می‌توانید مشخص کنید. در صورت ریست نشدن تایمر نگهبان، پس از چه مدتی این تایمر میکروکنترلر را ریست کند. پارامتر IWDG Counter Clock Prescale کلاک بخش مربوط به تایمر نگهبان را بر عدد های مشخصی تقسیم می‌کند. پارامتر دوم یعنی IWDG down-counter reload value عددی است که زمان سرریز شدن تایمر را تعین می‌کند. این پارامتر می‌تواند عددی بین ۰ تا ۴۰۹۵ باشد. برای مثال در این آموزش قصد داریم تا تایمر نگهبان را طوری تنظیم کنیم که در صورتی که شماره نده آن به ۵ ثانیه رسید. میکروکنترلر را ری استارت کند. از این رو پارامتر ها را مطابق تصویر زیر تنظیم می‌کنیم. به ترتیب مقدار های ۲۵۶ و ۷۸۰ قرار داده شده است.

اگر وارد بخش Clock Configuration شوید. مشاهده می‌کنید که بخش مربوط به تایمر نگهبان دارای یک کلاک ۴۰ کیلو هرتز جدا از کلاک اصلی میکروکنترلر است.

 برای نشان دادن عملکرد کد نیاز است که یک کلید و LED موجود بر روی برد BluePill را تنظیم کنیم. ابتدا پایه PC13 را بصورت خروجی با مقدار اولیه صفر و لیبل “LED” تنظیم کنید. سپس پایه PC14 را به عنوان ورودی با لیبل “Key” تعریف کنید. تا به اینجا پیکربندی های مورد نیاز انجام شده است.

در آخر وارد بخش Project Manager شده و پس از انتخاب نام، آدرس بایستی در قسمت Toolchainبرای انتخاب KEIL گزینه MDK-ARM را انتخاب کنید. سپس گزینه Min Version را بر روی V5 قرار دهید. پس از آن وارد بخش Code Generator شده و بخش STM32Cube MCU Package را بر روی گزینه دوم یعنی Copy only the necessary library files تنظیم کنید. و سپس بر روی گزینه GENERATE CODE کلیک کرده و وارد نرم افزار KEIL شوید.

 


کد نویسی در نرم‌افزار KEIL


پس از ورود به نرم‌افزار KEIL از نوار سمت چپ وارد پوشه Application/User/Core و سپس وارد فایل main.c شوید. در حلقه while(1) بایستی با توجه به کدی که می‌نویسید و زمانی که برای تایمر نگهبان انتخاب کرده اید این تایمر را به طور مداوم ریست کنید. در غیر این صورت میکروکنترلر شما ریست خواهد کرد. برای ریست کردن شمارنده تایمر نگهبان می‌توانید از دستور زیر استفاده کنید.

__HAL_IWDG_RELOAD_COUNTER(&hiwdg);

در این آموزش برای این که نشان دهیم که تایمر نگهبان چگونه عمل می‌کند. پایه PC13 که متصل به LED موجود بر روی برد BluePill است را به صورت خروجی تعریف کرده‌ایم. همچنین پایه PC14 به صورت ورودی PULL-UP تعریف شده است و کلیدی به آن متصل کرده‌ایم. در ادامه کدی را مشاهده می‌کنید. که در ابتدا هر ۲۰۰ میلی ثانیه وضعیت LED تغییر کرده و تایمر نگهبان ریست می‌شود. زمانی که کلید فشرده شود. برنامه وارد حلقه یک حلقه‌ی بی نهایت می‌شود. و دیگر امکان ریست کردن تایمر نگهبان را نخواد داشت. پس از گذشت مدت زمان ۵ ثانیه تایمر نگهبان به مقدار سرریز خود رسیده و میکروکنترلر را راه اندازی مجدد می‌کند. و LED دوباره شروع به چشمک زدن خواهد کرد.

int main()
{
	while (1)
	{
		__HAL_IWDG_RELOAD_COUNTER(&hiwdg);
		HAL_Delay(200);
		HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
		if(HAL_GPIO_ReadPin(Key_GPIO_Port,Key_Pin) == GPIO_PIN_RESET) 
			while(1){};
	}
}

در آخر بایستی برنامه را کامپایل کرده و بر روی برد Bluepill پروگرام کنید. در صورتی که با نحوه پروگرام کردن میکروکنترلر های Stm32 آشنا نیستید. بخش اول آموزش های میکروکنترلر Stm32 را مطالعه نمایید. پس از دانلود کد بر روی برد BluePill بایستی یک بار کلید reset را بر روی برد فشار دهید. در صورتی که تمامی مراحل را به طور صحیح طی کرده باشید. LED شروع به چشمک زدن خواهد کرد.

 


جمع بندی


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

BluePill

 


لوازم مورد نیاز


برای اجرای این پروژه نیاز به قطعاتی دارید که لیست آن را در زیر مشاهده می‌کند. برای تهیه این قطعات می‌توانید بر روی نام هر یک از آنها کلیک کرده، وارد صفحه محصول شده و خرید کنید.

 

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

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی از وبسایت دیجی اسپارک حمایت کنید.

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

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۴ دیدگاه

  • سلام وقت تون بخیر و خسته نباشید
    آقای زاهدی انتهای مطلب برام سوال شد !
    تایمر به مقدار سرریز رسیده و میکروکنترلر را کاملا ریست می‌کند
    مثل اینکه خودمون دکمه ریست رو فشار بدیم؟ کد های توی میکرو و یا دیتاهایی که توی EEPROM داریم میمونن؟

    • با سلام
      بله، ری استارت شدن میکروکنترلر مانند قطع و وصل شدن تغذیه میکروکنترلر است. مقادیر متغیر هایی که داخل حافظه EEPROM قرار گرفته باشد باقی خواهند ماند.

  • سلام و وقت بخیر
    من یه بورد ساختم با stm32f0 و یه موتورac هم با رله کنترل میشه وقتی موتور خاموش روشن میشه بعضی موقع ها کلاlcd ژاپنی نشون میده و هنگ میکنه تا برق رو قطع و وصل نکنم درست نمیشه، واچ داگ iwdg هم فعال کردم ولی کار نمیکنه، واچ داگ چرا نمیتونه جلوی اینکار رو بگبره؟
    مرسی مهندس بابا مطالب خوب تون

    • با سلام
      واچ داگ تنها زمانی میکروکنترلر را ری استارت میکند، که میکروکنترلر هنگ کرده باشد و نتواند واچ داگ را ریست کند. این مشکل بر روی LCD ایجاد می شود و تاثیری بر روی عملکرد میکروکنترلر ندارد. بایستی به صورت سخت افزاری برای این نویز چاره ای پیدا کنید.