基于CKS32F4xx系列的独立看门狗(IWDG)实例

控制/MCU

1842人已加入

描述

看门狗简介

中科芯CKS32F4xx系列产品内部提供两个看门狗定时器单元,独立型看门狗IWDG(Independent Watchdog)和窗口型看门狗WWDG(Window Watchdog),它们在安全性、时间精确性和使用灵活性方面变现得非常优秀。两个看门狗定时器单元都可用来检测由软件错误引起的故障,具体表现为当计数器达到给定的超时值或未能在指定时间窗口内刷新计数器的值,会触发系统复位。

IWDG由MCU内部独立RC振荡器产生的低速时钟LSI(Low-speed Internal)驱动,因此即使主时钟发生故障它也仍然有效。而WWDG是由从APB1分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合,比如检测由程序跑飞或死机引起的故障。WWDG最适合那些需要看门狗在精确计时窗口时间内起作用的应用程序,比如检测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常运行序列而产生的软件故障。

本文主要介绍IWDG的应用,

IWDG详细介绍

IWDG通俗的解释它是一个12位的递减计数器,当计数器的值从某个值一直减到0的时候,就会产生一个系统复位信号,即IWDG_RESET。如果在计数器没减到0之前,“刷新”计数器的值,就不会产生复位信号,“刷新”这个动作就是我们经常说的喂狗。IWDG直接由VDD电压域供电,即使在MCU停止模式和待机模式下仍然能照常工作。 

1.IWDG功能框图解析

下图是独立看门狗的功能框图,分6个部分进行说明:

计数器

① LSI时钟:IWDG的时钟由专门的32KHz低速时钟LSI驱动,即使主时钟发生故障它也仍然有效,非常独立。这里需要注意的是,由于RC振荡器的原理和特性(根据温度和环境会有一定的漂移),IWDG并不是严格准确的32KHz,只是我们在应用的时候,默认以32KHz的频率来估算。所以IWDG的定时时间并不一定非常精确,只适用于对时间精度要求比较低的场合。

② 计数器时钟和IWDG_PR寄存器:递减计数器的时钟由LSI经过一个8位的预分频器得到,预分频器寄存器IWDG_PR的值决定分频因子,分频因子可以是:4、8、16、32、64、128、256。分频因子(假设为W)和IWDG_PR值的关系是W = 4 * 2^IWDG_PR。

③ 状态寄存器IWDG_SR:顾名思义,IWDG_SR表示独立看门狗模块的当前状态,该寄存器只有位0:PVU(Prescaler Value Update)和位1:RVU(Reload Value Update)有效,且只能读不能写。PVU置1指示预分频值的更新正在进行中,更新完成后由硬件置0。RVU置1表示重装载值的更新正在进行中,更新完毕之后由硬件置0。只有当RVU或PVU等于0的时候才可以进行下一次更新操作。

④ 重载寄存器IWDG_RLR:重载寄存器是一个12位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定着独立看门狗的溢出时间。溢出时间Tout(s) = (4 * 2^IWDG_PR) / 32KHz * IWDG_RLR,根据这个公式,可以计算出当LSI为32KHz时,IWDG的理论溢出时间最小值和最大值分别是125us和32.768s。

⑤ 递减计数器:IWDG的递减计数器是一个12位寄存器,设置范围是0~4095,一个计数器时钟计数器就减1,当计数器减到0时,IWDG会产生一个系统复位信号IWDG_RESET,让程序重新启动运行,如果在计数器减到0之前刷新计数器的值(重新写入新值),就不会产生复位信号,重新刷新计数器值的这个动作俗称喂狗。

⑥ 密钥寄存器IWDG_KR:密钥寄存器IWDG_KR是独立看门狗IWDG的一个核心控制寄存器,主要有三种寄存器值对应三种控制效果。

2.IWDG库函数配置步骤

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

(1)解除寄存器写保护(向IWDG_KR写入0x5555)

 

 

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能写权限

 

 

(2)设置IWDG预分频因子和重装载值

 

 

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置IWDG预分频值
void IWDG_SetReload(uint16_t Reload); //设置IWDG重装载值

 

 

此时可以计算出看门狗溢出时间,比如我们最终设定IWDG_PR值为 4,IWDG_RLR值500,那么就可以得到 Tout = (4 * 2^IWDG_PR) / 32KHz * IWDG_RLR = 64 / 32 * 500 = 1000ms,看门狗的溢出时间是1s,只要在一秒钟之内,写入0xAAAA到IWDG_KR,就不会触发看门狗复位(一秒内写入多次也是可以的)。这里需要提醒大家的是,由于看门狗的时钟不是准确的32KHz,所以喂狗时间应适当提前。

(3)重载计数值喂狗(向IWDG_KR写入0xAAAA) 

 

 

IWDG_ReloadCounter();  //把重装载寄存器IWDG_RLR的值放到计数器中

 

 

(4)开启看门狗(向IWDG_KR写入0xCCCC)

 

 

IWDG_Enable();  //使能 IWDG

 

 

通过上面4个步骤,就可以启动CKS32F4的IWDG独立看门狗了,之后在程序里面就必须周期性的进行喂狗(一般会使用定时器定时的调用IWDG_ReloadCounter函数),否则将导致系统复位。注意IWDG在一旦开启,系统运行时就不能再被关闭,想要关闭,只能重启,并且重启之后要迅速关闭IWDG。

编辑:黄飞

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分