Day3--STM32看门狗

本文详细解读了独立看门狗(IWDG)和窗口看门狗的工作原理、关键寄存器操作、溢出时间计算,以及如何配置和喂狗以防止系统复位。同时介绍了两者在时钟故障保护和定时任务中的角色。

独立看门狗

独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效

(1)功能描述:

==在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)

==无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位

==如果程序异常,就无法正常喂狗,从而系统复位

键值寄存器IWDG_KR: 0~15位有效

预分频寄存器IWDG_PR:0~2位有效。具有写保护功能,要操作先取消写保护

重装载寄存器IWDG_RLR:0~11位有效。具有写保护功能,要操作先取消写保护。

状态寄存器IWDG_SR:0~1位有效

(2)库函数操作

void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置预分频系数:写PR
void IWDG_SetReload(uint16_t Reload);//设置重装载值:写RLR
void IWDG_ReloadCounter(void);//喂狗:写0xAAAA到KR
void IWDG_Enable(void);//使能看门狗:写0xCCCC到KR
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);//状态:重装载/预分频 更新
​

(3)操作步骤

//取消寄存器写保护:
    IWDG_WriteAccessCmd();
// 设置独立看门狗的预分频系数,确定时钟:
    IWDG_SetPrescaler();
//设置看门狗重装载值,确定溢出时间:
    IWDG_SetReload();
//使能看门狗
    IWDG_Enable();
//应用程序喂狗:
    IWDG_ReloadCounter();
​
//溢出时间计算:
  // Tout=((4×2^prer) ×rlr) /40 (M3)
​
//比如我们设定 prer 值为 4,rlr 值为 625,那么就可以得到 Tout=64×625/40=1000ms,这样,
//看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不
//会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准
//确的 40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位
​

窗口看门狗

窗口看门狗时钟来源PCLK1(APB1总线时钟)分频后。之所以称为窗口就是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。

工作示意图:

T[6:0]就是 WWDG_CR (控制寄存器)的低七位,W[6:0]即是 WWDG->CFR 的低七位。T[6:0] 就是窗口看门狗的计数器,而 W[6:0]则是窗口看门狗的上窗口,下窗口值是固定的(0X40)。 当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。

上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保 窗口值大于 0X40,否则窗口就不存在了

启动位:该位由软件置 1,以启动看门狗,并且一定要注意的是该 位一旦设置,就只能在硬件复位后才能清零了。

MCU复位的两种情况:

(1)当喂狗的时候如果计数器的值大于某一设定数值W[6:0]时,此设定数值在WWDG_CFR(配置)寄存器定义

(2)当计数器的数值从0x40减到0x3F时【T6位跳变到0】

配置过程:

//使能看门狗时钟:
     RCC_APB1PeriphClockCmd();
//设置分频系数:
     WWDG_CNT=tr&WWDG_CNT;   //WWDG_CNT用来保存初始的WWDG_CR计算器的值
     WWDG_SetPrescaler();
//设置上窗口值:
     WWDG_SetWindowValue();
//开启提前唤醒中断并分组(可选):
     WWDG_EnableIT();   
     NVIC_Init();
//使能看门狗:
     WWDG_Enable();
//喂狗:
     WWDG_SetCounter();
//编写中断服务函数
     WWDG_IRQHandler();
​
​
//窗口看门狗的超时公式如下:
//Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
//其中:
//Twwdg:WWDG 超时时间(单位为 ms)
//Fpclk1:APB1 的时钟频率(单位为 Khz)
//WDGTB:WWDG 的预分频系数
//T[5:0]:窗口看门狗的计数器低 6 位
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值