技术笔记!
1.WWDG(窗口看门狗)简介
本质:能产生系统复位信号和提前唤醒中断的计数器。
特性:
递减的计数器;
当递减计数器值从 0x40减到0x3F时复位(即T6位跳变到0);
计数器的值大于W[6:0]值时喂狗会复位;
提前唤醒中断 (EWI):当递减计数器等于 0x40 时可产生;
喂狗:在窗口期内重装载计数器的值,防止复位。
作用:软件异常,精准时间把控
2. WWDG工作原理(掌握)
3. WWDG框图
4. WWDG寄存器(熟悉)
4.1 控制寄存器(WWDG_CR)
4.2 配置寄存器(WWDG_CFR)
4.3 状态寄存器(WWDG_SR)
5. WWDG超时时间计算(掌握)
6. WWDG配置步骤(掌握)
7. 相关HAL库函数
8. IWDG和WWDG主要的区别
9. 窗口看门狗实验
wdg.c
WWDG_HandleTypeDef g_wwdg_handle; //句柄
/* WWDG初始化函数 */
void wwdg_init(uint8_t tr, uint8_t wr, uint16_t prep)
{
g_wwdg_handle.Instance = WWDG; //基地址
g_wwdg_handle.Init.Counter = tr; //计数值
g_wwdg_handle.Init.Window = wr; //窗口值
g_wwdg_handle.Init.Prescaler = prep; //预分频系数
g_wwdg_handle.Init.EWIMode = WWDG_EWI_ENABLE; //提前中断使能
}
/*msp回调函数*/
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
__HAL_RCC_WWDG_CLK_ENABLE(); //WWDG使能
HAL_NVIC_SetPriority(WWDG_IRQn, 2, 3); //中断优先级
HAL_NVIC_EnableIRQ(WWDG_IRQn); //中断使能
}
/* WWDG中断服务函数 */
void WWDG_IRQHandler(void)
{
HAL_WWDG_IRQHandler(&g_wwdg_handle);
}
/* WWDG提前唤醒回调函数 */
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
HAL_WWDG_Refresh(&g_wwdg_handle);
LED1_TOGGLE();
}
main.c
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟为72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /*初始化led*/
if(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET)
{
printf("窗口看门狗复位\r\n");
__HAL_RCC_CLEAR_RESET_FLAGS();
}
else
{
printf("外部复位\r\n");
}
delay_ms(500);
printf("请在窗口期内喂狗\r\n\r\n");
wwdg_init(0x7f, 0x5f, WWDG_PRESCALER_8);
while(1)
{
delay_ms(90);
HAL_WWDG_Refresh(&g_wwdg_handle);
LED0_TOGGLE();
}
}
实验小结:
本次实验主要是为了熟悉WWDG的使用,首先对窗口看门狗句柄相关成员基地址以及初始化变量赋值,然后通过MSP回调函数对相关时钟以及中断使能,最后通过重定义中断服务函数WWDG_IRQHandler进行操作。