一、前言
窗口看门狗简介:
窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用步调背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被革新,看门狗电路在到达预置的时间周期时,会产生一个MCU复位。在递减计数器到达窗口寄存器数值之前,假如7位的递减计数器数值(在控制寄存器中)被革新, 那么也将产生一个MCU复位。这表明递减计数器必要在一个有限的时间窗口中被革新。窗口看门狗紧张特性:
● 可编程的自由运行递减计数器 ● 条件复位 ─ 当递减计数器的值小于0x40,(若看门狗被启动)则产生复位。 ─ 当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。● 假如启动了看门狗而且答应克制,当递减计数器即是0x40时产生早期唤醒克制(EWI),它可 以被用于重装载计数器以制止WWDG复位。窗口看门狗实用场景:
WWDG最适当那些要求看门狗在正确计时窗口起作用的应用步调。本次DEMO的目标:
在本次DEMO中将使用窗口看门狗的克制功能来喂狗,通过STM32F103ZET6开辟板的DS0和DS1来提示步调的运行状态。
二、时钟树分析
窗口看门狗WWDG是AHB-APB1总线下的外设,其时钟泉源于APB1下的PCLK1时钟,本次实行中,将外部高速时钟HSE(8MHz)用锁相环PLL倍频9倍至72MHz作为体系时钟SYSCLK,AHB1分频系数为1(不分频,仍为72MHz),APB1分频系数为2(2分频,到达PCLK1最大频率36MHz),末了供给WWDG外设的根本时钟为36MHz。具体流程如下所示:
三、窗口看门狗功能先容
窗口看门狗的时序图如下所示:
此中:
- T[6:0]:控制寄存器(WWDG_CR)的低7位。
- W[6:0]:设置寄存器(WWDG_CFR)的低7位,为窗口看门狗的上窗口。
- 3Fh:下窗口0X40的界限。
当窗口看门狗的计数器在上窗口值之外被革新,大概低于下窗口值都会产生复位。
窗口看门狗的超时公式如下:
此中:
- Twwdg:WWDG超时时间(单位ms)
- Fpclk1:APB1的时钟频率(单位KHz)
- WDGTB:WWDG的预分频系数
- T[5:0]:窗口看门狗的计数器低6位
根据第二节时钟树分析,设置Fpclk=36MHz,那么可以得到最大-最小超时时间表如下所示:
WDGTB最小超时值最大超时值0113μs7.28ms1227μs14.56ms2455μs29.12ms3910μs58.25ms四、寄存器先容
对WWDG的步调计划紧张涉及3个寄存器:
寄存器作用WWDG_CR控制寄存器WWDG_CFR设置寄存器WWDG_SR状态寄存器下面将对这几个寄存器举行逐一先容。
4.1 WWDG_CR控制寄存器
《STM32中文参考手册》对WWDG_CR寄存器的形貌如下:
- WWDG_CR控制寄存器只有低8位有效。此中T[6:0]存储的是看门狗的计数器值,当计数器值从40h变为3FH时(T6变为0),产生看门狗复位。
- WDGA 位则是看门狗的激活位,该位由软件置 1,以启动看门狗,而且肯定要注意的是该位一旦设置,就只能在硬件复位后才气清零了。
4.2 WWDG_CFR设置寄存器
《STM32中文参考手册》对WWDG_CFR寄存器的形貌如下:
该位中的 EWI 是提前唤醒克制,也就是在将近产生复位的前一段时间(T[6:0]=0X40)来提示我们,必要举行喂狗了,否则将复位!因此,我们一样寻常用该位来设置克制,当窗口看门狗 的计数器值减到 0X40 的时间,假如该位设置,并开启了克制,则会产生克制,我们可以在克制内里向 WWDG_CR 重新写入计数器的值,来到达喂狗的目标。注意这里在进入克制后,必须在不大于 1 个窗口看门狗计数周期的时间(在 PCLK1 频率为 36M 且 WDGTB 为 0 的条件下,该时间为 113us)内重新写 WWDG_CR,否则,看门狗将产生复位!
4.3 WWDG_SR状态寄存器
《STM32中文参考手册》对WWDG_SR寄存器的形貌如下:
该寄存器用来纪录当前是否有提前唤醒的标记。该寄存器仅有位 0 有效,其他都是保存位。当计数器值到达 40h 时,此位由硬件置 1。它必须通过软件写 0 来打扫。对此位写 1 无效。纵然克制未被使能,在计数器的值到达 0X40的时间,此位也会被置 1。
五、步调计划
对于窗口看门狗的步调计划紧张分为3个部门:窗口看门狗初始化、重置WWDG计数器的值、窗口看门狗克制服务步调。
5.1 窗口看门狗初始化
该部门步调位于HARDWARE/wdg.c/WWDG_Init(),紧张功能是使能APB1下wwdg时钟、通过WWDG_CFR寄存器设置窗口值,通过WWDG_CR寄存器设置计数器值并开启看门狗,注册WWDG克制(克制号0),软件打扫提前唤醒标记位并使能提前唤醒克制。具体步调如下所示:- //初始化窗口看门狗
- //tr :T[6:0],计数器值
- //wr :W[6:0],窗口值
- //fprer:分频系数(WDGTB),仅最低2位有效
- //Fwwdg=PCLK1/(4096*2^fprer).
- void WWDG_Init(u8 tr,u8 wr,u8 fprer)
- {
- RCC->APB1ENR|=1<<11; //使能wwdg时钟
- WWDG_CNT=tr&WWDG_CNT; //初始化WWDG_CNT.
- WWDG->CFR|=fprer<<7; //PCLK1/4096再除2^fprer
- WWDG->CFR&=0XFF80;
- WWDG->CFR|=wr; //设定窗口值
- WWDG->CR|=WWDG_CNT; //设定计数器值
- WWDG->CR|=1<<7; //开启看门狗
- MY_NVIC_Init(2,3,WWDG_IRQn,2);//抢占2,子优先级3,组2
- WWDG->SR=0X00; //清除提前唤醒中断标志位
- WWDG->CFR|=1<<9; //使能提前唤醒中断
- }
复制代码 5.2 重置WWDG计数器的值
该部门步调位于HARDWARE/wdg.c/WWDG_Set_Counter(),紧张功能是通过WWDG_CR寄存器重置7位计数器,相当于喂狗。具体步调如下所示:- //重设置WWDG计数器的值
- void WWDG_Set_Counter(u8 cnt)
- {
- WWDG->CR =(cnt&0x7F);//重设置7位计数器
- }
复制代码 5.3 窗口看门狗克制服务步调
该部门步调位于HARDWARE/wdg.c/WWDG_IRQHandler(),紧张功能是在克制中喂狗(重置WWDG计数器的值),软件打扫提前唤醒克制标记位,并控制DS1翻转(提示信息)。具体代码如下所示:- //窗口看门狗中断服务程序
- void WWDG_IRQHandler(void)
- {
- WWDG_Set_Counter(WWDG_CNT);//重设窗口看门狗的值!
- WWDG->SR=0X00;//清除提前唤醒中断标志位
- LED1=!LED1;
- }
复制代码 六、上机实行
将代码烧录至STM32F103ZET6,窗口看门狗不停触发克制,DS1灯不绝闪烁,如下所示:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |