历史上的今天
返回首页

历史上的今天

今天是:2025年03月13日(星期四)

正在发生

2019年03月13日 | 【STM32】独立看门狗概述、寄存器、库函数(IWDG一般步骤)

2019-03-13 来源:eefocus

STM32F1xx官方资料:


《STM32中文参考手册V10》-第17章 独立看门狗


独立看门狗概述

看门狗的定义

在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环;或者程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果。所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。


简单点说:看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收到喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)。


看门狗的作用和要求:


在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行;

在启动正常运行的时候,系统不能复位。

STM32的内置看门狗


STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗、窗口看门狗)可以用来检测和解决由软件错误引起的故障。当计数器达到给定的超时值时,触发一个中断(仅适用窗口看门狗)或者产生系统复位。


独立看门狗(IWDG)由专用的低速时钟(LSI)驱动(40kHz),即使主时钟发生故障它仍有效。独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。


窗口看门狗由从APB1时钟(36MHz)分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。  窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。


独立看门狗的功能


在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信(IWDG_RESET)。


无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。


如果程序异常,就无法正常喂狗,从而系统复位。



注意:IWDG_PR和IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555。以不同的值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA)也会启动写保护功能。


独立看门狗相关配置寄存器

键寄存器(IWDG_KR)



作用:写入0xAAAA,不停地喂狗,避免复位;写入0x5555表示允许访问IWDG_PR和IWDG_RLR寄存器;写入0xCCCC,启动看门狗工作(若选择了硬件看门狗则不受此命令字限制)。最起初的复位值是从0xFFF开始递减,喂狗之后再从重装载寄存器的值开始递减。


预分频寄存器(IWDG_PR)



作用:对时钟频率进行分频。


重装载寄存器(IWDG_RLR)



作用:用于定义看门狗计数器的重装载值,每当向IWDG_KR寄存器写入0xAAAA时,重装载值会被传送到计数器中。随后计数器从这个值开始递减计数。


状态寄存器(IWDG_SR)



作用:对预装载值更新、预分频值更新状态进行监控。


 


独立看门狗超时时间


超出(溢出)时间计算:


Tout=((4×2^PR) ×RLR)/40


其中:Tout的单位为毫秒。


时钟频率LSI=40K, 一个看门狗时钟周期就是最短超时时间。最长超时时间= (IWDG_RLR寄存器最大值)X看门狗时钟周期。


比如,想要设置超出时间为1s(也就是说,如果1s之内没有喂狗,就直接复位),设置预分频系数为64(也就是说,PR位为4,即[2:0]位为100),由此可以计算出RLR为625。


也就是说,在时钟信号为40kHz,预分频系数为64的时候,从625递减至0的事件是1s。


独立看门狗相关配置库函数


2个初始化函数


void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);

void IWDG_Enable(void);


作用:前者取消IWDG_PR和IWDG_RLR寄存器具有写保护功能(0x5555使能),后者使能看门狗(写0xCCCC到KR)。


这里需要注意一点:IWDG一旦启动,就不能被关闭!如果想要关闭,只能重启,并且重启之后不能再次打开。


2个参数设置函数


void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);

void IWDG_SetReload(uint16_t Reload);


作用:前者设置预分频系数,后者设置重装载值。


1个喂狗函数


void IWDG_ReloadCounter(void);

作用:不断喂狗,避免复位(写0xAAAA到KR)。


独立看门狗一般步骤

取消寄存器写保护。调用函数:IWDG_WriteAccessCmd();

设置独立看门狗的预分频系数,确定时钟。调用函数:IWDG_SetPrescaler();

设置看门狗重装载值(根据溢出时间确定)。调用函数:IWDG_SetReload();

使能看门狗。调用函数:IWDG_Enable();

应用程序喂狗。调用函数:IWDG_ReloadCounter()。

下面按照这个一般步骤来进行一个简单的独立看门狗程序:


//初始化独立看门狗

//prer:分频数:0~7(只有低3位有效!)

//分频因子=4*2^prer.但最大值只能是256!

//rlr:重装载寄存器值:低11位有效.

//时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).

void IWDG_Init(u8 prer,u16 rlr) 

{

  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能对寄存器IWDG_PR和IWDG_RLR的写操作


IWDG_SetPrescaler(prer);  //设置IWDG预分频值:设置IWDG预分频值为64


IWDG_SetReload(rlr);  //设置IWDG重装载值


IWDG_ReloadCounter();  //按照IWDG重装载寄存器的值重装载IWDG计数器


IWDG_Enable();  //使能IWDG

}

 

//喂独立看门狗

void IWDG_Feed(void)

{   

  IWDG_ReloadCounter();//reload    

}

 int main(void)

 {

delay_init();     //延时函数初始化   

  LED_Init();   //初始化与LED连接的硬件接口

KEY_Init();          //按键初始化  

delay_ms(500);    //让人看得到灭

IWDG_Init(4,625);    //与分频数为64,重载值为625,溢出时间为1s    

LED0=0; //点亮LED0

while(1)

{

if(KEY_Scan(0)==WKUP_PRES)

{

IWDG_Feed();//如果WK_UP按下,则喂狗

}

delay_ms(10);

};  

}



推荐阅读

史海拾趣

Amptek Inc公司的发展小趣事

Amptek Inc 是一家专注于放射性测量和分析仪器的公司,提供各种 X 射线和伽马射线探测器以及相关的测试设备和软件。以下是 Amptek 公司发展的五个相关故事:

  1. 公司成立与早期发展:Amptek 公司于1987年成立,总部位于美国马萨诸塞州贝弗利市。公司成立初期,主要从事于放射性测量仪器的研发和生产。创始人团队在核物理和仪器设计领域拥有丰富的经验,致力于提供高性能、高精度的测量和分析解决方案。

  2. 技术创新与产品升级:随着技术的不断进步,Amptek 公司持续进行技术创新和产品升级。公司引入先进的探测器技术和数据处理算法,不断提升产品的性能和精度。公司的 X 射线和伽马射线探测器在放射性测量和分析领域具有很高的声誉,被广泛应用于科学研究、医学诊断、工业检测等领域。

  3. 全球市场拓展:Amptek 公司在全球范围内建立了广泛的销售网络和服务体系。除了在美国设立销售和服务中心外,公司还在欧洲、亚洲等地设立了分支机构和代理商,为全球客户提供及时的技术支持和售后服务。公司的产品远销全球,赢得了国内外客户的信赖和好评。

  4. 科研合作与应用推广:Amptek 公司与世界各地的科研机构、大学和实验室保持着紧密的合作关系,共同开展科研项目和应用研究。公司的产品被广泛应用于粒子物理、天体物理、材料科学、核医学等领域的实验和研究中,为科学家和研究人员提供了强大的实验工具和数据支持。

  5. 持续发展与未来展望:Amptek 公司将继续致力于技术创新和产品研发,不断提升产品的性能和功能,满足客户不断增长的需求。公司将继续拓展国际市场,加强与客户的合作关系,进一步巩固在放射性测量和分析领域的领先地位。同时,公司还将关注新兴市场和新技术的发展趋势,积极布局未来的发展方向。

Conexcon Group公司的发展小趣事

面对日益激烈的市场竞争,Conexcon Group积极寻求与国内外知名企业的战略合作。通过与行业巨头的联合研发和市场推广,公司成功将自身产品推向了更广阔的市场。同时,这些合作也为公司带来了先进的技术和管理经验,进一步提升了公司的核心竞争力。在合作中,Conexcon Group始终坚持开放、共赢的原则,与合作伙伴共同推动电子行业的发展。

广州盛炬(GZSJ)公司的发展小趣事

随着全球化进程的加速,Conexcon Group积极实施国际化战略,将业务拓展至海外市场。公司通过在海外设立研发中心和生产基地,进一步提升了自身的研发能力和生产效率。同时,公司还加强了与国际知名品牌的合作,通过共同推广和营销活动,提升了自身品牌在国际市场的知名度和影响力。这些举措不仅为公司带来了丰厚的利润回报,也为公司的长远发展奠定了坚实的基础。

Defense Supply Center Columbus公司的发展小趣事

随着国防事业的不断发展,军事电子产品的市场需求也在不断增加。Defense Supply Center Columbus公司敏锐地捕捉到了这一市场机遇,积极拓展国内外市场。公司通过与国内外知名企业和机构建立合作关系,共同开发新产品、新技术,不断拓展市场份额。同时,公司还积极参加各类国际展览和论坛,展示公司的技术实力和产品优势,吸引了众多潜在客户的关注。这些市场拓展的努力,为公司的发展注入了新的动力。

AAEON公司的发展小趣事

在电子行业,产品质量是企业生存和发展的关键。Defense Supply Center Columbus公司始终将质量管理放在首位,建立起一套完善的质量管理体系。公司严格按照国际标准进行生产和检测,确保每一件产品都符合质量要求。同时,公司还注重员工的培训和教育,提高员工的质量意识和操作技能。这些措施的实施,使得公司的产品质量得到了显著提升,赢得了客户的广泛赞誉。

天二科技(EVER OHMS)公司的发展小趣事

天二科技(EVER OHMS)于1988年正式成立,其初创团队便专注于电阻器领域的研发与制造。面对当时电子行业的激烈竞争,天二科技凭借对电阻器技术的深入理解,成功开发出多款高性能、高精度的电阻器产品,迅速在市场中崭露头角。这些产品不仅满足了当时市场的需求,更为公司后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

70个IC封装术语

1、BGA(ball grid array)球形触点陈列,表面贴装型封装之一。在印刷基板的背面按陈列方式制作出球形凸点用以代替引脚,在印刷基板的正面装配LSI芯片,然后用模压树脂或灌封方法进行密封。也称为凸点陈列载体(PAC)。引脚可超过200,是多引脚LSI用的 ...…

查看全部问答>

学51的经典例子

本帖最后由 paulhyde 于 2014-9-15 09:30 编辑 给初学者的最好例子,希望对初学者有用啊 [ 本帖最后由 liujia1 于 2009-7-26 23:35 编辑 ]  …

查看全部问答>

protel99鼠标增强工具(最后版本了)

在最新版本4.0中将修改所存在的BUG,并新加用`键(Esc下面按键)代替回车功能,减少左右向右移动和鼠标移动次数,加快速度。值得一提的是可用中键单击实现按键P的功能,这样可以和别的快捷键组合出很多功能,比如在PCB中按下S后再单击中间即可实现 ...…

查看全部问答>

求助:TFT LCD的驱动电路

大家好,本人正在做的一个显示终端,准备使用7寸液晶(带触摸),原来一直用单色小屏,头一次使用彩屏感觉很头大,所以特来求助。   产品情况是这样的:该显示终端与另外的设备通过串口通讯接受一些数据进行显示(主要是些文档内容), ...…

查看全部问答>

执行TouchCalibrate() 没反映

我在EVC应用程序中执行TouchCalibrate();  结果就是屏幕闪几下就没反映, 没有出来校准程序。请教这是为什么? 我是在PC上的wce emulator上运行的。…

查看全部问答>

keil里怎么模拟stm32的指令

我想在keil的用模拟器学习cortex的汇编指令,会用到的芯片是stm32。 现在工程里加了启动文件stm32f10x.s,另外有一个自己写的很小的汇编文件,是在资料上抄的。编译和汇编是可以过的,但是连接时会报错。我看了工程生成的.map文件,发现是空的 ...…

查看全部问答>

msp430仿真器JTAG接口第二脚电源连接问题

我看TI user guide上说JTAG第二脚是是仿真器电源输出脚,但我看到很多就是将这个脚直接接VCC,这是为什么呢?这不与内部电源电路相冲突吗?请各位高手指点一二,谢谢了!…

查看全部问答>

A题所需器材

本帖最后由 paulhyde 于 2014-9-15 03:35 编辑 比赛说明里没有说明不能用模块,是否可以用模块,用什么模块    …

查看全部问答>

STC单片机内部"假"的EEPROM存long型数一定要先擦,才能写》》》

我被这个假的EEPROM坑了一段时间,我一开始认为擦除整个扇区太不好了,就没有写擦除函数。因为我一开始是要向EEPROM里村32位数,所以我一直以为是我将32位数转换为四个数的转换函数写错了,最后才发现,stc内部的是flash要先擦才能写,真坑啊…

查看全部问答>