CKS32F4xx系列产品窗口看门狗(WWDG)

cathy的头像
cathy 发布于:周二, 03/14/2023 - 10:04 ,关键词:

中科芯CKS32F4xx系列产品内部提供两个看门狗定时器单元,独立型看门狗IWDG(Independent Watchdog)和窗口型看门狗WWDG(Window Watchdog),本文主要介绍WWDG的应用,关于IWDG的详情,请参看我们的IWDG微课堂内容。

WWDG简介

通过前面的课程,我们知道IWDG独立看门狗的工作原理就是一个递减计数器在LSI时钟的驱动下不断的往下递减计数,当减到0之前如果没有刷新递减计数器的值(俗称喂狗),便会触发系统复位。

WWDG窗口看门狗也是一个递减计数器不断的往下递减计数。但和IWDG独立看门狗有四处不同:(1)IWDG由独立RC振荡器产生的LSI驱动,不受主时钟影响,但精度不高;WWDG由APB1分频时钟驱动,受主时钟影响,精度高;

(2)IWDG直接由VDD电压域供电,即使在MCU停止模式和待机模式下仍然能照常工作;

(3)IWDG计数器减到下限0时触发复位,WWDG计数器减到下限0x40时触发复位,下限值不同;(4)IWDG计数器只有复位下限值0,WWDG计数器不仅有复位下限0x40,还有一个复位上限X(用户设定),上限值与下限值之间形成一个复位窗口。WWDG计数器的值在减到上限X之前(窗口外)喂狗,同样也会产生复位。因此WWDG必须在窗口上限和窗口下限之间才可以喂狗,这是窗口看门狗的特殊之处。

1.jpg

2.jpg

WWDG详细介绍

1.WWDG功能框图解析

下图是窗口看门狗的功能框图,分4个部分进行说明:

3.jpg

① WWDG时钟:窗口看门狗的时钟来自APB1时钟线分频出的PCLK1,最大42MHz,由RCC时钟控制器控制开启;

② 计数器时钟和WWDG_CFR寄存器:CK计时器时钟 = PCLK1 / 4096,计数器时钟由CK计时器时钟经过预分频器分频得到,分频系数由配置寄存器WWDG_CFR的WWDGTB[1:0]控制,可以是0~3,因此计数器的时钟CNT_CK = PCLK1 / 4096 / (2^WWDGTB),进而可算出一个计数周期时间是T = 1 / CNT_CK;

③ 计数器和WWDG_CR寄存器:WWDG的计数器是一个7位递减计数器,其值存放在控制器寄存器WWDG_CR的T[6:0]中,当该计数器的值从0x40变为0x3F时,产生复位,因此计数器的值只能是在0x7F~0x40之间,有效位是T[5:0]。WWDG_CR的WDGA位则是窗口看门狗的激活位,可由软件置1来启动WWDG,要注意WDGA一旦置1,只能在硬件复位后才能清零;

④ 窗口上限值:WWDG的窗口下限值固定是0x40,但窗口上限值可以人为设定,具体可由WWDG_CFR配置寄存器的W[6:0]设置,其值必须大于0x40且小于0x7F,否则就失去了意义。

最后介绍的是状态寄存器(WWDG_SR)和EWI(Early wakeup interrupt)中断,该寄存器用来记录当前是否有提前唤醒EWI的中断标志。该寄存器仅有位0有效,其他都是保留位。当计数器值达到0x40时,此位由硬件置1,它必须通过软件写0来清除。在初始化WWDG时,一般会先通过软件写0清除一次。用户可以在EWI(Early wakeup interrupt)中断服务程序里进行一些必要的操作。

2.计算看门狗超时时间

窗口看门狗的时序图如下:

4.jpg

假设PCLK1时钟为42MHz,按照上述计算方法,可以得到WWDG的超时时间计算公式Twwdg =1 / PCLK1 x 4096 x 2^WDGTB x (T[5:0]+1),范围如下表:

5.jpg

3.WWDG库函数配置步骤

接下来介绍如何驱动CKS32F4xx系列产品的WWDG工作。窗口看门狗相关的库操作函数在文件cks32f4xx_wwdg.c和对应的头文件cks32f4xx_wwdg.h中。具体配置步骤如下:

(1)使能WWDG时钟

不同于IWDG,IWDG有自己独立的32KHz时钟,不需要使能。而WWDG使用的PCLK1时钟需要先进行使能。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能

(2)设置WWDG窗口上限和WDGTB分频系数

void WWDG_SetWindowValue(uint8_t WindowValue);      //设置WWDG 窗口上限
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);    //设置WDGTB分频系数

(3)开启WWDG中断并分组

WWDG_ClearFlag(); //清除提前唤醒中断标志位
NVIC_Init();      //设置中断优先级
WWDG_EnableIT();  //开启窗口看门狗中断

(4)设置计数器初始值并使能看门狗

void WWDG_Enable(uint8_t Counter);  //设置计数器值并使能看门狗

完成以上4个步骤之后,我们就可以使用CKS32F4的窗口看门狗了。之后在程序里面就必须周期性的在窗口上下限范围内进行喂狗(一般调用WWDG_SetCounter函数),否则将导致系统复位。

4.WWDG的应用场景

WWDG一般被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。比如一个十分关键的程序段正常运行的时间是50ms以内,在运行完这个段程序之后紧接着进行喂狗,如果在规定的时间窗口内还没有喂狗,那就说明我们监控的程序并没有在预期的50ms内运行完成,可以认为出故障了或跑飞了,那么此时产生系统复位来解除这个故障,让程序重新运行。

实验例程

为本期微课堂配套了一个例子,整体功能如下:

(1)系统上电后,LED1~LED4依次点亮后(流水动态效果)保持常亮,配置窗口看门狗,进入主程序while循环,主程序中不断去读WWDG计数器的当前值,并与WWDG窗口值进行比较,一旦发现计数器的值落入窗口范围内,就进行喂狗操作。

(2)按下USER按键,进入死循环,从而造成无法执行喂狗程序,WWDG触发系统复位,可重新看到LED1~LED4依次点亮(流水动态效果)现象。

来源:中科芯MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 18