首页>>科技 >>内容

stm32硬件看门狗芯片,STM32单片机看门狗的配置方法

发布时间:2023-07-24 15:44:25编辑:温柔的背包来源:

很多朋友对stm32硬件看门狗芯片,STM32单片机看门狗的配置方法不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

stm32硬件看门狗芯片,STM32单片机看门狗的配置方法

SATM32 MCU的看门狗分为独立看门狗和窗口看门狗。两者的工作原理完全不同。今天我们就来看看它们的具体区别和配置方法。

STM32独立看门狗

由特殊的低速时钟(LSI)驱动,即使主时钟出现故障,它仍然可以有效,因此该狗可以工作在与主时钟无关的要求下,或者备用模块较差的情况下,因此被称为独立看门狗。注意,看门狗一旦打开,只能在MCU复位后才能清零,这样就不再工作了。

它的时钟是一个内部RC时钟,它会在30KHZ和60KHZ之间变化,不是精确的40KHZ,而是用于一般计算的40KHZ。

独立看门狗需要设置四个寄存器如下:

其中,预分频寄存器(IWDG_PR)中,最低三位PR[2:0](预分频器分频器)有效,可设置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写入值。该寄存器由硬件设置和清除。只有当为0时才可以向上述两个寄存器写入值。

其初始化过程大致如下:

//时间计算(大概) :Tout=((4*2^prer)*rlr)/40(ms)voidIWDG_Init(u8prer,u16rlr){IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(prer);IWDG_SetReload(rlr);IWDG_ReloadCounter();IWDG_Enable ();}

喂狗可以通过调用以下函数来完成:

IWDG_ReloadCounter();//重新加载

另外,注意不要使用硬件时钟中断来喂狗,因为硬件时钟中断一般优先级较高,并且独立于主控程序,所以有时主控程序可能会跑掉,但仍然可以正常喂狗。

独立看门狗可以在一定程度上监控程序的正常运行。不过我觉得功能更强大、应用更灵活、更能保证程序稳定运行的还是窗口看门狗,虽然一开始不太容易理解。

STM32窗口看门狗

总共三个寄存器,如下图所示:

看似简单,但设置和应用却有很多奥秘。

控制寄存器(WWDG_CR)中的值必须在0xFF和0xC0之间,因为它的第0位到第6位是递减计数器CNT,当第6位变为0时会产生复位,所以初始化时需要将其设置为1,第7位WDGA用于设置窗口看门狗的启动或禁用。

配置寄存器(WWDG_CFR)的位0至6用于设置窗口边界值。只有当减量计数器CNT的值小于边界值时,才可以喂狗。

而当7位递减计数器CNT减到0x3F时,即T6位变为0,此时MCU也会被复位。已经晚了,狗会饿死的。

因此,必须在规定的时间范围内喂狗,太早或太晚都会发生重置,这样的设计可以减少软件跑掉但仍然能够以错误的方式喂狗的概率。

状态寄存器(WWDG_CFR)仅使用第0位。 EWIF(Earlywakeupinterruptflag)是提前唤醒中断标志。当减计数器CNT的值达到0X40时(如果再次减,T6位将变为0,复位),该位由硬件置1,需要由软件清0。请注意,无论中断使能与否,该位都会被硬件设置为1。

提前唤醒中断使能设置在配置寄存器(WWDG_CFR)的第9位,EWI(提前唤醒中断)。该位需要由软件设置为1,当递减计数器CNT的值达到0X40时将产生中断。与EWIF 不同,该位由硬件清零。

另外,控制寄存器(WWDG_CR)中的第7个WDGA(Activation bit)激活位需要由软件置1来启动窗口看门狗,并且一旦启动,只能在复位或重启后由硬件清0。

配置寄存器(WWDG_CFR)的Bit 8和Bit 7 WDGTB[1:0]用于设置时基(Timer base)的预分频器。

上述描述可以参考下图来更清楚的理解:

使用窗口看门狗时,要注意计算最小和最大喂狗时间,以便正确喂狗,如下:

当PCLK1频率为36MHz时,则

上窗口时间:T_min=4096 * (2^WDGTB)*(WWDG_CR[6:0] - WWDG_CFR[6:0])/36 (us) 下窗口时间:T_max=4096 * (2^WDGTB)*(WWDG_CR[6:0] -0x40)/36 (us)。

这期间需要进行喂狗动作,喂狗动作就是向控制寄存器(WWDG_CR)写入一个值。

窗口看门狗中断函数void WWDG_IRQHandler(void);它是干什么用的。

窗口看门狗中断函数是在递减计数器减到0x40时调用的,因为计数速度较慢,所以距离复位到0x3F还有一段时间,我想这样的设计是为了在MCU复位之前留一点时间,以便工程师可以根据需要在中断函数中保存一些重要的数据,这样复位后MCU就可以知道系统因异常复位而出现的状态,从而使系统具有更高的稳定性。

而且我认为在窗口看门狗中断函数中喂狗是没有意义的。程序没有正常运行。在中断函数中喂狗来防止复位只会增加错误。如果不用来做正经事,那就是资源的浪费。

关于这一点,我个人认为不要被dotatom的示例代码误导,但还是有一定参考意义的。以下是初始化相关代码:

//窗口看门狗中断服务设置程序voidWWDG_NVIC_Init(){NVIC_InitTypeDefNVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;//WWDG中断NVIC_InitStructure.NVIC_IR QChannelPreemptionPriority=2;//抢占2子优先级3组2NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//抢占2,子优先级3,组2NVIC_Init(NVIC_InitStructure);//NVIC初始化}//保存WWDG计数器的设置值,默认为最大值。u8WWDG_CNT=0x7f ;//初始化窗口看门狗//tr:T[ 6:0],计数器值//wr:W[6:0],窗口值//fprer: 分频系数(WDGTB),仅最低2 位有效//Fwwdg=PCLK1/(4096*2^fprer).voidWWDG_Init(u8tr,u8wr,u3 2fprer){RCC_APB1PeriphClockCmd(RCC) _APB1Periph_WWDG,ENABLE);//WWDG时钟使能WWDG_CNT=trWWDG_CNT;//初始化WWDG_CNT.WWDG_SetPrescaler(fprer);//设置IWDG预分频器值WWDG_SetWindowValue(wr);//设置窗口值WWDG_Enable(WWDG_CNT);//使能看门狗,设置计数器WWDG_ClearFlag( );//清除提前唤醒中断标志(注:如果没有这句话,初始化后会进入一次中断) WWDG_NVIC_Init();//初始化窗口看门狗NVICWWDG_EnableIT();//使能窗口看门狗中断}

以上代码的朋友也可以跳转到库函数代码自行研究,另外需要说明的是WWDG_EnableIT();函数相关代码

#defineCFR_EWI_BB(PERIPH_BB_BASE+(CFR_OFFSET*32)+(EWI_BitNumber*4))

以上知识分享希望能够帮助到大家!