lift_indicator_suite/bsp/wdog
2026-07-13 09:57:53 +03:00
..
include/bsp # bootloader: Phase 3 - wdog testing 2026-07-13 09:57:53 +03:00
src # bootloader: Phase 3 - wdog testing 2026-07-13 09:57:53 +03:00
CMakeLists.txt # bootloader: Phase 3 - wdog testing 2026-07-13 09:57:53 +03:00
README.md # bootloader: Phase 3 - wdog testing 2026-07-13 09:57:53 +03:00

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.hWDOG_Init/Refresh()