历史上的今天

今天是:2024年09月12日(星期四)

正在发生

2019年09月12日 | 秉火429笔记之十二 看门狗

发布者:代码漫游者 来源: eefocus关键字:秉火  看门狗  IWDG 手机看文章 扫描二维码
随时随地手机看文章

1. 概述

STM32有两个看门狗,一个是独立看门狗,另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬。


一般情况下,使用频次较高是独立看门狗,也即是通常意义的看门狗。


2. 独立看门狗(IWDG)

一个12位的递减计数器,最大值为0XFFF,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作.

看门狗时钟

独立看门狗的时钟由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。LSI的频率一般在30~60KHZ之间,根据温度和工作场合会有一定的漂移,我们一般取40KHZ,所以独立看门狗的定时时间并一定非常精确,只适用于对时间精度 要求比较低的场合。


计数器时钟

递减计数器的时钟由LSI经过一个8位的预分频器得到,我们可以操作预分频器寄存器IWDG_PR来设置分频因子,分频因子可以是:[4,8,16,32,64,128,256,256],计数器时钟CK_CNT= 40/ 4*2^PRV,一个计数器时钟计数器就减一。


键寄存器

image.png

一旦独立看门狗启动,它就关不掉,只有复位才能关掉


应用场景

独立看门狗一般用来检测和解决由程序引起的故障。


PS:  可以在系统上电开始的时候检查是否因看门狗引起的复位【RCC_GetFlagStatus(RCC_FLAG_IWDGRST)】


代码实例

/*

 * 设置 IWDG 的超时时间

 * Tout = prv/40 * rlv (s)

 *      prv可以是[4,8,16,32,64,128,256]

 * prv:预分频器值,取值如下:

 *     @arg IWDG_Prescaler_4: IWDG prescaler set to 4

 *     @arg IWDG_Prescaler_8: IWDG prescaler set to 8

 *     @arg IWDG_Prescaler_16: IWDG prescaler set to 16

 *     @arg IWDG_Prescaler_32: IWDG prescaler set to 32

 *     @arg IWDG_Prescaler_64: IWDG prescaler set to 64

 *     @arg IWDG_Prescaler_128: IWDG prescaler set to 128

 *     @arg IWDG_Prescaler_256: IWDG prescaler set to 256

 *

 * 独立看门狗使用LSI作为时钟。

 * LSI 的频率一般在 30~60KHZ 之间,根据温度和工作场合会有一定的漂移,我

 * 们一般取 40KHZ,所以独立看门狗的定时时间并一定非常精确,只适用于对时间精度

 * 要求比较低的场合。

 *

 * rlv:预分频器值,取值范围为:0-0XFFF

 * 函数调用举例:

 * IWDG_Config(IWDG_Prescaler_64 ,625);  // IWDG 1s 超时溢出 

 * (64/40)*625 = 1s

 */

 

void bsp_IWDG_Config(uint8_t prv ,uint16_t rlv)

{

// 使能 预分频寄存器PR和重装载寄存器RLR可写

IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );

// 设置预分频器值

IWDG_SetPrescaler( prv );

// 设置重装载寄存器值

IWDG_SetReload( rlv );

// 把重装载寄存器的值放到计数器中

IWDG_ReloadCounter();

// 使能 IWDG

IWDG_Enable();

}

 

// 喂狗

void bsp_IWDG_Feed(void)

{

// 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位

// 当计数器的值减到0的时候会产生系统复位

IWDG_ReloadCounter();

}

3. 窗口看门狗(WWDG)

窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数,当减到一个固定值0X40时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。这个是跟独立看门狗类似的地方,不同的地方是窗口看门狗的计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗,这就是窗口看门狗中窗口两个字的含义.


窗口看门狗时钟

窗口看门狗时钟来自PCLK1,PCLK1最大是45M,由RCC时钟控制器开启。


计数器时钟和计数器

计数器时钟由CK计时器时钟经过预分频器分频得到,分频系数由配置寄存器CFR的位8:7 WDGTB[1:0]配置,可以是[0,1,2,3],其中CK计时器时钟=PCLK1/4096,计数器的时钟CNT_CK=PCLK1/4096/(2^WDGTB)。


计数器是一个递减计数器,共有7位,其值存在控制寄存器CR的位6:0,即T[6:0],当7个位全部为1时是0X7F,这个是最大值,当递减到T6位变成0时,即从0X40变为0X3F时候,会产生看门狗复位。计数器的值只能是:0X40~0X7F之间,实际上用来计数的是T[5:0]。当递减计数器递减到0X40的时候,还不会马上产生复位,如果使能了提前唤醒中断:CFR位9 EWI 置1,则产生提前唤醒中断,如果真进入了这个中断的话,就说明程序肯定是出问题了, 那么在中断服务程序里面我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断。


应用场景

WWDG一般被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。


PS:  可以在系统上电开始的时候检查是否因看门狗引起的复位【RCC_GetFlagStatus(RCC_FLAG_WWDGRST)】


代码实例

//用于记录看门狗 递减计数器的值,方便喂狗函数直接使用

static uint8_t m_bsp_wwdg_cnt ;

 

// WWDG 中断优先级初始化

static void bsp_WWDG_NVIC_Config(void)

{

  NVIC_InitTypeDef NVIC_InitStructure; 

  

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 

  NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}

 

 

 

 

/* WWDG 配置函数

 * tr :递减计时器的值, 取值范围为:0x7f~0x40,超出范围会直接复位

 * wr :窗口值,取值范围为:0x7f~0x40

 * prv:预分频器值,取值可以是

 *      @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1(45MHz)/4096)/1  约10968Hz 91us

 *      @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1(45MHz)/4096)/2 约5484Hz 182us

 *      @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1(45MHz)/4096)/4 约2742Hz 364us

 *      @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1(45MHz)/4096)/8  约1371Hz 728us

 *      

 * 例:tr = 127(0x7f,tr的最大值)  wr = 80(0x50, 0x40为最小wr最小值)  prv =  WWDG_Prescaler_8

 * ~728 * (127-80) = 34.2ms < 刷新窗口 < ~728 * 64 = 46.6ms

 * 也就是说调用WWDG_Config进行这样的配置,若在之后的34.2ms前喂狗,系统会复位,在46.6ms后没有喂狗,系统也会复位。

 * 需要在刷新窗口的时间内喂狗,系统才不会复位。

*/

void bsp_WWDG_Config(uint8_t tr, uint8_t wr, uint32_t prv)

{

m_bsp_wwdg_cnt = tr;//保存CNT配置,用在喂狗函数

// 开启 WWDG 时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

// 设置预分频器的值

WWDG_SetPrescaler( prv );

// 设置上窗口值

WWDG_SetWindowValue( wr );

// 设置计数器的值,使能WWDG

WWDG_Enable(tr);

// 清除提前唤醒中断标志位

WWDG_ClearFlag();

// 配置WWDG中断优先级

bsp_WWDG_NVIC_Config();

// 开WWDG 中断

WWDG_EnableIT();

}

 

// 喂狗

void bsp_WWDG_Feed(void)

{

// 喂狗,刷新递减计数器的值,设置成最大WDG_CNT=0X7F

WWDG_SetCounter( m_bsp_wwdg_cnt );

}


关键字:秉火  看门狗  IWDG 引用地址:秉火429笔记之十二 看门狗

上一篇:秉火429笔记之十五 DMA--直接存储区访问
下一篇:秉火429笔记之十一 Systick--滴答定时器

推荐阅读

项目希望使用C++语言进行程序设计,在Keil中使用C++语言的方法,我已经在在Keil中使用C++进行程序设计进行介绍过,不过对于STM32CubeMX生成的STM32L0XX相关文件进行编译时,提示如下图所示的错误。 仔细分析可以看出,所有的错误都集中在usbd_conf.c文件,定位错误的具体语句,如下所示。USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDe...
前不久紫光宣布在重庆投资数百亿建设DRAM内存研发中心及晶圆厂,最快2021年量产,这对国产芯片,尤其是内存来说是一个大事件。不过在紫光之前,我们可能看到的第一个国产内存应该是合肥长鑫公司的,他们比紫光做内存更早,该公司2016年成立于安徽合肥,一期工程投资就高达72亿美元(约合494亿人民币),将建设一座月产能12.5万晶圆的内存厂,目前工厂建设...
昨天iQOO 5 Pro正式首销,据官方透露,该机的人气爆棚,一举斩获了京东手机5K+价位段安卓手机销量销售额双冠军、天猫安卓手机5K+价位段单品销量&销售额双冠军、苏宁安卓手机4500+价位段销量&销售额双冠军。外观方面,iQOO 5 Pro采用6.56英寸三星超视感柔性屏,屏占比高达92.6%,屏幕通过了SGS低拖影无缝显示认证及SGS低蓝光护眼认证,带来超震撼和舒适...
近日,思灵机器人(AGILE ROBOTS)宣布完成2.2亿美金C轮融资,软银愿景基金2期领投,跟投的财务投资人包括阿布扎比皇室集团(Chimera)、高瓴创投、红杉中国、线性资本等,产业投资人包括小米集团、工业富联、富士康原高管创立的满得投资等。思灵机器人是一家智能机器人系统研发及应用服务商,致力于智能机器人系统的研发及应用,核心产品包括7自由度轻...

史海拾趣

问答坊 | AI 解惑

单片机仿真实例

里面有很多实例,本科同学经常用到的…

查看全部问答∨

运放型号简介[转帖]

CA3130 高输入阻抗运算放大器 Intersil[DATA] CA3140 高输入阻抗运算放大器 CD4573 四可编程运算放大器 MC14573 ICL7650 斩波稳零放大器 LF347(NS[DATA]) 带宽四运算放大器 KA347 LF351 BI-FET单运算放大器 NS[DATA] LF353 BI-FET双运 ...…

查看全部问答∨

s3c44b0x 对于中断的一点疑惑,并且自己写的中断不进服务程序求助

首先我有一些疑问,如果产生EXT0的中断,cpu处理的过程是不是应该首先跳转到0x18执行IRQ中断服务程序,执行完以后在跳转到0x20执行EXT0的服务程序?这个跳转到0x20是cpu自动完成的么?还是要把代码写到0x18的IRQ中断服务程序实现的?执行0x18和执行 ...…

查看全部问答∨

现在做PCB开发,都用什么软件?

现在做PCB开发,都用什么软件?…

查看全部问答∨

不倒翁遥控器

遥控器非常容易“丢”,虽然大多数情况下是“丢而不失”,都能找回来,但总归得费一番周折,还是比较麻烦。既然个子矮了不好找,那就让遥控器长高点吧。把它做成不倒翁的样子,一切就迎刃而解了。海拔这么高还找不到?那就不能赖遥控器了哦。…

查看全部问答∨

电源芯片mc34063调试求助

今天调了一天的mc34063,输入电压为9V,本来打算反向输出-8V电压,但是输出有问题,就换成了降压输出接法,如图,现在的Rsc为1欧, L为100uH, 1N5819用的ISS14, CT为470pF,通过改变R1和R2的电阻来查了几组数据, 我感觉数据不对,请各位帮忙看看 ...…

查看全部问答∨

关于MCS-51单片机的求助

以下是是MCS-51单片机的数字时钟程序,求助各位大侠!帮忙看看题目 #include "reg51.h" unsigned char code disptab[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; unsigned char code ...…

查看全部问答∨

求助,把h.264移植到dsp上并进行算法上的优化,请问用哪个软件进行仿真,555··

我的论文题目是基于3g的视频监控,终端打算用arm+dsp双处理器,视频压缩用H.264标准,需要在dsp上移植,并打算在算法上做一些改进,请问实验怎么做,需要用哪个软件进行仿真,matlab还是ccs  还是有更好的,谢谢大家了,好着急啊 ,马上中期 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved