STM32
登录
直播中
ronga245
12年用户
590经验值
私信
关注
[问答]
独立看门狗IWDG的结构是如何构成的
开启该帖子的消息推送
独立看门狗
IWDG
配置
独立看门狗IWDG的结构是如何构成的?
怎样对独立看门狗IWDG进行配置?有哪些步骤?
回帖
(1)
李冬梅
2021-9-22 16:28:25
看门狗简介
看门狗外设:
独立/窗口看门狗,均可用于检测并解决由软件错误导致的故障,由 VDD 电压域供电,在停止模式和待机模式下仍能工作。
看门狗分类:
(1)窗口看门狗 WWDG:
(2)独立看门狗 IWDG:
独立看门狗可以看做一个 12 位递减计数器,计数器从某一个值递减到 0 时(如果看门狗已激活)系统就会产生一次复位。如果在计数器递减到 0 之前刷新了计数器值,那么系统就不会产生复位。
喂狗:刷新计数器值的过程
TIP:IWDG 在一旦启用,就不能再被关闭,想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧存在。所以不用 IWDG 的话,就不要去打开它
IWDG 结构框图
(1)IWDG 时钟
由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持工作状态。 LSI其频率一般在 30-60KHz 之间,通常选择 40KHz 作为IWDG 时钟。且时钟频率并不非常精确,所以独立看门狗只适用于对时间精度要求比较低的场合。
(2)预分频器寄存器
LSI 时钟并不直接提供给计数器时钟,而通过一个 8 位预分频寄存分频后输入给计数器时钟。
分频因子: 4、8、16、32、64、128、256。
分频后的计数器时钟:CK_CNT= 40/ 4*2^PRE,PRE 为预分频系数(0-6), 4*2^PRE 大小就是 4、8、16、32、64、128、256 值。每经过一个计数器时钟,计数器就减 1。
(3)计数器
12 位的递减计数器,计数最大值为 0XFFF,递减到 0 时,产生一个复位信号,让系统重新启动运行,如果在计数器减到 0 之前刷新了计数器值的话,就不会产生复位信号
(4)重装载寄存器
12 位的寄存器,装着要刷新到计数器的值,值的大小决定独立看门狗的溢出时间。
溢出时间 Tout = (4*2^pre) / 40 * rlr(ms)
pre 是预分频器系数(0-6)
rlr 是重装载寄存器的值,公式内的 40 是独立看门狗的时钟。
(5)标号 5:密钥寄存器(IWDG_KR)
也称为关键字寄存器或键寄存器。是 IWDG 的一个控制寄存器。往该寄存器写入三种值会有三种控制效果:
①写入 0X5555,IWDG_PR 和 IWDG_RLR 寄存器具有写访问保护。若要修改寄存器,必须首先对 IWDG_KR 寄存器写入代码 0x5555。若写入其他值将重启写保护。
②写入 0XAAAA,把 IWDG_RLR 寄存器内值重装载到计数器中。
③写入 0XCCCC,启动 IWDG 功能。此方式属于软件启动,一旦开启独立看门狗,它就关不掉,只有复位才能关掉。
(6)标号 6:状态寄存器 IWDG_SR
只有位 0: PVU 和位 1: RVU 有效,这两位只能由硬件操作。
RVU:看门狗计数器重装载值更新,硬件置 1 表示重装载值的更新正在进行中,更新完毕之后由硬件清 0。
PVU: 看门狗预分频值更新,硬件置 1表示预分频值的更新正在进行中,当更新完成后,由硬件清 0。
IWDG 配置步骤
开启寄存器访问(给 IWDG_KR 寄存器写入 0X5555)
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护
设置 IWDG 预分频系数和重装载值
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值
计算溢出时间: Tout = (4*2^pre) / 40 * rlr
重载计数器值(喂狗)(给 IWDG_KR 寄存器写入 0XAAAA)
IWDG_ReloadCounter(); //重装载初值
开启 IWDG(给 IWDG_KR 寄存器写入 0XCCCC)
要使用独立看门狗,我们还需要打开它,开启 IWDG 的库函数是:
IWDG_Enable(); //打开独立看门狗
` IWDG 初始化函数
void IWDG_Init(u8 pre,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护
IWDG_SetPrescaler(pre);//设置预分频系数 0-6
IWDG_SetReload(rlr);//设置重装载值
IWDG_ReloadCounter(); //重装载初值
IWDG_Enable(); //打开独立看门狗
}
喂狗就是重载初始值,可以和按键联动
void IWDG_FeedDog(void) //喂狗
{
IWDG_ReloadCounter(); //重装载初值
}
看门狗简介
看门狗外设:
独立/窗口看门狗,均可用于检测并解决由软件错误导致的故障,由 VDD 电压域供电,在停止模式和待机模式下仍能工作。
看门狗分类:
(1)窗口看门狗 WWDG:
(2)独立看门狗 IWDG:
独立看门狗可以看做一个 12 位递减计数器,计数器从某一个值递减到 0 时(如果看门狗已激活)系统就会产生一次复位。如果在计数器递减到 0 之前刷新了计数器值,那么系统就不会产生复位。
喂狗:刷新计数器值的过程
TIP:IWDG 在一旦启用,就不能再被关闭,想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧存在。所以不用 IWDG 的话,就不要去打开它
IWDG 结构框图
(1)IWDG 时钟
由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持工作状态。 LSI其频率一般在 30-60KHz 之间,通常选择 40KHz 作为IWDG 时钟。且时钟频率并不非常精确,所以独立看门狗只适用于对时间精度要求比较低的场合。
(2)预分频器寄存器
LSI 时钟并不直接提供给计数器时钟,而通过一个 8 位预分频寄存分频后输入给计数器时钟。
分频因子: 4、8、16、32、64、128、256。
分频后的计数器时钟:CK_CNT= 40/ 4*2^PRE,PRE 为预分频系数(0-6), 4*2^PRE 大小就是 4、8、16、32、64、128、256 值。每经过一个计数器时钟,计数器就减 1。
(3)计数器
12 位的递减计数器,计数最大值为 0XFFF,递减到 0 时,产生一个复位信号,让系统重新启动运行,如果在计数器减到 0 之前刷新了计数器值的话,就不会产生复位信号
(4)重装载寄存器
12 位的寄存器,装着要刷新到计数器的值,值的大小决定独立看门狗的溢出时间。
溢出时间 Tout = (4*2^pre) / 40 * rlr(ms)
pre 是预分频器系数(0-6)
rlr 是重装载寄存器的值,公式内的 40 是独立看门狗的时钟。
(5)标号 5:密钥寄存器(IWDG_KR)
也称为关键字寄存器或键寄存器。是 IWDG 的一个控制寄存器。往该寄存器写入三种值会有三种控制效果:
①写入 0X5555,IWDG_PR 和 IWDG_RLR 寄存器具有写访问保护。若要修改寄存器,必须首先对 IWDG_KR 寄存器写入代码 0x5555。若写入其他值将重启写保护。
②写入 0XAAAA,把 IWDG_RLR 寄存器内值重装载到计数器中。
③写入 0XCCCC,启动 IWDG 功能。此方式属于软件启动,一旦开启独立看门狗,它就关不掉,只有复位才能关掉。
(6)标号 6:状态寄存器 IWDG_SR
只有位 0: PVU 和位 1: RVU 有效,这两位只能由硬件操作。
RVU:看门狗计数器重装载值更新,硬件置 1 表示重装载值的更新正在进行中,更新完毕之后由硬件清 0。
PVU: 看门狗预分频值更新,硬件置 1表示预分频值的更新正在进行中,当更新完成后,由硬件清 0。
IWDG 配置步骤
开启寄存器访问(给 IWDG_KR 寄存器写入 0X5555)
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护
设置 IWDG 预分频系数和重装载值
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值
计算溢出时间: Tout = (4*2^pre) / 40 * rlr
重载计数器值(喂狗)(给 IWDG_KR 寄存器写入 0XAAAA)
IWDG_ReloadCounter(); //重装载初值
开启 IWDG(给 IWDG_KR 寄存器写入 0XCCCC)
要使用独立看门狗,我们还需要打开它,开启 IWDG 的库函数是:
IWDG_Enable(); //打开独立看门狗
` IWDG 初始化函数
void IWDG_Init(u8 pre,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护
IWDG_SetPrescaler(pre);//设置预分频系数 0-6
IWDG_SetReload(rlr);//设置重装载值
IWDG_ReloadCounter(); //重装载初值
IWDG_Enable(); //打开独立看门狗
}
喂狗就是重载初始值,可以和按键联动
void IWDG_FeedDog(void) //喂狗
{
IWDG_ReloadCounter(); //重装载初值
}
举报
更多回帖
rotate(-90deg);
回复
相关问答
独立看门狗
IWDG
配置
如何对
独立
看门狗
(
IWDG
)进行配置
2021-08-11
1204
一文弄懂到底什么是
独立
看门狗
IWDG
2021-08-23
1493
怎么去使用
独立
看门狗
(
IWDG
)
2021-08-13
1107
怎么用
独立
看门狗
IWDG
2021-09-23
776
如何去使用
独立
看门狗
IWDG
2021-09-24
1175
浅析
IWDG
独立
看门狗
2021-09-23
697
有关
独立
看门狗
(
IWDG
)的基本知识汇总
2021-08-02
1182
独立
看门狗
(
IWDG
)的主要特性是什么?
2021-07-27
1077
怎样去编写
独立
看门狗
(
IWDG
)的代码
2021-08-11
1618
IWDG
独立
看门狗
和WWDG
独立
看门狗
的功能是什么?
2021-09-18
1075
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分