如何设计STM32单片机独立看门狗程序?
扫描二维码
随时随地手机看文章
今天要学习的是独立看门狗,看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其 工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的 这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不 能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相 连的引脚上送出一个复位信号,使单片机发生复位。即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。
1.1独立看门狗简介
看门狗定时器 (WDT,Watch Dog Timer)是单片机的组成部分,它实际上是一个计数器,一般 给看门狗一个数值,程序开始运行后看门狗开始倒计时。如果程序运行正常,过一段时间CPU应发 出指令让看门狗复位,重新开始计数,也就是所谓的“喂狗”。如果看门狗减到0就认为程序没有正常 工作,强制整个系统复位。独立看门狗由专用低速时钟(LSI)驱动,计时主时钟发生故障它也仍然 有效。 看门狗主要是用于在发生系统软件故障时,将系统复位。也可以用于将系统从休眠或空闲模式唤 醒。IWDG主要应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度 要求较低的场合。
1.2独立看门狗功能描述
独立看门狗是自由运行的递减计数器,时钟由独立的RC振荡器提供(可在停止和待机模式下工 作),看门狗被激活后,在计数器计数到0x000时产生复位。 在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。无论何 时,只要在键寄存器IWDG_KR中写入0xAAAA,IWDG_RLR中的值就会被重新加载到计数器,从而 避免产生看门狗复位。
其中,预分频寄存器(IWDG_PR),最低三位PR[2:0](Prescaler divider)有效,可设置有8种不同的计数器时钟预分频因子。
重装载寄存器(IWDG_RLR)低12位RL[11:0]: 看门狗计数器重装载值 (Watchdog counter reload value) 有效,用来设置计数器的重装载值。
注意要设置以上两个寄存器的值需满足两个条件,详见如下:
键寄存器(IWDG_KR),用来控制去除IWDG_PR和IWDG_RLR写保护功能以便正常写值,向此寄存器写入0x5555则暂时去除IWDG_PR和IWDG_RLR的写保护功能才可向两个寄存器中写值。
当向此寄存器写入0xAAAA则IWDG_RLR的值会重装载,防止MCU复位,向入0xCCCC是开启狗立看门狗动作。
状态寄存器(IWDG_SR)最低两位有效RVU: 看门狗计数器重装载值更新 (Watchdog counter reload value update) 标识位和PVU: 看门狗预分频值更新 (Watchdog prescaler value update) 标识位,分别用来指示此时是否可向IWDG_RLR 和 IWDG_PR写值,此寄存器由硬件置1与清0,只有当为0时才可向上面两个寄存器写值。
窗口看门狗中断函数是在递减计数器减少到0x40是被调用,因为它本身计数就比较慢,所以离数到0x3F复位还有一段时间,我认为这样设计是为MCU复位之前留下一点时间,能够使工程设计人员根据需要在中断函数保存一些重要的数据,这样在复位后MCU可知道系统因异常复位的某此状态,以使系统有更高稳定性。
控制寄存器(WWDG_CR)中的值必须在0xFF与0xC0之间, 因为它的第0至第6位为递减计数器CNT,在它的第6位变为0时将产生复位,所以在初始化时需要为1,第7位WDGA是用来设置启动或禁止窗口看门狗的,当为1进才会启动窗口看门狗,所以第6和第7位都需为1,即WWDG_CR 的值需要大于等于0xC0 。配置寄存器(WWDG_CFR) 第0至第6位 是设置窗口边界值用的,只有当递减计数器CNT的值小于边界值时才可以喂狗,过早不行,狗还不饿,撑死了。
并且我觉得在窗口看门狗中断函数中喂狗没有什么意义,程序本来已经不按正常运行了,还在中断函数中喂狗防止复位只会错上加错,不好好利用它干点正事,更是浪费资源。