STM32-看门狗 10
看门狗简介
看门狗前置
看门狗定义: 监控程序运行状态,程序出现卡死或跑飞的现象,看门狗会复位程序
看门狗:
-
工作逻辑: 本质是一个向下计数定时器,一定时间内,程序没有执行喂狗重置计数器,看门狗硬件电路就会产生自动复位信号
-
看门狗分类 独立看门狗(IWDG):依靠LSI工作,即使主时钟发生故障或停止,IWDG 依然能继续工作,这也是它被称为系统“最后一道防线”的原因。对时间精度要求低,只有喂狗最晚界限
窗口看门狗(WWDG):使用APB1系统时钟,有喂狗最早与最晚界限,要求看门狗在精确计时窗口起作用
-
IWDG键寄存器 通过在整个键寄存器写入特定值,来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率
启用独立_门狗 0xCCCC IWDG_RLR中的值重新加载到计数器(喂狗) 0xAAAA 解除IWDG_PR和IWDC_RLR的写仅护 0x5555 启用IWDG_PR和IWDG_RLR的写护 0x5555之外的其他值
-
看门狗溢出频率 IWDG:LSI时钟频率 / 分频系数 + 1 / 重装载值 + 1 WWDG晚喂狗界限:APB1时钟频率 / 4096 / 分频系数 + 1 / T[5:0] + 1 WWDG早喂狗界限:APB1时钟频率 / 4096 / 分频系数 + 1 / W[5:0] + 1 注意 IWDG与WWDG根据设定喂狗时间,选择分频系数 WWDG固定进行一次4096分频
//WWDG WDGTB 1 2 3 最小超时值 113us 227us 455us 910us 最大超时值 7.28ms 14.56ms 29.12ms 58.25ms
-
看门狗喂狗方式 IWDG:写入键寄存器,重装固定值RLR WWDG:直接写入计数值,写多少重装多少
独立看门狗函数
IWDG写使能函数:
-
函数使用 函数:IWDG_WriteAccessCmd 入参:IWDG_WriteAccess_Enable / IWDG_WriteAccess_Disable 返回值:无
-
函数调用示例
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG设置预分配值函数:
-
函数使用 函数:IWDG_SetPrescaler 入参:IWDG_Prescaler_4 / IWDG_Prescaler_8 / IWDG_Prescaler_16......
返回值:无
-
函数调用示例
IWDG_SetPrescaler(IWDG_Prescaler_4);
IWDG设置重装载值函数:
-
函数使用 函数:IWDG_SetReload 入参:数值 返回值:无
-
函数调用示例
IWDG_SetReload(2499);
IWDG喂狗函数:
-
函数使用: 函数:IWDG_ReloadCounter 无参无返回值
-
函数调用示例:
IWDG_ReloadCounter();
IWDG启动函数:
-
函数使用: 函数:IWDG_Enable 无参无返回值
-
函数调用示例:
IWDG_Enable();
IWDG标志位: IWDG_GetFlagStatus函数: RCC_GetFlagStatus函数:
RCC_FLAG_IWDGRST:独立看门狗复位 RCC_FLAG_IWDGRST:窗口看门狗复位
-
函数调用示例:
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
独立看门狗模块函数
void IWDG_Init(void)
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(IWDG_Prescaler_16); IWDG_SetReload(2499); IWDG_ReloadCounter(); IWDG_Enable(); 1S得喂一次
喂狗
while (1)
{
//喂狗间隔为200+600=800ms
IWDG_ReloadCounter();
Delay_ms(800);
}
窗口看门狗函数
WWDG设置预分频函数:
-
函数使用: 函数:WWDG_SetPrescaler 入参:WWDG_Prescaler_1 / WWDG_Prescaler_2 / WWDG_Prescaler_4 / WWDG_Prescaler_8 返回值:无
-
函数调用示例:
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG设置窗口值函数:
-
函数使用: 函数:WWDG_SetWindowValue 入参:W[6:0]值 返回值:无
-
函数调用示例:
WWDG_SetWindowValue(0x40 | 21);
WWDG使能函数:
-
函数使用: 函数:WWDG_Enable 入参:T[6:0]值 返回值:无
-
函数调用示例:
WWDG_Enable(0x40 | 54);
WWDG喂狗函数:
-
函数使用: 函数:WWDG_SetCounter 入参:T[6:0]值 返回值:无
-
函数调用示例:
WWDG_SetCounter(0x40 | 54);
WWDG标志位: WWDG_GetFlagStatus函数: RCC_GetFlagStatus函数: RCC_FLAG_WWDGRST:窗口看门狗复位
窗口看门狗模块函数
void WWDG_Init(void)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); WWDG_SetPrescaler(WWDG_Prescaler_8); //设置预分频为8 WWDG_SetWindowValue(0x40 | 21); //喂狗早界限30ms WWDG_Enable(0x40 | 54); //喂狗晚界限50ms
喂狗
while (1)
{
Delay_ms(40);
WWDG_SetCounter(0x40 | 54);
}更多推荐



所有评论(0)