23#include "px_stm32cube.h"
34static uint8_t px_wwdg_counter_reload;
36#ifdef PX_WWDG_CFG_EARLY_WARNING_FLAG
37PX_ATTR_SECTION(
".noinit") volatile uint32_t px_wwdg_ew_flag;
40#ifdef PX_WWDG_CFG_EARLY_WARNING_REGS
41PX_ATTR_SECTION(
".noinit") volatile uint32_t px_wwdg_r0;
42PX_ATTR_SECTION(".noinit") volatile uint32_t px_wwdg_r1;
43PX_ATTR_SECTION(".noinit") volatile uint32_t px_wwdg_r2;
44PX_ATTR_SECTION(".noinit") volatile uint32_t px_wwdg_r3;
45PX_ATTR_SECTION(".noinit") volatile uint32_t px_wwdg_r12;
46PX_ATTR_SECTION(".noinit") volatile uint32_t px_wwdg_lr;
47PX_ATTR_SECTION(".noinit") volatile uint32_t px_wwdg_pc;
48PX_ATTR_SECTION(".noinit") volatile uint32_t px_wwdg_psr;
54#ifdef PX_WWDG_CFG_EARLY_WARNING_FLAG
55void WWDG_IRQHandler(
void)
57 LL_WWDG_ClearFlag_EWKUP(WWDG);
58 px_wwdg_ew_flag = 0xdeadc0de;
62#ifdef PX_WWDG_CFG_EARLY_WARNING_REGS
69PX_ATTR_NORETURN
void px_wwdg_save_regs(uint32_t * stack_adr)
71 px_wwdg_r0 = stack_adr[0];
72 px_wwdg_r1 = stack_adr[1];
73 px_wwdg_r2 = stack_adr[2];
74 px_wwdg_r3 = stack_adr[3];
75 px_wwdg_r12 = stack_adr[4];
76 px_wwdg_lr = stack_adr[5];
77 px_wwdg_pc = stack_adr[6];
78 px_wwdg_psr = stack_adr[7];
84void WWDG_IRQHandler(
void) PX_ATTR_NAKED;
85void WWDG_IRQHandler(
void)
87#if (__CORTEX_M > 0x03U)
95 "ldr r1, =px_wwdg_save_regs \n\t"
106 "beq px_wwdg_save_regs_call \n\t"
108 "px_wwdg_save_regs_call: \n\t"
109 "ldr r1, =px_wwdg_save_regs \n\t"
124 LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_WWDG);
126 LL_WWDG_SetPrescaler(WWDG, ((uint32_t)prescaler) << WWDG_CFR_WDGTB_Pos);
130 LL_WWDG_SetWindow(WWDG, window);
133 px_wwdg_counter_reload = counter;
134 LL_WWDG_SetCounter(WWDG, counter);
136#ifdef PX_WWDG_CFG_EARLY_WARNING_FLAG
140 LL_WWDG_ClearFlag_EWKUP(WWDG);
142 NVIC_SetPriority(WWDG_IRQn, 0);
143 NVIC_EnableIRQ(WWDG_IRQn);
144 LL_WWDG_EnableIT_EWKUP(WWDG);
147#ifdef PX_WWDG_CFG_EARLY_WARNING_REGS
158 LL_WWDG_ClearFlag_EWKUP(WWDG);
160 NVIC_SetPriority(WWDG_IRQn, 0);
161 NVIC_EnableIRQ(WWDG_IRQn);
162 LL_WWDG_EnableIT_EWKUP(WWDG);
167 LL_DBGMCU_APB1_GRP1_FreezePeriph(LL_DBGMCU_APB1_GRP1_WWDG_STOP);
171 LL_WWDG_Enable(WWDG);
176 if(!LL_WWDG_IsEnabled(WWDG))
180 if(px_wwdg_counter_reload <= 0x40)
184 LL_WWDG_SetCounter(WWDG, px_wwdg_counter_reload);
189 LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_WWDG);
194 LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_WWDG);
199#ifdef PX_WWDG_CFG_EARLY_WARNING_FLAG
203#ifdef PX_WWDG_CFG_EARLY_WARNING_REGS
#define PX_LOG_TRACE(format,...)
Macro to output a user format string if PX_LOG=1.
#define PX_LOG_NAME(name)
Macro to declare a log name string once for each file to reduce code size.
#define PX_LOG_ASSERT(expression)
Macro that will test an expression, and block indefinitely if false.
px_wwdg_prescaler_t
Window Watchdog clock prescaler (PCLK / 4096 clock source)
void px_wwdg_halt(void)
Halt watchdog by disabling peripheral clock.
void px_wwdg_dbg_report(void)
Report state saved by early warning interrupt in .noinit variables.
void px_wwdg_reload_counter(void)
Reload watchdog counter, a.k.a.
void px_wwdg_init(px_wwdg_prescaler_t prescaler, uint8_t counter, uint8_t window)
Initialise System Window Watchdog.
void px_wwdg_resume(void)
Resume watchdog by enabling peripheral clock.