# 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 ```c 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 и защищает. --- ## Быстрый старт ```c #include "bsp/wdog.h" /* main.c — как можно раньше после board_hw_init(): */ bsp_wdog_init(10U); /* c запасом над самой длинной легитимной операцией */ if (bsp_wdog_caused_last_reset()) { /* предыдущая сессия закончилась таймаутом — восстановились после зависания */ } /* в основном цикле и в точках подтверждённого прогресса: */ bsp_wdog_refresh(); ``` --- ## CMake ```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()` |