网站开发阶段,要看网海外域名是多少,云网站建站,整站下载器 做网站地图学习来源-----江协科技STM32
WDG简介
WDG#xff08;Watchdog#xff09;看门狗看门狗可以监控程序的运行状态#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因#xff0c;出现卡死或跑飞现象时#xff0c;看门狗能及时复位程序#xff0c;避免程序陷入长… 学习来源-----江协科技STM32
WDG简介
WDGWatchdog看门狗看门狗可以监控程序的运行状态当程序因为设计漏洞、硬件故障、电磁干扰等原因出现卡死或跑飞现象时看门狗能及时复位程序避免程序陷入长时间的罢工状态保证系统的可靠性和安全性看门狗本质上是一个定时器当指定时间范围内程序没有执行喂狗重置计数器操作时看门狗硬件电路就自动产生复位信号STM32内置两个看门狗独立看门狗IWDG独立工作对时间精度要求较低窗口看门狗WWDG要求看门狗在精确计时窗口起作用
STM32F10xxx内置两个看门狗提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障当计数器达到给定的超时值时触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
IWDG最适合应用于那些需要看门狗作为一个在主程序之外能够完全独立工作并且对时间精度要求较低的场合。 WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。
IWDG主要性能
● 自由运行的递减计数器
● 时钟由独立的RC振荡器提供(可在停止和待机模式下工作)
● 看门狗被激活后则在计数器计数至0x000时产生复位 IWDG框图 1. 核心模块组成
寄存器模块 预分频寄存器IWDG_PR配置 8 位预分频器参数对输入时钟LSI进行分频调整计数器计数频率。重装载寄存器IWDG_RLR存储 12 位重装载数值用于初始化 12 位递减计数器的计数初值。键寄存器IWDG_KR写入特定命令如启动看门狗、喂狗操作控制看门狗功能的开启与重置。状态寄存器IWDG_SR记录看门狗状态标志如计数器溢出标志供软件查询。 时钟与计数模块 LSI 时钟输入采用 40 kHz 的低速内部时钟LSI作为独立看门狗的时钟源确保在主时钟故障时仍能工作。8 位预分频器对 LSI 时钟分频输出给 12 位递减计数器扩展计数周期。12 位递减计数器根据预分频后的时钟递减计数当计数到 0 时触发 IWDG 复位。
2. 工作流程
初始化配置通过 IWDG_PR 设置预分频系数通过 IWDG_RLR 设置重装载值通过 IWDG_KR 写入命令启动看门狗。计数与喂狗计数器在预分频时钟驱动下递减若系统正常运行需定期通过 IWDG_KR 执行 “喂狗”写入特定值重新装载计数器初值避免计数到 0。复位触发若未及时喂狗计数器递减至 0 时触发 IWDG 复位信号强制系统重启。
3. 供电特性
图中红色标注强调独立看门狗功能位于 VDD 供电区即使系统进入停机或待机模式仍能正常工作确保在低功耗模式下也能监控系统状态提升可靠性。 IWDG键寄存器 键寄存器本质上是控制寄存器用于控制硬件电路的工作 在可能存在干扰的情况下一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能以降低硬件电路受到干扰的概率 写入键寄存器的值 作用 0xCCCC 启用独立看门狗 0xAAAA IWDG_RLR中的值重新加载到计数器喂狗 0x5555 解除IWDG_PR和IWDG_RLR的写保护 0x5555之外的其他值 启用IWDG_PR和IWDG_RLR的写保护
键寄存器IWDG_KR是独立看门狗IWDG的核心控制寄存器通过写入特定指令码实现以下功能
启动看门狗向 IWDG_KR 写入 0xCCCC激活独立看门狗使能内部 12 位递减计数器开始工作。喂狗操作重装载计数器系统正常运行时需定期写入 0xAAAA触发计数器重新装载重装载寄存器IWDG_RLR 中的初始值避免计数器递减至 0 引发复位。寄存器写使能写入 0x5555 可临时使能对 预分频寄存器IWDG_PR 和 重装载寄存器IWDG_RLR 的写权限允许修改预分频系数或重装载值完成配置后写权限自动关闭保障寄存器配置的安全性。
IWDG_KR 通过特定指令码实现对看门狗的启动、喂狗及寄存器配置控制是软件与硬件看门狗交互的关键接口。 IWDG超时时间
写程序的时候超时时间要设置多少要根据自己的项目来设置 如果没有特别要求卡死后过个一两秒再复位也不影响的话那这个超时时间可以设置大一点
超时时间TIWDG TLSI × PR预分频系数 × (RL 1)其中TLSI 1 / FLSI WWDG简介
窗口看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新看门狗电路在达到预置的时间周期时会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前如果7位的递减计数器数值(在控制寄存器中)被刷新 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。
WWDG功能描述
如果看门狗被启动(WWDG_CR寄存器中的WDGA位被置’1’) 并且当7位(T[6:0])递减计数器从0x40翻转到0x3F(T6位清零)时则产生一个复位。如果软件在计数器值大于窗口寄存器中的数值时重新装载计数器将产生一个复位。 WWDG工作特性 递减计数器T[6:0]的值小于0x40时WWDG产生复位递减计数器T[6:0]在窗口W[6:0]外被重新装载时WWDG产生复位递减计数器T[6:0]等于0x40时可以产生早期唤醒中断EWI用于重装载计数器以避免WWDG复位定期写入WWDG_CR寄存器喂狗以避免WWDG复位 该窗口看门狗时序图展示了计数器递减过程、刷新窗口限制及复位触发逻辑具体解读如下
1. 计数器递减过程
T [6:0] 递减计数器从初始值开始持续递减横坐标为时间纵坐标为计数器值。关键阈值 W [6:0]窗口值预设的上限阈值定义 “不允许刷新” 与 “刷新窗口” 的分界。0x3Fh计数器的下限阈值T6 位变为 0若此时未完成喂狗触发复位。
2. 刷新窗口限制
不允许刷新区间计数器值 W[6:0] 时若执行 “喂狗”刷新计数器会触发复位。这是因为此时刷新属于 “窗口外操作”违背时序要求。刷新窗口区间计数器值处于 W[6:0] ~ 0x3Fh 时允许通过写寄存器更新计数器合法喂狗避免计数器递减至 0x3Fh 触发复位。
3. T6 位与复位触发
T6 位变化当计数器递减至 0x3Fh 时T6 位从 1 变为 0。复位逻辑若计数器到达 0x3Fh 仍未喂狗硬件触发复位信号强制系统重启确保程序异常时恢复运行 WWDG超时时间
要根据自己的项目要求来设置确定想要设置的超时时间最晚时间和窗口时间最晚时间
超时时间
TWWDG TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] 1)
窗口时间
TWIN TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0])其中TPCLK1 1 / FPCLK1 1/36MHz 计算方法和IDWG看门狗一样 IWDG和WWDG对比 IWDG独立看门狗 WWDG窗口看门狗 复位 计数器减到0后 计数器T[5:0]减到0后、过早重装计数器 中断 无 早期唤醒中断 时钟源 LSI40KHz PCLK136MHz 预分频系数 4、8、32、64、128、256 1、2、4、8 计数器 12位 6位有效计数 超时时间 0.1ms~26214.4ms 113us~58.25ms 喂狗方式 写入键寄存器重装固定值RLR 直接写入计数器写多少重装多少 防误操作 键寄存器和写保护 无 用途 独立工作对时间精度要求较低 要求看门狗在精确计时窗口起作用 独立看门狗程序
初始化IWDG ①开启LSI时钟(但是不需我们手动开启) ②写入键值0x5555解除写保护然后再写入预分频值和重装载值
③写入键寄存器0xCCCC启动独立看门狗
④然后再主循环执行喂狗操作
int main(void)
{OLED_Init(); //OLED初始化Key_Init(); //按键初始化OLED_ShowString(1, 1, IWDG TEST);/*判断复位信号来源*/if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) SET) //如果是独立看门狗复位{OLED_ShowString(2, 1, IWDGRST); //OLED闪烁IWDGRST字符串Delay_ms(500);OLED_ShowString(2, 1, );Delay_ms(100);RCC_ClearFlag(); //清除标志位}else //否则即为其他复位{OLED_ShowString(3, 1, RST); //OLED闪烁RST字符串Delay_ms(500);OLED_ShowString(3, 1, );Delay_ms(100);}/*IWDG初始化*/IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //独立看门狗写使能IWDG_SetPrescaler(IWDG_Prescaler_16); //设置预分频为16IWDG_SetReload(2499); //设置重装值为2499独立看门狗的超时时间为1000msIWDG_ReloadCounter(); //重装计数器喂狗IWDG_Enable(); //独立看门狗使能while (1){Key_GetNum(); //调用阻塞式的按键扫描函数模拟主循环卡死IWDG_ReloadCounter(); //重装计数器喂狗OLED_ShowString(4, 1, FEED); //OLED闪烁FEED字符串Delay_ms(200); //喂狗间隔为200600800msOLED_ShowString(4, 1, );Delay_ms(600);}
}
独立看门狗超时时间计算上面草稿有写如果不懂就跳转视频看看超时时间计算
相关函数 void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)//启用或禁用对IWDG_PR和IWDG_RLR寄存器的写访问 参数说明IWDG_WriteAccessIWDG_PR和IWDG_RLR寄存器写访问的新状态 void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)//设置IWDG预分频值 参数说明IWDG_Prescaler指定IWDG预分频器值 void IWDG_SetReload(uint16_t Reload)//设置IWDG 重装值 参数说明Reload指定IWDG的重装值该参数必须为0 ~ 0x0FFF之间的数字 void IWDG_ReloadCounter(void)//用重新加载寄存器中定义的值重新加载IWDG计数器 void IWDG_Enable(void)//启用IWDG开启对IWDG_PR和IWDG_RLR寄存器的写保护 FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)//检查是否设置了指定的RCC标志 参数说明RCC_FLAG指定要检查的标志 窗口看门狗
WWDG初始化
①开启窗口看门狗ABP1的时钟
②配置各个寄存器设置预分频和设置窗口值
③写入控制寄存器CR(包含看门狗使能位计数器标志溢出位计数器有效位)
④最后再运行过程中向计数器写入想要的计数重装值
int main(void)
{OLED_Init(); //OLED初始化Key_Init(); //按键初始化OLED_ShowString(1, 1, WWDG TEST);/*判断复位信号来源*/if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) SET) //如果是窗口看门狗复位{OLED_ShowString(2, 1, WWDGRST); //OLED闪烁WWDGRST字符串Delay_ms(500);OLED_ShowString(2, 1, );Delay_ms(100);RCC_ClearFlag(); //清除标志位}else //否则即为其他复位{OLED_ShowString(3, 1, RST); //OLED闪烁RST字符串Delay_ms(500);OLED_ShowString(3, 1, );Delay_ms(100);}/*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); //开启WWDG的时钟/*WWDG初始化*/WWDG_SetPrescaler(WWDG_Prescaler_8); //设置预分频为8WWDG_SetWindowValue(0x40 | 21); //设置窗口值窗口时间为30msWWDG_Enable(0x40 | 54); //使能并第一次喂狗超时时间为50mswhile (1){Key_GetNum(); //调用阻塞式的按键扫描函数模拟主循环卡死OLED_ShowString(4, 1, FEED); //OLED闪烁FEED字符串Delay_ms(20); //喂狗间隔为202040msOLED_ShowString(4, 1, );Delay_ms(20);WWDG_SetCounter(0x40 | 54); //重装计数器喂狗}
}超时时间和窗口时间计算和独立看门狗一样计算步骤 相关函数 void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)//设置WWDG预分频器 参数说明WWDG_Prescaler指定WWDG预分频器 void WWDG_SetWindowValue(uint8_t WindowValue)//设置WWDG窗口值 参数说明WindowValue指定要与下计数器进行比较的窗口值该参数必须小于0x80 void WWDG_SetCounter(uint8_t Counter)//设置WWDG计数器值 参数说明Counter看门狗计数器的值该参数必须为0x40 ~ 0x7F之间的数字 void WWDG_Enable(uint8_t Counter)//启用WWDG窗口看门狗并加载计数器值 参数说明Counter看门狗计数器的值该参数必须为0x40 ~ 0x7F之间的数字