历史上的今天
返回首页

历史上的今天

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

正在发生

2019年09月19日 | 第34章 IWDG—独立看门狗—零死角玩转STM32-F429系列

2019-09-19 来源:eefocus

本章参考资料:《STM32F4XX中文参考手册》IWDG章节。


学习本章时,配合《STM32F4XX中文参考手册》IWDG章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。


34.1 IWDG简介

STM32有两个看门狗,一个是独立看门狗另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬,本章我们主要分析独立看门狗的功能框图和它的应用。独立看门狗用通俗一点的话来解释就是一个12位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。


34.2 IWDG功能框图剖析

图 341 IWDG功能框图


1.    ①独立看门狗时钟

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

要求比较低的场合。


2.    ②计数器时钟

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


3.    ③计数器

独立看门狗的计数器是一个12位的递减计数器,最大值为0XFFF,当计数器减到0时,会产生一个复位信号:IWDG_RESET,让程序重新启动运行,如果在计数器减到0之前刷新了计数器的值的话,就不会产生复位信号,重新刷新计数器值的这个动作我们俗称喂狗。


4.    ④重装载寄存器

重装载寄存器是一个12位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定着独立看门狗的溢出时间。超时时间Tout = (4*2^prv) / 40 * rlv (s) ,prv是预分频器寄存器的值,rlv是重装载寄存器的值。


5.    ⑤键寄存器

键寄存器IWDG_KR可以说是独立看门狗的一个控制寄存器,主要有三种控制方式,往这个寄存器写入下面三个不同的值有不同的效果。


表格 341 键寄存器取值枚举

image.png?imageView2/2/w/550

通过写往键寄存器写0XCCC来启动看门狗是属于软件启动的方式,一旦独立看门狗启动,它就关不掉,只有复位才能关掉。


6.    ⑥状态寄存器

状态寄存器SR只有位0:PVU和位1:RVU有效,这两位只能由硬件操作,软件操作不了。RVU:看门狗计数器重装载值更新,硬件置1表示重装载值的更新正在进行中,更新完毕之后由硬件清0。PVU: 看门狗预分频值更新,硬件置'1'指示预分频值的更新正在进行中,当更新完成后,由硬件清0。所以只有当RVU/PVU等于0的时候才可以更新重装载寄存器/预分频寄存器。


34.3 怎么用IWDG

独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms,在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序50ms多一点,如果超过60ms还没有喂狗,那就说明我们监控的程序出故障了,跑飞了,那么就会产生系统复位,让程序重新运行。


34.4 IWDG超时实验

34.4.1 硬件设计

1、IWDG一个


2、按键一个


3、LED一个


IWDG属于单片机内部资源,不需要外部电路,需要一个外部的按键和LED,通过按键来喂狗,喂狗成功LED亮,喂狗失败,程序重启,LED灭一次。


34.4.2 软件设计

我们编写两个 IWDG驱动文件,bsp_iwdg.h 和bsp_iwdg.c,用来存放IWDG的初始化配置函数。


1.    代码分析

这里只讲解核心的部分代码,有些变量的设置,头文件的包含等并没有涉及到,完整的代码请参考本章配套的工程。


IWDG配置函数

代码 341 IWDG配置函数


 1 void IWDG_Config(uint8_t prv ,uint16_t rlv)

 2 {

 3 

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

 4     IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );

 5 

 6 

// 设置预分频器值

 7     IWDG_SetPrescaler( prv );

 8 

 9 

// 设置重装载寄存器值

10     IWDG_SetReload( rlv );

11 

12 

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

13     IWDG_ReloadCounter();

14 

15 

// 使能 IWDG

16     IWDG_Enable();

17 }

IWDG配置函数有两个形参,prv用来设置预分频的值,取值可以是:


代码 342 形参 prv 取值


1 /*


 2 *     @arg IWDG_Prescaler_4:    IWDG prescaler set to 4

 3 *     @arg IWDG_Prescaler_8:    IWDG prescaler set to 8

 4 *     @arg IWDG_Prescaler_16:   IWDG prescaler set to 16

 5 *     @arg IWDG_Prescaler_32:   IWDG prescaler set to 32

 6 *     @arg IWDG_Prescaler_64:   IWDG prescaler set to 64

 7 *     @arg IWDG_Prescaler_128:  IWDG prescaler set to 128

 8 *     @arg IWDG_Prescaler_256:  IWDG prescaler set to 256

 9 */

这些宏在stm32f10x_iwdg.h中定义,宏展开是8位的16进制数,具体作用是配置配置预分频寄存器IWDG_PR,获得各种分频系数。形参rlv用来设置重装载寄存器IWDG_RLR的值,取值范围为0~0XFFF。溢出时间Tout = prv/40 * rlv (s),prv可以是[4,8,16,32,64,128,256]。如果我们需要设置1s的超时溢出,prv可以取IWDG_Prescaler_64,rlv取625,即调用:IWDG_Config(IWDG_Prescaler_64 ,625)。Tout=64/40*625=1s。


喂狗函数

代码 343 喂狗函数


 1 void IWDG_Feed(void)

 2 {

 3 

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

 4 

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

 5     IWDG_ReloadCounter();

 6 }

主函数

代码 344 主函数


1 int main(void)


2 {


3 /* LED 端口初始化 */


4 LED_GPIO_Config();


5


6 Delay(0X8FFFFF);


7


8 /* 检查是否为独立看门狗复位 */


9 if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)


10 {


11 /* 独立看门狗复位 */


12 /* 亮红灯 */


13 LED_RED;


14


15 /* 清除标志 */


16 RCC_ClearFlag();


17


18 /*如果一直不喂狗,会一直复位,加上前面的延时,会看到红灯闪烁


19 在1s 时间内喂狗的话,则会持续亮绿灯*/


20 }


21 else


22 {


23 /*不是独立看门狗复位(可能为上电复位或者手动按键复位之类的) */


24 /* 亮蓝灯 */


25 LED_BLUE;


26 }


27


28 /*初始化按键*/


29 Key_GPIO_Config();


30


31 // IWDG 1s 超时溢出


32 IWDG_Config(IWDG_Prescaler_64 ,625);


33


34


35 //while部分是我们在项目中具体需要写的代码,这部分的程序可以用独立看门狗来监控


36 //如果我们知道这部分代码的执行时间,比如是500ms,那么我们可以设置独立看门狗的


37 //溢出时间是600ms,比500ms多一点,如果要被监控的程序没有跑飞正常执行的话,那么


38 //执行完毕之后就会执行喂狗的程序,如果程序跑飞了那程序就会超时,到达不了喂狗的


39 //程序,此时就会产生系统复位。但是也不排除程序跑飞了又跑回来了,刚好喂狗了,


40 //歪打正着。所以要想更精确的监控程序,可以使用窗口看门狗,窗口看门狗规定必须


41 //在规定的窗口时间内喂狗。


42 while (1)


43 {


44 if ( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON )


45 {


46 // 喂狗,如果不喂狗,系统则会复位,复位后亮红灯,如果在1s


47 // 时间内准时喂狗的话,则会亮绿灯


48 IWDG_Feed();


49 //喂狗后亮绿灯


50 LED_GREEN;


51 }


52 }


53 }


主函数中我们初始化好LED和按键相关的配置,设置IWDG 1s 超时溢出之后,进入while死循环,通过按键来喂狗,如果喂狗成功,则亮绿灯,如果喂狗失败的话,系统重启,程序重新执行,当执行到RCC_GetFlagStatus函数的时候,则会检测到是IWDG复位,然后让红等亮。如果喂狗一直失败的话,则会一直产生系统复位,加上前面延时的效果,则会看到红灯一直闪烁。


我们这里是通过按键来模拟一个喂狗程序,真正的项目中则不是这样使用。while部分是我们在项目中具体需要写的代码,这部分的程序可以用独立看门狗来监控,如果我们知道这部分代码的执行时间,比如是500ms,那么我们可以设置独立看门狗的溢出时间是510ms,比500ms多一点,如果要被监控的程序没有跑飞正常执行的话,那么执行完毕之后就会执行喂狗的程序,如果程序跑飞了那程序就会超时,到达不了喂狗的程序,此时就会产生系统复位,但是也不排除程序跑飞了又跑回来了,刚好喂狗了,歪打正着。所以要想更精确的监控程序,可以使用窗口看门狗,窗口看门狗规定必须在规定的窗口时间内喂狗,早了不行,晚了也不行。


34.4.3 下载验证

把编译好的程序下载到开发板,在1s的时间内通过按键来不断的喂狗,如果喂狗失败,红灯闪烁。如果一直喂狗成功,则绿灯常亮。

推荐阅读

史海拾趣

CALMIRCO公司的发展小趣事

随着技术实力的不断增强,CALMIRCO公司开始积极拓展国内外市场。公司通过参加国际电子展会、建立海外销售渠道等方式,逐渐将产品推向全球。同时,CALMIRCO公司还注重品牌建设,通过广告宣传、媒体报道等多种渠道提升品牌知名度和美誉度。这些举措使得CALMIRCO公司的产品在市场上获得了广泛认可,公司也因此成为电子行业的佼佼者。

Digital公司的发展小趣事

随着业务的不断发展和市场的不断扩大,DIALIGHT公司逐渐实现了全球化布局。他们在美国、英国、丹麦、德国、马来西亚、新加坡、澳大利亚、墨西哥和巴西等地设立了分支机构或办事处,为全球客户提供及时、高效的服务。此外,DIALIGHT还积极寻求与其他企业的合作与共赢,通过战略合作协议的签署,为双方带来新的业务机遇和合作空间。这些举措不仅增强了DIALIGHT的市场竞争力,也为其未来的发展奠定了坚实的基础。

请注意,由于篇幅限制,以上三个故事仅为DIALIGHT公司发展历程的简要概述。如需更详细的信息和更多故事,建议查阅相关资料或访问公司官网。

DINTEK公司的发展小趣事

随着业务的不断发展和市场的不断扩大,DIALIGHT公司逐渐实现了全球化布局。他们在美国、英国、丹麦、德国、马来西亚、新加坡、澳大利亚、墨西哥和巴西等地设立了分支机构或办事处,为全球客户提供及时、高效的服务。此外,DIALIGHT还积极寻求与其他企业的合作与共赢,通过战略合作协议的签署,为双方带来新的业务机遇和合作空间。这些举措不仅增强了DIALIGHT的市场竞争力,也为其未来的发展奠定了坚实的基础。

请注意,由于篇幅限制,以上三个故事仅为DIALIGHT公司发展历程的简要概述。如需更详细的信息和更多故事,建议查阅相关资料或访问公司官网。

GaN Systems公司的发展小趣事

随着市场的不断拓展和技术的不断进步,GAIA盖亚电源持续加大研发投入,致力于技术创新和产品升级。公司拥有一支由超过300名工程师组成的研发团队,他们紧密关注行业动态,积极应对新技术和市场趋势。每年,GAIA盖亚电源都会推出数百种新产品,以满足不同客户的需求。这些新产品不仅涵盖了更广泛的电压范围和输出功率,还集成了最新的滤波、网络调节等先进技术,进一步提升了产品的性能和可靠性。

Horizon Electronics Enterprises Group公司的发展小趣事

为了应对市场需求的多样化和技术发展的快速变化,Horizon开始实施多元化产品布局战略。公司不仅继续深耕半导体芯片领域,还逐步拓展至电子元器件、智能设备、物联网解决方案等多个领域。通过自主研发和合作并购等方式,Horizon不断丰富产品线,满足不同客户的多样化需求。这一战略的实施不仅增强了公司的市场竞争力,也为公司的持续发展注入了新的动力。

Everspin Technologies公司的发展小趣事

Everspin一直致力于MRAM技术的创新和发展。其中,自旋转移力矩MRAM(STT-MRAM)是该公司的重要技术之一。Everspin在平面内和垂直磁隧道结(MTJ)STT-MRAM位单元的开发方面取得了显著成果,并积累了超过600项有效专利和应用的知识产权组合。这些技术的创新和专利的积累,使得Everspin在MRAM市场中保持了领先地位。

问答坊 | AI 解惑

VGA显示器Verilog实现驱动代码

本帖最后由 paulhyde 于 2014-9-15 03:18 编辑 VGA显示器Verilog实现驱动代码    …

查看全部问答>

“洞洞板”的选用与焊接技巧

万用电路板是一种按照标准IC间距(2.54mm)布满焊盘、可按自己的意愿插装元器件及连线的印制电路板,俗称“洞洞板”。相比专业的PCB制版,洞洞板具有以下优势:使用门槛低,成本低廉,使用方便,扩展灵活。比如在学生电子设计竞赛中,作品通常需要 ...…

查看全部问答>

WINCE 5.0 GUI系统显存布局

系统为WINCE 5.0 + S3C2451 液晶的配置参数为RGB565格式.从芯片手册上可知,显存有两种格式: (BSWP = 0, HWSWP = 0)         D[31:16] D[15:0] 000H        P1     ...…

查看全部问答>

simple设置会导致赋值出错么?

如题,在ADS1.2的工程设置中,我把linktype设置为simple,RO Base:0x30008000(我查过,这个地址应该不会有错)之后,当对结构体变量赋值时,总是出错,赋不进想要的值。但当我把linktype设置为scattered,并使用scat文件,就能正确赋值了,这是什 ...…

查看全部问答>

cs8900 问题,在控制面板 网络连接中出现了两个 cs89001 的图标

在控制面板 网络连接中出现了两个 cs89001 的图标。 不知道那位兄弟遇到过,帮忙看下。 …

查看全部问答>

c# DDE(动态数据交换) 客户端程序,如何设置Server与Topic

如题。 由于DDE是一个很老的技术了,已经被OPC代替。但是有些事情还是得用到DDE。 .net 已经不支持DDE,还好,我找到了封装好的API , 下面是我写的一个测试DDE客户端,要与DDE服务器,或者说是DDE服务(service) 连接。 对于输入的service 与t ...…

查看全部问答>

从本地读取位图文件显示的问题

要求是从本地读取一副位图显示在picture control控件里。因为位图的大小不确定所以应该对图像做些缩放处理。请问用什么方法处理?试过用LoadImage()方法,但是显示的图片一片空白。代码如下: CRect mainrect; this->m_BtTouXiang.GetWindowRect( ...…

查看全部问答>

LPC2214 擦除问题

请问在擦除前是不是要用串口线把板子和主机相连. 第一次做,有点不明白,请高手指点一下. 怎么确实板子和主机已经连接成功了,成功又该怎么做. 谢谢!!…

查看全部问答>

请教关于sdram的问题

我的扳子上有一块sdram, 我发现,不能把段定位到sdram中去,只要把段定位到sdram中, 在load的时候,就会提示\\"data verification failed at address 0x80000000. 请问一般是什么原因呢?是不是在EMIF 中sdram相关寄存设置的不对? 而且,我在ti的cc ...…

查看全部问答>

求助:5438RTC问题

请问各位大虾,哪里有5438RTC的应用例程,谢谢!…

查看全部问答>