第九章 窗口看门狗(WWDG)
第九章 窗口看门狗(WWDG)
目录
第九章 窗口看门狗(WWDG)
1 WWDG简介
1.1 WWDG主要特性
1.2 WWDG功能描述
1.3 如何编写看门狗超时程序
1.4 调试模式
2 寄存器描述
2.1 控制寄存器(WWDG_CR)
2.2 配置寄存器(WWDG_CFR)
2.3 状态寄存器(WWDG_SR)
2.4 WWDG寄存器映像
3 程序设计
3.1 WWDG_Int例程
3.1.1 下载验证
3.2 WWDG_Reset例程
3.2.1 下载验证
本章分为如下几个小节:
1 IWDG 简介
2 IWDG 寄存器描述
3 程序设计
4 下载验证
1 WWDG简介
窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位。在递减计数器达到窗口寄存器数值之前,如果 7 位的递减计数器数值(在控制寄存器中)被刷新,那么也将产生一个 MCU 复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。
1.1 WWDG主要特性
- 可编程的自由运行递减计数器
- 条件复位
- 当递减计数器的值小于 0x40,(若看门狗被启动)则产生复位。
- 当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。
- 如果启动了看门狗并且允许中断,当递减计数器等于 0x40 时产生早期唤醒中断(EWI),它可以被用于重装载计数器以避免 WWDG 复位。
1.2 WWDG功能描述
如果看门狗被启动(WWDG_CR 寄存器中的 WDGA 位被置'1'),并且当 7 位(T[6:0])递减计数器从0x40 翻转到 0x3F(T6 位清零)时,则产生一个复位。如果软件在计数器值大于窗口寄存器中的数值时重新装载计数器,将产生一个复位。
看门狗框图
应用程序在正常运行过程中必须定期地写入 WWDG_CR 寄存器以防止 MCU 发生复位。只有当计数器值小于窗口寄存器的值时,才能进行写操作。储存在 WWDG_CR 寄存器中的数值必须在 0xFF 和0xC0 之间:
- 启动看门狗
在系统复位后,看门狗总是处于关闭状态,设置 WWDG_CR 寄存器的 WDGA 位能够开启看门狗,随后它不能再被关闭,除非发生复位。
- 控制递减计数器
递减计数器处于自由运行状态,即使看门狗被禁止,递减计数器仍继续递减计数。当看门狗被启用时,T6 位必须被设置,以防止立即产生一个复位。T[5:0]位包含了看门狗产生复位之前的计时数目;复位前的延时时间在一个最小值和一个最大值之间变化,这是因为写入 WWDG_CR 寄存器时,预分频值是未知的。配置寄存器(WWDG_CFR)中包含窗口的上限值:要避免产生复位,递减计数器必须在其值小于窗口寄存器的数值并且大于 0x3F 时被重新装载,0 描述了窗口寄存器的工作过程。另一个重装载计数器的方法是利用早期唤醒中断(EWI)。设置 WWDG_CFR 寄存器中的 WEI 位开启该中断。当递减计数器到达 0x40 时,则产生此中断,相应的中断服务程序(ISR)可以用 来加载计数器以防止 WWDG 复位。在 WWDG_SR 寄存器中写'0'可以清除该中断。
注: 可以用 T6 位产生一个软件复位(设置 WDGA 位为'1',T6 位为'0')。
1.3 如何编写看门狗超时程序
可以使用 0 提供的公式计算窗口看门狗的超时时间。
警告:当写入 WWDG_CR 寄存器时,始终置 T6 位为'1'以避免立即产生一个复位。
窗口看门狗时序图
1.4 调试模式
当微控制器进入调试模式时(Cortex-M3 核心停止),根据调试模块中的 DBG_WWDG_STOP 配置位的状态,WWDG 的计数器能够继续工作或停止。
2 寄存器描述
可以用半字(16 位)或字(32 位)的方式操作这些外设寄存器。
2.1 控制寄存器(WWDG_CR)
地址偏移量:0x00
复位值:0x0000 007F
2.2 配置寄存器(WWDG_CFR)
地址偏移量:0x04
复位值:0x0000 007F
2.3 状态寄存器(WWDG_SR)
地址偏移量:0x08
复位值:0x0000 0000
2.4 WWDG寄存器映像
WWDG 寄存器映像和复位值
3 程序设计
3.1 WWDG_Int例程
这段代码是基于 W55MH32 微控制器编写的,主要用于演示窗口看门狗(WWDG)的中断喂狗功能。窗口看门狗是一种特殊的看门狗,它有一个上窗口值和下窗口值,只有在计数器的值处于这两个窗口值之间时喂狗才有效。该程序通过配置窗口看门狗和中断,在窗口看门狗产生中断时进行喂狗操作,以防止系统复位。
1. 系统启动阶段
系统上电或复位后,程序开始执行。首先会初始化各种外设和窗口看门狗,然后通过串口输出系统时钟频率信息和提示信息。
2.正常运行阶段
// 窗口看门狗配置(在main函数中)
WWDG_SetPrescaler(WWDG_Prescaler_8); // 设置预分频值
WWDG_SetWindowValue(0x5F); // 设置窗口上限值
WWDG_Enable(0x7f); // 使能看门狗并设置初始值// 中断配置
WWDG_ClearFlag(); // 清除早期唤醒中断标志
NVIC_Configuration(); // 配置NVIC中断优先级
WWDG_EnableIT(); // 使能窗口看门狗中断// 窗口看门狗中断处理函数
void WWDG_IRQHandler(void)
{WWDG_SetCounter(0x7f); // 重置计数器值为0x7F(喂狗操作)WWDG_ClearFlag(); // 清除中断标志printf("[WWDG] Feed dog! Counter reset to 0x7F\n");
}
窗口看门狗开始工作,计数器从初始值 0x7F 开始递减。
当计数器的值递减到窗口值 0x5F 时,会触发窗口看门狗中断,进入中断处理函数WWDG_IRQHandler()。
在中断处理函数中,计数器被重置为 0x7F,中断标志位被清除,然后继续正常运行。
只要中断处理函数能够及时响应并进行喂狗操作,系统将不会因为窗口看门狗超时而复位,会一直保持正常运行状态。
3. 异常情况
如果由于某种原因(如中断处理函数被阻塞、系统死机等)导致中断处理函数不能及时响应,计数器会继续递减到 0,此时窗口看门狗会产生复位信号,使系统重新启动,再次输出系统时钟频率信息和提示信息。
3.1.1 下载验证
在烧录完成后,串口会输出系统时钟频率信息及“WWDG Int Test.”和“Interrupt Feed Dog”提示,窗口看门狗会周期性触发中断,在中断处理函数中重新设置计数器和清除标志以防止系统复位,而主函数进入无限循环,无其他明显现象。
3.2 WWDG_Reset例程
此程序是基于 W55MH32 单片机开发的,其主要目的是开展窗口看门狗(WWDG)的复位测试,同时配置了串口通信用于输出系统信息。
1.主函数main()
RCC_ClocksTypeDef clocks;RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);delay_init();UART_Configuration(115200);RCC_GetClocksFreq(&clocks);printf("\n");printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n",(float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,(float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);printf("WWDG Reset Test.\n");WWDG_SetPrescaler(WWDG_Prescaler_8);WWDG_SetWindowValue(0x5F);WWDG_Enable(0x7f);
定义了RCC_ClocksTypeDef类型的变量clocks,用于存储系统时钟频率信息。
使能窗口看门狗(WWDG)的时钟。
调用delay_init函数进行延时初始化。
调用UART_Configuration()函数,以 115200 的波特率配置串口。
获取系统时钟频率,并通过printf函数将系统时钟频率信息打印输出。
打印 “WWDG Reset Test.” 信息。
对窗口看门狗进行配置,设置预分频器和窗口值,然后使能窗口看门狗。
进入无限循环。
2. 串口配置函数UART_Configuration()
定义了GPIO_InitTypeDef和USART_InitTypeDef类型的结构体变量。
使能USART1和GPIOA的时钟。
对GPIOA的引脚 9 进行配置,使其作为USART1的发送引脚(复用推挽输出)。
对GPIOA的引脚 10 进行配置,使其作为USART1的接收引脚(浮空输入)。
对USART1进行配置,设置波特率、数据位、停止位、校验位、硬件流控制和工作模式。
使能USART1。
3. 获取串口数据函数GetCmd()
定义了一个无符号 8 位整型变量tmp。
检查USART1的接收缓冲区是否非空,如果非空则读取接收到的数据并赋值给tmp。
返回接收到的数据。
uint8_t GetCmd(void)
{uint8_t tmp = 0;if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE)){
tmp = USART_ReceiveData(USART1);}return tmp;
}
4. 串口发送字符函数SER_PutChar()
等待USART_TEST的发送完成标志位被置位。
发送一个字符到USART_TEST。
返回发送的字符。
5. 标准输出重定向函数fputc()
若要输出的字符是换行符\n,则先发送回车符\r。
调用SER_PutChar函数发送字符。
返回发送的字符。
4 下载验证
1. 正常下载情况
- 串口输出信息:程序下载到单片机后,若一切正常,通过串口调试助手可以看到系统时钟信息以及 WWDG Reset Test. 提示信息。
- 窗口看门狗复位:由于程序中没有对窗口看门狗进行喂狗操作,窗口看门狗计数器会不断递减。当计数器值减到 0x3F 以下时,单片机就会复位,然后重新开始执行程序,串口会再次输出系统时钟信息和提示信息。