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 / T5:0 + 1 WWDG早喂狗界限:APB1时钟频率 / 4096 / 分频系数 + 1 / W5: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 入参:W6:0值 返回值:无

  • 函数调用示例:

复制代码
WWDG_SetWindowValue(0x40 | 21); 

WWDG使能函数:

  • 函数使用: 函数:WWDG_Enable 入参:T6:0值 返回值:无

  • 函数调用示例:

复制代码
WWDG_Enable(0x40 | 54); 

WWDG喂狗函数:

  • 函数使用: 函数:WWDG_SetCounter 入参:T6: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);								
}
相关推荐
糖糖单片机设计7 小时前
基于 STM32 与中移 OneNet 的智慧电梯监控平台系统
stm32·单片机·嵌入式硬件·51单片机·语音识别
创界工坊工作室10 小时前
55-基于STC89C52宠物智能饲喂控制系统设计
stm32·单片机·嵌入式硬件·51单片机·proteus·宠物
极客 - L U13 小时前
卡尔曼滤波从零到精通
c语言·数据结构·单片机·嵌入式硬件·mcu
AMASENSYS艾马斯14 小时前
变频器滤波器选型与EMC合规建议
驱动开发·单片机·其他·硬件工程·精益工程
Zw-awa16 小时前
编译器工具链:GCC、Clang、MSVC、ICC、armclang
stm32
凯基迪科技17 小时前
STM32G系列(G0/G4)芯片解密程序提取RDP读保护解析
网络·stm32·安全
2501_9226395818 小时前
率能半导体 SS6628E直流双向马达驱动芯片:20V/7A,覆盖电子锁、玩具、无线充电、机器人四大应用场景
单片机·嵌入式硬件·硬件工程
硅基造物主18 小时前
STM32 从 0 到 1 做智能家居(五):工程结构与代码骨架
stm32·单片机·嵌入式硬件·智能家居
深圳老胡18 小时前
STM32F103 硬件 SPI 与软件 IO 模拟 SPI 最高速度差异详解
笔记·stm32·单片机·代码规范·1024程序员节
smartpi_ai19 小时前
机芯智能离线语音模块实战问答:SU-03T、CI-03T、SU-63T 与 JX-A7T 高频问题排查
人工智能·单片机·嵌入式硬件·ci/cd·语音识别