目录
IWDG简介
IWDG介绍
IWDG,Independent Watch Dog 独立看门狗
IWDG的本质是能产生系统复位信号的计数器
IWDG的特性:
递减的计数器
IWDG时钟由独立的RC振荡器,可在待机和停止模式下运行。
看门狗被激活后,当递减计数器计数到0x00时产生复位
喂狗是指计数器计数到0之前,重载计数器的值,防止复位
Reset and Clock.,RCC,复位和时钟控制器
Clock Status Register,CSR,时钟状态寄存器
除了复位和时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器以外,系统复位将复位所有寄存器至它们的复位状态。
当发生以下任一事件时,产生一个系统复位:
1、NRST引脚上的低电平(外部复位)
2、窗口看门狗计数终止(WWDG复位)
3、独立看门狗计数终止(IWDG复位)
4、软件复位(SW复位)
5、低功耗管理复位
IWDG有什么作用
IWDG通常用于产品异常情况下的复位功能,比如外界电磁干扰或者硬件软件问题导致程序跑飞的情况,适合高稳定性的产品和对时间精度要求较低的场合。IWDG的时钟源是独立的RC震荡器,时钟源不稳定时间精度较低
独立看门狗是异常处理的最后手段,不可依赖,在设计时应尽量避免
IWDG工作原理
IWDG是递减计数器,既然是计数器就需要时钟
Src CLK指代时钟源,也就是RC震荡器
RC振荡器提供的时钟信号经过PSC预分频器得到IWDG CLK,也就是工作时钟
工作时钟信号到递减计数器,减到0后复位,或者喂狗操作防止复位
Prescaler,PSC,预分频器
Count,CNT,计数器
IWDG框图和寄存器
![](https://img-blog.csdnimg.cn/direct/03399ac9b85043829cf8ec5022494c86.png)
启用IWDG后,LSI时钟会自动开启
LSI时钟频率并不精确,F1用40kHz,F4/F7/H7用32kHz进行计算即可
LSI,Low Speed Inner,低速内部振荡器(时钟)
LSI产生时钟源,8位预分频器的分频值由IWDG_PR寄存器设置
时钟信号经过分频后,到达递减计数器(12位,最大值4096),递减到0后IWDG复位
如果递减到0之前重载寄存器对递减计数器重装载值,则不会复位
设置分频值和重载值都会有一个状态位,给到IWDG_SR寄存器
设置重装载值之前还要由密钥寄存器IWDG_KR来进行解锁
IWDG寄存器
IWDG相关的寄存器有4个,分别是
键寄存器IWDG_KR
预分频寄存器IWDG_PR
重装载寄存器IWDG_RLR
状态寄存器IWDG_SR
键寄存器IWDG_KR
键寄存器IWDG_KR是32位寄存器,高16位保留,低16位只写,写入不同的键值实现不同的功能,读出值固定0x0000
软件写入0xAAAA,就是喂狗,将重载寄存器IWDG_RLR的值载入递减计数器
写入0x5555表示解除IWDG_PR和IWDG_RLR寄存器的写访问保护,也就是允许访问
写入0xCCCC表示启动看门狗工作(若选择硬件看门狗则不受此命令字限制)
关于硬件看门狗和软件看门狗的选择,参考STM32FXXX闪存编程手册,查找用户选择/选项字节相关内容。以F1系列为例,USER寄存器的位16用来设置硬件/软件看门狗,硬件看门狗在系统复位以后自己启动,并且不能关闭,软件看门狗则不会自己启动,由IWDG_KR寄存器控制
预分频寄存器IWDG_PR
预分频寄存器IWDG_PR是32位寄存器,低3位有效。000、001、010…依次代表预分频因子=4、8、16…
重装载寄存器IWDG_RLR
重装载寄存器IWDG_RLR是16位寄存器,高4位保留,低12位有效,用来存储重装载值,最大值为4096。只有键值寄存器IWDG_KR写入0xAAAA时,IWDG_RLR寄存器的值才会被重装载到递减计数器中;只有在键值寄存器IWDG_KR写入0x5555时,预分频计数器IWDG_PR和重装载寄存器IWDG_RLR才可写。
状态寄存器IWDG_SR
状态寄存器IWDG_SR时32位寄存器,低2位有效‘
位0表示看门狗预分频值更新
位1表示看门狗重装载值更新
就是这俩位一个控制IWDG_PR的可写状态,一个控制IWDG_RLR的可写状态
要写的时候对应位置1,写完对应位自动清零
IWDG溢出时间计算
看门狗溢出时间 = (预分频系数*重装载值)/看门狗时钟源频率
![](https://img-blog.csdnimg.cn/direct/573f18a785ee42269a9512ee834992fe.png)
计数 1 次为最短时间,计数 4096 为最大时间
IWDG配置步骤
IWDG配置步骤
取消 PR、RLR 寄存器写保护,设置IWDG预分频系数和重装在值,启动IWDG
HAL_IWDG_Init()
1、在键寄存器IWDG_KR中写入0x5555
来使能预分频器寄存器 IWDG_PR和重装载寄存器IWDG_RLR的访问
2、设置预分频器寄存器IWDG_PR
3、设置重装载寄存器IWDG_RLR
4、等待状态寄存器IWDG_SR更新为0x0000 0000,也就是PR和RLR设置操作完成
5、在键寄存器IWDG_KR中写入0xCCCC
来使能IWDG
喂狗
HAL_IWDG_Refresh()
6、在键寄存器IWDG_KR中写入0xAAAA,刷新计数器的值为 IWDG_RLR的值
![](https://img-blog.csdnimg.cn/direct/bfdf2d8ab80b44eeb75d880f53cb0101.png)
主要参数 一个是 xx外设的句柄 xxx_HandleTypeDef,另一个是xxx外设的初始化结构体
句柄xxx_HandlerTypeDef 通常包括
外设的基地址 xxx_TypeDef 和初始化结构体xxx_InitTypeDef
窗口寄存器IWDG_WINR(F7/H7)
在F7/H7系列的IWDG初始化结构体IWDG_InitTypedef中,除了预分频值(PR)和重装载值(RLR),还有窗口值,对应窗口寄存器(IWDG_WINR)。窗口寄存器(WINR)和预分频寄存器(PR)、重装载寄存器(RLR)一样,由键寄存器(KR)的0x5555指令控制写使能。
窗口寄存器WINR为32位寄存器,低12位有效。最大4028
当递减计数器的值低于窗口计数器的值,且大于0时,才允许喂狗操作,否则不许喂狗
![](https://img-blog.csdnimg.cn/direct/781d8b172fe64389975611447d87c8db.png)
![](https://img-blog.csdnimg.cn/direct/a7cf897cf18d403399f6a4b8db53af02.png)