物联网ARM开发-9STM32窗口看门狗
前言:窗口看门狗避免程序不安预定逻辑执行,比如先于理想环境完成,或者后于极限时间超时。
目录
一、概述
二、特性编辑
1、窗口看门狗复位条件
2、WWDG的特性
三、工作原理框图分析编辑
1、窗口看门狗时钟
2、计数器 CR
3、窗口值:CFR
四、实验
1、实验要求
2、cubmx配置
五、实验演示
六、总结
一、概述
窗口看门狗(WWDG)概述:
通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
二、特性
1、窗口看门狗复位条件
- 除非递减计数器的值在 T6 位(WWDG->CR 的第六位)变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位。
- 在递减计数器达到窗口配置寄存器(WWDG->CFR)数值之前,如果 7 位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个 MCU 复位。
2、WWDG的特性
- 可配置的时间窗,用来检测应用程序非预期中的运行流程(过早或过晚)
- 看门狗复位条件
- 1使能了看门狗的情况下,自减计数器值小于0x40 (再小1是3F)
- 2使能了看门狗的情况下,喂狗时间大于上窗口的值
- 计数器值=0x40产生早期唤醒中断(EWI)
三、工作原理框图分析
①窗口看门狗时钟②计数器时钟③计数器④窗口值
1、窗口看门狗时钟
来自 PCLK1,PCLK1 最大是 42M,由 RCC 时钟控制器开启。计数器时钟由 CK计时器时钟经过预分频器分频得到,分频系数由配置寄存器 CFR 的位 8:7 WDGTB[1:0]配置
2、计数器 CR
- 窗口看门狗的计数器是一个递减计数器,共有 7 位,其值存在控制寄存器 CR 的位 6:0,即 T[6:0],当 7 个位全部为 1时是 0X7F,这个是最大值
- 当递减到 T6 位变成 0时,即从0X40 变为 0X3F时候,会产生看门狗复位。这个值 0X40 是看门狗能够递减到的最小值
- 当递减计数器递减到 0X40 的时候,还不会马上产生复位,如果使能了提前唤醒中断:CFR 位 9 EWI 置 1,则产生提前唤醒中断,如果真进入了这个中断的话,就说明程序肯定是出问题了,那么在提前唤醒中断的处理程序中我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断。
3、窗口值:CFR
- 下窗口的值是固定的 0X40,上窗口的值可以改变,具体的由配置寄存器 CFR 的位 6:0 W[6:0]设置。其值必须大于 0X40,如果小于或者等于 0X40就是失去了窗口的价值,而且也不能大于计数器的值,所以必须得小于 0X7F。
- 如何设置窗口值: 这个得根据我们需要监控的程序的运行时间来决定。如果我们要监控的程序段 A 运行的时间为 Ta,当执行完这段程序之后就要进行喂狗,如果在窗口时间内没有喂狗的话,那程序就肯定是出问题了。一般计数器的值 TR设置成最大 0X7F,窗口值为 WR,计数器减一个数的时间为 T,那么时间:(TR-WR)*T 应该稍微小于 Ta即可
四、实验
1、实验要求
开启STM32的窗口看门狗,并使能唤醒中断。主程序正常运行时喂狗,用按键中断模拟程序故障死机,此时将触发唤醒中断并产生复位,用LED灯指示唤醒中断的触发。
- led灯用于监测是否中断复位
- 串口打印初始化、中断信息、喂狗(也可以)
- 按键用于模拟中断死机,增加一个死循环
2、cubmx配置
(1)配置串口UART1、ledPF9、wwdg、rcc、按键输入中断PA0
(2)配置寄存器
8分频,一个周期42Mhz/8。其中上窗口值是90,下窗口值是64,计数器127
(3) wwdg需要抢占中断,优先级需要高一点。
(4)PA0中断设置
3、编程思路
(1)main.c 函数中定期喂狗,思路:获取设置的上窗口值,计数器的值小于上窗口的值,进行喂狗
int fputc(int ch, FILE *p)
{
while(!(USART1->SR & (1<<7)));
USART1->DR = (uint8_t) ch;
return ch;
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
*
* @retval None
*/
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t t6,w6;
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_WWDG_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("wwdg test\r\n");
/* USER CODE END 2 */
w6 = WWDG->CFR & 0x7f ; //获取我们设置的上窗口值
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
t6 = WWDG->CR & (0x7f);
if( t6<w6)//计数器的值小于上窗口的值,进行喂狗
{
HAL_WWDG_Refresh(&hwwdg);
printf("定期喂狗\r\n");
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
(2)it.c 提前唤醒中断,用了模拟保存数据;按键中断死循环模拟故障
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg){
printf("save your data\r\n");
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_0)
{
printf("程序故障\n");
while(1); //模拟故障死机
}
}
五、实验演示
窗口看门狗演示
六、总结
stm32独立看门狗和窗口看门狗的区别为:时钟源不同、中断不同、使用条件不同。
1、时钟源不同
(1)stm32独立看门狗:stm32独立看门狗使用的是内部专门的 32Khz低速时钟,不需要使能时钟操作。
(2)窗口看门狗:窗口看门狗使用的是 PCLK1的时钟,使用前需要先使能时钟。
2、中断不同
(1)stm32独立看门狗:stm32独立看门狗没有中断,超时直接复位。
(2)窗口看门狗:窗口看门狗可以在中断中做复位前的函数操作。
3、使用条件不同
(1)stm32独立看门狗:stm32独立看门狗一般用于避免程序跑飞或者死循环。
(2)窗口看门狗:窗口看门狗避免程序不安预定逻辑执行,比如先于理想环境完成,或者后于极限时间超时。