STM32 内部自带了 2 个看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG)。
看门狗的最作用
在启动正常运行的时候,系统不能复位。在系统跑飞(程序异常执行)的情况,系统复位程序重新执行
独立看门狗
STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效
IWDG 寄存器与功能原理
键值寄存器 IWDG_KR
重装载寄存器 IWDG_RLR,0~11位有效。具有写保护功能,要操作先取消写保护。
预分频寄存器 IWDG_PR ,0~2位有效。具有写保护功能,要操作先取消写保护
状态寄存器 IWDG_SR,1位有效
独立看门狗功能描述
在键值寄存器(IWDG_KR)中写入 0xCCCC ,开始启用独立看门狗。此时计数器开始从其复位值OXFFF递减,当计数器值计数到尾值Ox000时会产生一个复位信号(IWDG_RESET)。 在键值寄存器IWDG KR中写入OxAAAA(通常说的喂狗),自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。 如果程序异常,就无法正常喂狗,从而系统复位。
IWDG 操作步骤
第一步:取消寄存器写保护,IWDG_WriteAccessCmd()
第二步:设置独立看门狗的预分频系数和重装载值
第三步:重载计数值喂狗 IWDG_ReloadCounter();
第四步: 启动看门狗
第五步: 创建喂独立看门狗的函数接口,void IWDG_Feed(void)
取消寄存器写保护,向 IWDG_KR 写入 0X5555
取消 IWDG_PR 和 IWDG_RLR 的写保护,使后面可以操作这两个寄存器,
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
设置预分频系数和重装载值
溢出时间计算公式
Tout=((4×2^prer) ×rlr) /40
其中 Tout 为看门狗溢出时间(单位为 ms),prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7,rlr为看门狗的重装载值(IWDG_RLR 的值)
比如我们设定 prer 值为 4,rlr 值为 625,那么就可以得到Tout=64×625/40=1000ms,这样, 看门狗的溢出时间就是 1s。
IWDG_SetPrescaler(prer); //设置IWDG预分频值
IWDG_SetReload(rlr); //设置IWDG重装载值
重载计数值喂狗,向 IWDG_KR 写入 0XAAAA
IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器
启动看门狗,向 IWDG_KR 写入 0XCCCC
注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开 IWDG
IWDG_Enable(); //使能 IWDG
创建喂独立看门狗的函数接口
void IWDG_Feed(void)
{
IWDG_ReloadCounter();//reload
}
窗口看门狗(WWDG)
和独立看门狗相比,窗口开门狗是有一个上下限,(W[6:0]是窗口看门狗的上窗口,下窗口值是固定的(0X40))。当在这个上下限以外喂狗,则都会复位,增加了安全性。
WWDG 寄存器与功能原理
控制寄存器(WWDG_CR)
T[6:0]用来存储看门狗的计数器值,每次减 1。当该计数器的值从 0X40 变为 0X3F 的时候,将产生看门狗复位。
T[7] WDGA位则是看门狗的激活位,该位由软件置 1,以启动看门狗,并且一定要注意的是该位一旦设置,就只能在硬件复位后才能清零了。
配置寄存器(WWDG_CFR)
位 9 是 EWI 是提前唤醒中断,是指在即将复位的前一次计数(T[6:0] = 0X40)会产生中断,此中断需要提前允许中断开启
状态寄存器(WWDG_SR)
该寄存器用来记录当前是否有提前唤醒的标志。 当计数器达到0x40h时,此位置由硬件置1,必须通过软件置0,对此写 1 无效,若此时中断未开启,也会被置 1
WWDG 操作步骤
第一步:WWDG时钟使能RCC_APB1PeriphClockCmd
第二步:设置窗口值和分频数
第三步:使能看门狗WWDG_Enable(tr); 像当与第一次喂狗
第四步:清除中断标志位WWDG_ClearFlag();
第五步:设置NVIC分组开启 WWDG 中断WWDG_EnableIT(); NVIC_Init()
第六步:编写中断服务函数,void WWDG_IRQHandler(void)
WWDG时钟使能
WWDG 不同于 IWDG, IWDG 有自己独立的 40Khz 时钟,不存在使能问题。而 WWDG 使用的是 PCLK1 的时钟,需要先使能时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
设置窗口值和分频数
窗口看门狗的超时公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1
Twwdg: WWDG 超时时间(单位为 ms)
Fpclk1: APB1 的时钟频率(单位为 Khz)
WDGTB: WWDG的预分频系数
T[5:0]:上窗口到翻转的时间
WWDG_SetWindowValue(wr); //设置窗口上限值
WWDG_SetPrescaler(fprer); //设置IWDG预分频值 WWDG_Prescaler_8
WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);
操作的配置寄存器(WWDG_CFR) 位8:7
使能看门狗
WWDG_Enable(tr);
清除中断标志位
WWDG_ClearFlag();
中断分组并开启 WWDG 中断
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占2,子优先级3,组2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //抢占2,子优先级3,组2
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);//NVIC初始化
WWDG_EnableIT(); //开启窗口看门狗中断
设置计数器初始值并使能看门狗
void WWDG_Enable(uint8_t Counter);
编写中断服务函数
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(0x7F); //当禁掉此句后,窗口看门狗将产生复位
WWDG_ClearFlag(); //清除提前唤醒中断标志位
LED1=!LED1;
}
推荐阅读最新更新时间:2024-11-06 10:30
设计资源 培训 开发板 精华推荐
- NCP59152DSADGEVB,用于 NCP59152 DC 到 DC 单输出电源的评估板
- AD5332 并行接口、双电压输出、8 位 DAC 的典型应用
- LTC1729CMS8-8.4 演示板,LT1510-5CGN 终端控制器/锂离子电池充电器,11.5V 至 28V 输入,8.4Vout @ 1A Max
- TB67H400ANG 大电流驱动有刷直流电机驱动器评估板
- LTC2261-14 演示板,14 位,125Msps ADC,CMOS 输出,5-170MHz
- Si3054/80-EVB,评估板专为调制解调器主板和线路侧子卡 (LDC) 应用而设计
- 【训练营】机器狗v0.0.1
- OP284FSZ 3V 单电源、50Hz 至 60Hz 有源陷波滤波器和假接地的典型应用
- MIKROE-3394,用于 ADS1115 高精度、低功耗、16 位模数转换器 (ADC) 的 ADC 8 Click 板
- 使用 Analog Devices 的 ADP5070A 的参考设计
- 【 有奖直播】 掌握潮流~TI DLP®技术在汽车上的创新及全新应用
- 6小时狂欢,谁是2016年TI杯全国大学生物联网设计竞赛最高人气王,你说了算!
- 追赶 WiFi 浪潮,看泰克技术讲座,答题好赢礼!
- ADI 新一期《模拟对话》上线,免费下载ing!
- 下载MPS汽车电机控制技术干货,赢【Keep体脂秤、自动洗手机套装、小米保温杯】,开启汽车技术进阶之旅!
- 安森美半导体移动与可穿戴设备解决方案下载有礼!
- BeagleBone Black 开发板 DIY 创意设计大赛
- 【EEWORLD第三十一届】2011年10月社区明星人物揭晓!
- 25美分实现25种功能的TI MSP430铁电超值微控制器方案即将直播!快来报名围观!