历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-09-12 来源:eefocus

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?imageView2/2/w/550

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


应用场景

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


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 );

}


推荐阅读

史海拾趣

Gigabit Logic Inc公司的发展小趣事
采用集成电路等现代电子元器件,提高了电路的可靠性和稳定性。
Antiference公司的发展小趣事

Antiference公司最初以生产电磁屏蔽材料起家,但随着电子设备的普及和电磁干扰问题的日益严重,公司意识到单纯的材料生产已无法满足市场需求。于是,Antiference投入巨资研发新型电磁干扰抑制技术,成功开发出了一款能够显著降低电磁干扰的芯片。这款芯片迅速在市场上获得了广泛认可,Antiference也因此成为了电磁干扰抑制领域的领军企业。

Diotec Electronics Corp公司的发展小趣事

Diotec Electronics Corp公司成立于XXXX年,由一群富有激情的工程师和技术专家创立。在初创期,公司专注于研发高性能的电子元器件,以应对当时市场上对高效率和可靠性元件的迫切需求。通过不断的技术创新,Diotec成功开发出了一款具有革命性的整流二极管,该产品以其卓越的性能和稳定性迅速赢得了市场的认可,为公司的发展奠定了坚实的基础。

Advanced Ceramic X Corporation公司的发展小趣事

面对全球化的市场趋势,Diotec开始实施全球化战略。公司加强与国际市场的联系,积极开拓海外市场。同时,Diotec还加强与全球合作伙伴的合作,共同推动电子行业的发展。展望未来,Diotec将继续坚持技术创新和品质至上的理念,致力于成为全球领先的电子元器件供应商。同时,公司还将关注新兴市场和技术趋势,为未来的发展做好充分准备。

DDK公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。DDK公司深知这一点,因此始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测的每一个环节都严格把控,确保每一件产品都符合高标准、严要求。这种对品质的执着追求,让DDK公司的产品在市场上赢得了良好的声誉,赢得了消费者的信任和忠诚。

GigPeak公司的发展小趣事

为了进一步增强市场地位和扩大产品线,GigPeak在2010年实施了一项重要的并购战略。公司成功收购了另一家在光纤通信领域具有深厚技术积累的企业,这次并购不仅为GigPeak带来了先进的产品线和研发资源,还显著提升了其在全球市场的份额。通过整合双方的优势资源,GigPeak在光纤通信领域的技术实力和市场份额均实现了质的飞跃。

问答坊 | AI 解惑

一位用激情经营人生的本土IC创业者(上)

微软前中国总裁唐骏曾经说过:“人的职业生涯是需要经营的,它和经营一个企业并无二致。”。这话用在天津英诺华微电子技术有限公司总经理褚以人身上再贴切不过。从一名核物理专业的大学生,到如今投身半导体产业的IC设计师,他在不断地经营中把自己 ...…

查看全部问答>

谁用过LCD近进来帮我一下吧!

我现在需要做个电话机!可以显示大头贴的!需要用块彩色的LCD,不知道市场上卖的带驱动的那种LCD是不是可以直接接到ARM处理器的IO口上?一般黑白的LCD也是可以的吧!主要的部分是在软件的编程吧!…

查看全部问答>

精巧实用的震感报警器

精巧实用的震感报警器…

查看全部问答>

usbavrjtag cp210x_driver

本帖最后由 paulhyde 于 2014-9-15 08:57 编辑 usbavrjtag cp210x_driver  …

查看全部问答>

2009年全国大学生电子设计竞赛G题低频功率放大器题解分享

本帖最后由 paulhyde 于 2014-9-15 04:15 编辑 2009年全国大学生电子设计竞赛G题是一个设计功率放大器的题,主要考核学生模拟电子技术的基础技能,要求是一定要用场效应晶体管做末级放大,且电路增益要求很大,如5mV的输入要达到5W(8欧负载)的输 ...…

查看全部问答>

WINCE 能实现每秒5000次中断吗?有没有高手做过,请赐教。

Wince5.0 硬件每秒钟5000个脉冲触发X86CUP的7号中断,Wince能完全捕获到每一个中断吗,保证不丢,请做过的兄弟姐妹帮帮忙,提提思路,或者给 一段代码,不胜感激…

查看全部问答>

求助:usrRoot已经执行完,看不到蓝屏的boot界面?

跟踪代码发现usrRoot已经执行完,却始终没有跳转到boot的蓝屏界面,谁能指点一下为什么?谢谢! 我是在workbench下,VxWorks6.6…

查看全部问答>

小菜求教

我想学习windows ce方面的开发,我以前学C++的,没有学过C#,我经常用的是vs2005。 我想问一下,用vs2005进行windows ce方面的开发,是否要学些C#? 学习C#又什么好的教材吗? 谢谢了…

查看全部问答>

侃侃我的成果

本人长期从事单片机开发应用,积累了一定的经验。本人将毕生研究心得集成了文字,放在我的博客里,希望大家光临指导,并给点意见。我的博客地址;http://blog.mcuol.com/user/Article/500.html…

查看全部问答>

2407A的调试???

TI的2407A的调试一定要加一块RAM吗? 这块ram的作用是什么呀?能告诉我TI的哪个文档中描述这个问题了? ccs中的load 是把程序load到哪里了? 小弟刚刚学习,那位大虾帮帮我哦,谢谢!!! 还有,谁能提供一些汇编的例子,为什么TI只提供一 ...…

查看全部问答>