3.8 KiB
bsp_wdog — аппаратный watchdog (WDOG1)
Аппаратный сброс МК по таймауту. Защищает от зависаний в блокирующих вызовах, которые не возвращают управление в код приложения — там, где программный watchdog (флаг + проверка в основном цикле) бессилен, поскольку сам цикл не выполняется.
Аппаратура
| Параметр | Значение |
|---|---|
| Периферия | WDOG1 |
| Шаг таймаута | 0.5 c |
| Диапазон таймаута | 1..128 c |
| Причина сброса | WDOG1->WRSR.TOUT (1 — сброс был по watchdog) |
| Поведение под SWD-halt | Приостановлен (enableDebug = false) |
Контракт: WDE — write-once
WDOG_WCR.WDE (enable) — бит однократной записи: после bsp_wdog_init()
watchdog нельзя выключить программно до следующего POR. Он остаётся взведённым
и после любого перехода управления внутри той же сессии питания (переход в
другой образ прыжком, а не через ресет). Любой код, к которому управление
переходит после инициализации watchdog в этой же сессии, обязан периодически
вызывать bsp_wdog_refresh() не реже периода таймаута — иначе неизбежен
reset-loop.
API
bsp_status_t bsp_wdog_init(uint32_t timeout_s); /* взвести, once; захватывает причину предыдущего сброса */
void bsp_wdog_refresh(void); /* сбросить счётчик таймаута */
bool bsp_wdog_caused_last_reset(void); /* true, если последний сброс МК — по таймауту WDOG */
bool bsp_wdog_is_armed(void); /* true после успешного init() */
uint32_t bsp_wdog_timeout_s(void); /* сконфигурированный таймаут (0 до init) */
bsp_wdog_refresh() безопасно звать даже до bsp_wdog_init() — no-op.
Звать только в точках подтверждённого прогресса, не непосредственно перед
вызовом, от зависания в котором watchdog и защищает.
Быстрый старт
#include "bsp/wdog.h"
/* main.c — как можно раньше после board_hw_init(): */
bsp_wdog_init(10U); /* c запасом над самой длинной легитимной операцией */
if (bsp_wdog_caused_last_reset())
{
/* предыдущая сессия закончилась таймаутом — восстановились после зависания */
}
/* в основном цикле и в точках подтверждённого прогресса: */
bsp_wdog_refresh();
CMake
target_link_libraries(firmware_test PRIVATE bsp_wdog)
Зависимости модуля:
| Зависимость | Тип | Описание |
|---|---|---|
bsp_status |
PUBLIC | bsp_status_t в публичном API |
sdk_wdog |
PRIVATE | fsl_wdog.h — WDOG_Init/Refresh() |