产品网站开发服务,连云港seo网站推广,项目管理中软件分类为,大莲网站建设公司一、前言 窗口看门狗简介#xff1a; 窗口看门狗通常被用来监测#xff0c;由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新#xff0c;看门狗电路在达到预置的时间周期时#xff0c;会产生一个M…一、前言 窗口看门狗简介 窗口看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新看门狗电路在达到预置的时间周期时会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前如果7位的递减计数器数值(在控制寄存器中)被刷新 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。 窗口看门狗主要特性 ● 可编程的自由运行递减计数器 ● 条件复位 ─ 当递减计数器的值小于0x40(若看门狗被启动)则产生复位。 ─ 当递减计数器在窗口外被重新装载(若看门狗被启动)则产生复位。 ● 如果启动了看门狗并且允许中断当递减计数器等于0x40时产生早期唤醒中断(EWI)它可 以被用于重装载计数器以避免WWDG复位。 窗口看门狗适用场景 WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。 本次DEMO的目标 在本次DEMO中将使用窗口看门狗的中断功能来喂狗通过STM32F103ZET6开发板的DS0和DS1来提示程序的运行状态。 二、时钟树解析 窗口看门狗WWDG是AHB-APB1总线下的外设其时钟来源于APB1下的PCLK1时钟本次实验中将外部高速时钟HSE8MHz用锁相环PLL倍频9倍至72MHz作为系统时钟SYSCLKAHB1分频系数为1不分频仍为72MHzAPB1分频系数为22分频达到PCLK1最大频率36MHz最后供给WWDG外设的基础时钟为36MHz。具体流程如下所示 三、窗口看门狗功能介绍
窗口看门狗的时序图如下所示 其中 T[6:0]:控制寄存器(WWDG_CR)的低7位。W[6:0]:配置寄存器(WWDG_CFR)的低7位为窗口看门狗的上窗口。3Fh:下窗口0X40的边界。 当窗口看门狗的计数器在上窗口值之外被刷新或者低于下窗口值都会产生复位。 窗口看门狗的超时公式如下 其中 Twwdg:WWDG超时时间单位msFpclk1:APB1的时钟频率单位KHzWDGTB:WWDG的预分频系数T[5:0]:窗口看门狗的计数器低6位 根据第二节时钟树解析设置Fpclk36MHz那么可以得到最大-最小超时时间表如下所示 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位有效
//FwwdgPCLK1/(4096*2^fprer).
void WWDG_Init(u8 tr,u8 wr,u8 fprer)
{ RCC-APB1ENR|111; //使能wwdg时钟 WWDG_CNTtrWWDG_CNT; //初始化WWDG_CNT. WWDG-CFR|fprer7; //PCLK1/4096再除2^fprer WWDG-CFR0XFF80; WWDG-CFR|wr; //设定窗口值 WWDG-CR|WWDG_CNT; //设定计数器值 WWDG-CR|17; //开启看门狗 MY_NVIC_Init(2,3,WWDG_IRQn,2);//抢占2子优先级3组2 WWDG-SR0X00; //清除提前唤醒中断标志位 WWDG-CFR|19; //使能提前唤醒中断
}
5.2 重置WWDG计数器的值 该部分程序位于HARDWARE/wdg.c/WWDG_Set_Counter()主要功能是通过WWDG_CR寄存器重置7位计数器相当于喂狗。具体程序如下所示 //重设置WWDG计数器的值
void WWDG_Set_Counter(u8 cnt)
{ WWDG-CR (cnt0x7F);//重设置7位计数器
}
5.3 窗口看门狗中断服务程序 该部分程序位于HARDWARE/wdg.c/WWDG_IRQHandler()主要功能是在中断中喂狗重置WWDG计数器的值软件清除提前唤醒中断标志位并控制DS1翻转提示信息。具体代码如下所示 //窗口看门狗中断服务程序
void WWDG_IRQHandler(void)
{ WWDG_Set_Counter(WWDG_CNT);//重设窗口看门狗的值! WWDG-SR0X00;//清除提前唤醒中断标志位 LED1!LED1;
}
六、上机实验 将代码烧录至STM32F103ZET6窗口看门狗不断触发中断DS1灯不停闪烁如下所示