قانون مورفی می گوید: هر چیزی که ممکن است اشتباه پیش برود، اشتباه خواهد شد. و این به خصوص برای سیستم های تعبیه شده صادق است. جدا از ایرادات سخت افزاری، که می تواند بر روی نرم افزار نیز تاثیر بگذارد، حتی دقیق ترین طراحی نیز ممکن است شرایط غیرمنتظره ای داشته باشد که منجر به رفتار غیرعادی دستگاه شود. این موضوع ممکن است هزینه های مهمی به وجود اورد، به خصوص اگر دستگاه جهت کار در زمینه های خطرناک و بحرانی طراحی شده باشد.
تقریباً همه میکروکنترلرهای موجود در مارکت یک تایمر WatchDog (WDT) ارائه می کنند. Watchdog معمولاً به صورت یک تایمر آزاد و شمارنده کاهشی پیادهسازی میشود و هنگامی که به صفر میرسد یا اگر شمارنده تایمر به مقدار اولیهاش در یک پنجره زمانی بارگذاری نشود، (صحبت در مورد windowed watchdog ) باعث ریست مجدد MCU می شود. پس از فعال شدن، برنامه باید دائماً رجیستر شمارنده watchdog را به مقدار اولیه خود بهروزرسانی کند، در غیر این صورت لاین ریست MCU توسط تایمر پایین امده و ریست انجام می شود.
مدیریت هوشمند WDT به ما کمک می کند تا همه آن موقعیتهای ناخواسته که منجر به شرایط معیوب سختافزار میشوند (استثناهای غیرقابل کنترل، سرریزهای پشته stack ، دسترسی به مکانهای حافظه ، خرابی SRAM به دلیل منبع تغذیه ناپایدار، حلقه های بدون قید و شرط و غیره را کنترل کنیم). علاوه بر این، اگر WDT بتواند زمانی که تایمر در حال اتمام است را به ما هشدار دهد، میتوانیم تلاش کنیم تا فعالیتهای معمولی فریمور را بازیابی یا حداقل دستگاه را در وضعیت ایمن قرار دهیم.
میکروکنترلرهای STM32 دو تایمر مستقل Watchdog را ارائه می دهند: Independent Watchdog (IWDG) و System Window Watchdog (WWDG). آنها به جز چند مورد که یک تایمر را در برخی از برنامه های خاص مناسب تر از دیگری می کند، تقریباً ویژگی های یکسانی دارند. این فصل نحوه استفاده از CubeHAL را برای این دو واحد جانبی مهم و اغلب کم استفاده را نشان می دهد.
The Independent Watchdog Timer
IWDG یک تایمر 12 بیتی پایین شمار است که توسط نوسانگر داخلی کم سرعت (LSI) کلاک می شود: این صفت مستقل independent را توضیح می دهد، به این معنی که این واحد جانبی توسط کلاک پریفرال ، که به نوبه خود توسط اسیلاتورها HSI یا HSE تولید می شود ، تغذیه نمی شود. این یک ویژگی مهم است که به تایمر IWDG اجازه می دهد حتی در صورت خرابی کلاک اصلی کار کند: Watchdog حتی اگر CPU متوقف شود همچنان به شمارش ادامه می دهد و وقتی به صفر رسید MCU را ریست می کند. اگر فریمور به درستی برای رفع این مشکل طراحی شده باشد، MCU می تواند با استفاده از نوسانگر داخلی (HSE) از کلاک معیوب بازیابی شود.
در خانواده های STM32F0/F3/F7/L0/L4، این تایمر می تواند به صورت اختیاری در حالت پنجره ای windowed کار کند. یعنی میتوانیم یک پنجره زمانی (از x00 تا xFFF0) که مشخص میکند چه زمانی برای رفرش شمارنده تایمر مناسب است را، تنظیم کنیم. اگر قبل از رسیدن شمارنده به مقدار پنجره، تایمر را رفرش کنیم ، MCU مانند زمانی که تایمر به صفر می رسد ، ریست می شود. این کار اجازه می دهد تا مطمئن شویم همه چیز در مسیر درست حرکت می کند، به خصوص زمانی که MCU کارهای تکراری را در یک پنجره زمانی انجام می دهد.
تایمر IWDG چقدر طول می کشد تا MCU ریست شود؟ فرمول زیر رویداد به روز رسانی تایمر IWDG را تعیین می کند:
قانون مورفی می گوید: هر چیزی که ممکن است اشتباه پیش برود، اشتباه خواهد شد. و این به خصوص برای سیستم های تعبیه شده صادق است. جدا از ایرادات سخت افزاری، که می تواند بر روی نرم افزار نیز تاثیر بگذارد، حتی دقیق ترین طراحی نیز ممکن است شرایط غیرمنتظره ای داشته باشد که منجر به رفتار غیرعادی دستگاه شود. این موضوع ممکن است هزینه های مهمی به وجود اورد، به خصوص اگر دستگاه جهت کار در زمینه های خطرناک و بحرانی طراحی شده باشد.
تقریباً همه میکروکنترلرهای موجود در مارکت یک تایمر WatchDog (WDT) ارائه می کنند. Watchdog معمولاً به صورت یک تایمر آزاد و شمارنده کاهشی پیادهسازی میشود و هنگامی که به صفر میرسد یا اگر شمارنده تایمر به مقدار اولیهاش در یک پنجره زمانی بارگذاری نشود، (صحبت در مورد windowed watchdog ) باعث ریست مجدد MCU می شود. پس از فعال شدن، برنامه باید دائماً رجیستر شمارنده watchdog را به مقدار اولیه خود بهروزرسانی کند، در غیر این صورت لاین ریست MCU توسط تایمر پایین امده و ریست انجام می شود.
مدیریت هوشمند WDT به ما کمک می کند تا همه آن موقعیتهای ناخواسته که منجر به شرایط معیوب سختافزار میشوند (استثناهای غیرقابل کنترل، سرریزهای پشته stack ، دسترسی به مکانهای حافظه ، خرابی SRAM به دلیل منبع تغذیه ناپایدار، حلقه های بدون قید و شرط و غیره را کنترل کنیم). علاوه بر این، اگر WDT بتواند زمانی که تایمر در حال اتمام است را به ما هشدار دهد، میتوانیم تلاش کنیم تا فعالیتهای معمولی فریمور را بازیابی یا حداقل دستگاه را در وضعیت ایمن قرار دهیم.
میکروکنترلرهای STM32 دو تایمر مستقل Watchdog را ارائه می دهند: Independent Watchdog (IWDG) و System Window Watchdog (WWDG). آنها به جز چند مورد که یک تایمر را در برخی از برنامه های خاص مناسب تر از دیگری می کند، تقریباً ویژگی های یکسانی دارند. این فصل نحوه استفاده از CubeHAL را برای این دو واحد جانبی مهم و اغلب کم استفاده را نشان می دهد.
The Independent Watchdog Timer
IWDG یک تایمر 12 بیتی پایین شمار است که توسط نوسانگر داخلی کم سرعت (LSI) کلاک می شود: این صفت مستقل independent را توضیح می دهد، به این معنی که این واحد جانبی توسط کلاک پریفرال ، که به نوبه خود توسط اسیلاتورها HSI یا HSE تولید می شود ، تغذیه نمی شود. این یک ویژگی مهم است که به تایمر IWDG اجازه می دهد حتی در صورت خرابی کلاک اصلی کار کند: Watchdog حتی اگر CPU متوقف شود همچنان به شمارش ادامه می دهد و وقتی به صفر رسید MCU را ریست می کند. اگر فریمور به درستی برای رفع این مشکل طراحی شده باشد، MCU می تواند با استفاده از نوسانگر داخلی (HSE) از کلاک معیوب بازیابی شود.
در خانواده های STM32F0/F3/F7/L0/L4، این تایمر می تواند به صورت اختیاری در حالت پنجره ای windowed کار کند. یعنی میتوانیم یک پنجره زمانی (از x00 تا xFFF0) که مشخص میکند چه زمانی برای رفرش شمارنده تایمر مناسب است را، تنظیم کنیم. اگر قبل از رسیدن شمارنده به مقدار پنجره، تایمر را رفرش کنیم ، MCU مانند زمانی که تایمر به صفر می رسد ، ریست می شود. این کار اجازه می دهد تا مطمئن شویم همه چیز در مسیر درست حرکت می کند، به خصوص زمانی که MCU کارهای تکراری را در یک پنجره زمانی انجام می دهد.
تایمر IWDG چقدر طول می کشد تا MCU ریست شود؟ فرمول زیر رویداد به روز رسانی تایمر IWDG را تعیین می کند:
که در آن Period از 0 تا 4095 متغیر است و مربوط به یک prescaler اختصاصی 3 بیتی متغیر از 2 تا 8 است. برای مثال، با فرض اینکه کلاک LSI روی 32 کیلوهرتز کار می کند، Period برابر با xFFF0 و برابر 2 است. ، در نتیجه تایمر IWDG پس از زمان زیر جریان می یابد:
Using the CubeHAL to Program IWDG Timer
برای دستکاری واحد جانبی IWDG، HAL ساختار IWDG_HandleTypeDef را تعریف می کند که به صورت زیر تعریف می شود:
typedef struct {
IWDG_TypeDef *Instance; /* Pointer to IWDG descriptor */
IWDG_InitTypeDef Init; /* IWDG initialization parameters */
HAL_LockTypeDef Lock; /* IWDG locking object */
__IO HAL_IWDG_StateTypeDef State; /* IWDG communication state */
} IWDG_HandleTypeDef;