STM32看门狗的使用

发布者:天涯拾遗最新更新时间:2021-05-18 来源: eefocus关键字:STM32  看门狗  Jlink  SWD  模式 手机看文章 扫描二维码
随时随地手机看文章

为什么使用看门狗


事情很简单先前做的一款采集数据的产品不知道为何异常,陷入死循环然后“死机”,分析了很多次,没发现原因,但是每次重新上点后就能正常采集到数据。后来找到了解决方法:看门狗!目的是当程序走入死循环或者硬件异常时,可以自动复位,这样就可以得到跟重新上电后差不多的效果了。


使用的平台:stm32f103系列单片机


使用的烧写调试模式:Jlink SWD 模式。


使用STM32官方模板库。


ST系列单片机看门狗分为两种:


1.独立看门狗,2.窗口看门狗。


独立看门狗:


可参看RM(reference Manual)的Independent watchdog (IWDG)


当然,只是简要查看下RM中的介绍(至于寄存器的操作,我们可以略过,因为我们使用库的开发,但是基本流程一定要了解!)。


在这里我们要抓住几个关键点:


a、stm32f10x系列有两个看门狗,看门狗主要用于检测由于软件出错的问题,并触发系统自动复位,或者触发一个中断(窗口看门狗才有)。


b、独立看门狗的时钟源为LSI,尽管主时钟出错,它还是能保持激活状态。窗口看门狗的时钟源为APB1时钟,并且可以修改分频值。


c、独立看门狗:有独立时钟(内部低速时钟LSI),所以不受系统硬件影响的系统故障探测器。主要用于监视硬件错误。精确度要求比较低。


d、窗口看门狗:时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了,主要用于监视软件错误。精确度要求更高。


看门狗原理简介:有某个寄存器按照时钟源不断的递减(有只狗,不断的消耗能量),当该寄存器为0时则会触发系统复位(狗会叫),为了不使得寄存器为0,我们就要按时的重新设置寄存器的值(喂狗),这样当软件正常工作时(正常喂狗,狗就不会叫)不断的重设寄存器就不会导致复位。当万一软件陷入死循环,不再重设寄存器(没有喂狗,狗就会叫)。这样就会产生复位了。


因此,假设我们有个软件有时候会内存出错,或者陷入死循环,那么我们就可以通过独立看门狗来使得该器件复位。


废话少说:


代码示例:伸手党快来!


//----------------------


void IWDG_Init()


{


//Enable write access to IWDG_PR and IWDG_RLR registers


IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);


//Configure the IWDG prescaler


IWDG_SetPrescaler(IWDG_Prescaler_16); //10k


//Configure the IWDG counter value


IWDG_SetReload(2500); // Bits11:0 RL[11:0]: Watchdog counter reload value ~ Only 12bit ~max value = 4096


IWDG_ReloadCounter();


IWDG_Enable();


}


//----------------------


What?这代码是怎么写出来的,Don't worry,Let me tell you !


由于我们使用的是ST官方的库,因此有很多文档说明!看看注释就知道啦!如下:


首先,打开官方库的任一template:使用keil MDK 打开如下目录


stsw-stm32062.zipSTM32F2xx_StdPeriph_Lib_V1.1.0ProjectSTM32F2xx_StdPeriph_TemplateMDK-ARM


这样你就会在左手边看到一个如下图一样的文件。简要查看下,我们所要使用的是IWDG这个功能。因此肯定是stm32f2xx_iwdg.c这个文件啦!(f2xx系列的库才有注释,10x的没有。。不过差不多,可能10x的教程相对较多。


1.png


打开后就有相关的详细介绍了!


* ===================================================================


* How to use this driver


* ===================================================================


* 1. Enable write access to IWDG_PR and IWDG_RLR registers using


* IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable) function


*


* 2. Configure the IWDG prescaler using IWDG_SetPrescaler() function


*


* 3. Configure the IWDG counter value using IWDG_SetReload() function.


* This value will be loaded in the IWDG counter each time the counter


* is reloaded, then the IWDG will start counting down from this value.


*


* 4. Start the IWDG using IWDG_Enable() function, when the IWDG is used


* in software mode (no need to enable the LSI, it will be enabled


* by hardware)


*


* 5. Then the application program must reload the IWDG counter at regular


* intervals during normal operation to prevent an MCU reset, using


* IWDG_ReloadCounter() function.


别说看不懂哈!


如下验证整个看门狗的过程:


IWDG_Init();


IWDG_ReloadCounter();


printf("SysInitrn");


while(1)


{


Delay_us(1000);


IWDG_ReloadCounter();


printf("1000 rn");


Delay_us(10000);


IWDG_ReloadCounter();


printf("10000 rn");


Delay_us(100000);


IWDG_ReloadCounter();


printf("100000 rn");


Delay_us(200000);


IWDG_ReloadCounter();


printf("200000 rn");


Delay_us(300000);


IWDG_ReloadCounter();


printf("200000 rn");


Delay_us(400000);


IWDG_ReloadCounter();


printf("400000 rn");


Delay_us(500000);


IWDG_ReloadCounter();


printf("500000 rn");


Delay_us(600000);


IWDG_ReloadCounter();


printf("600000 rn");


Delay_us(700000);


IWDG_ReloadCounter();


printf("700000 rn");


Delay_us(800000);


IWDG_ReloadCounter();


printf("800000 rn");


Delay_us(900000);


IWDG_ReloadCounter();


printf("900000 rn");


Delay_us(1000000);


IWDG_ReloadCounter();


printf("1000000 rn");


IWDG_ReloadCounter();


Delay_us(2000000);


printf("2000000rn");


}


这样,设置的看门狗必须为每1s喂狗一次,因此,到最后的延时2s的打印函数是不会被打印出来的,直接又一次复位了.


另外,需要注意的是:


独立看门狗的ReloadCounter寄存器只有12位~!意思就是,最大值为2的12次方 = 4096,千万不能超出!


003jhWmagy6RxZ0StR3bd.png


独立看门狗的时钟如上图为40khz.


关键字:STM32  看门狗  Jlink  SWD  模式 引用地址:STM32看门狗的使用

上一篇:使用变参函数实现STM32串口的简易printf功能
下一篇:STM32串口中断使用

推荐阅读最新更新时间:2024-11-06 17:57

上海推行“海派”智慧医疗模式
    据悉,由上海电信主导的“智慧医疗”模式已覆盖上海60多家医院和30多个社区卫生中心,正成为上海智慧城市应用的一大特色。     打针看病“网约优先”   上海闵行区的古美社区卫生服务中心是一个拥有100多名医务人员的普通社区卫生服务中心,但它却为区内15万居民提供着优质的医疗卫生服务,无处不在的信息网络将医生和病人的距离拉得很近,也很紧。   走进古美社区卫生服务中心的大厅,随处可见“网约优先”的字样,顾名思义就是网络预约过的病患可优先候诊,为了缩短就医者的等待时间,医院强烈建议——“网约”。在古美社区卫生服务中心辖区内,所有人都可通过家中的电脑上网预约门诊、康复治疗、定期检查等各种医疗服务,而到达卫生中心后,
[医疗电子]
STM32之I2C模块调试总结
前一段时间对STM32的I2C模块进行了调试,今天做一个总结。关于I2C协议的知识,这里就不再赘述,网上有很多介绍I2C协议的文章。目前实现I2C协议的方式有两种,一是采用GPIO口来模拟I2C协议,另外一种是使用STM32自带的I2C模块。虽说使用GPIO口模拟I2C协议较为复杂,需要详细了解I2C协议的内容,但是实现这种方式的资料也非常多,网上都有对应的源码实现,只需要简单修改,就可以实现功能。而针对使用STM32自带的I2C模块,网络上贬斥的声音较多,说是模块本身自带bug,容易出问题,甚至还有人说是史上最难调的I2C模块。当然了,这些问题我自己目前还没有遇到,可能需要以后来验证了。好了,言归正传,今天主要记录一下调试过程以
[单片机]
<font color='red'>STM32</font>之I2C模块调试总结
STM32单片机通信协议操作步骤及注意事项
STM32单片机通信协议是一种用于在不同设备之间进行数据传输的协议,它可以帮助设备之间进行高效的通信。STM32单片机通信协议可以用于实现多种不同的应用,如智能家居、智能安防、智能交通等。 STM32单片机通信协议的使用方法主要包括以下几个步骤: 1. 首先,需要确定使用的协议类型,如UART、I2C、SPI等,并确定使用的协议的具体参数,如波特率、数据位、停止位等。 2. 然后,需要在STM32单片机上配置相应的通信接口,并将其与外部设备连接起来。 3. 接着,需要编写相应的程序,实现STM32单片机与外部设备之间的数据传输。 4. 最后,需要将程序烧录到STM32单片机上,并运行程序,实现STM32单片机与外部设备之间的数
[单片机]
STM32中的优先级概念
STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作 亚优先级 或 副优先级 ,每个中断源都需要被指定这两种优先级。 1.什么是占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行 抢断式优先响应,俗称中断嵌套。 2.什么是副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应; 在占先式优先级相同的情况下,如果有低副优先级中断正在执行,高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应 非抢断式响应(不能嵌套)。 3.判断中断是否
[单片机]
配电网开启全新智能模式
配电网作为电网神经末梢,上接电力主网,下连千家万户,是保障和改善民生的重要基础设施。长期以来,配网在线监测、故障报警、主动抢修和线损管理是电网研发和建设的重中之重。而在现有设备基础上,如何更好地提升配电网自动化水平,建设高可靠的城市配电网显得愈发重要。 自动化系统对故障 实现分秒级自愈 停电检修通知越来越少,自动化系统对故障实现分秒级自愈,故障停电从以往的2—3小时缩短至几分钟乃至几秒,停电对客户的影响降至最低……配电网作为地区电网承上启下的重要环节和城乡发展不可或缺的基础设施,正在一线城市中开启全新智能模式。 自愈是智能配电网不同于传统电网的一个重要特征,智能电网的自愈能力是提增供电可靠性的“利器”。
[新能源]
STM32 外部中断/事件控制器EXTI
EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的20个中断/事件线。每个中断/事件线都有一个边缘检测器,可以实现对输入信号的上升沿或下降沿检测。EXTI可以实现对每个中断/事件线进行单独的配置,可以单独配置为中断或者事件,以及触发事件的属性。 如下图所示,为EXTI的功能框图。EXTI有两个功能,一个是产生中断,一个是产生事件,下面我们将对这两个功能进行讲解。 1.中断产生 如上图所示,红色虚线指示的是一个产生中断的线路,最终流入到NVIC中断控制器内。 编号1是输入线,可以指定到任意的GPIO,也可以是一些外设事件,输入线一般是存在电平变化的信号
[单片机]
<font color='red'>STM32</font> 外部中断/事件控制器EXTI
电子负载定电流与定电阻模式的区别
电子负载定电流与定电阻模式的区别 当测试电源时,使用电子负载的定电流与定电阻负载模式主要差异在开机与关机时功率消耗不同;其次为定电流负载模式不受电源输出电压变动影响,故较适合测试需求。下图为电源开机时,使用定电流与定电阻负载模式时负载电流波形差异:图(a)为电源的交流输入电源;图(b)是电源自己的输出电压,输出电压在t0开始上升,然后在t1时达到稳定的输出电压;图(c)是当电子负载为CR模式时,电源的输出负载电流;图(d)是当电子负载为 CC 模式时,电源的输出负载电流。 在从图(c)与(d)中,当电子负载为CC模式时,电源在t0到t1之间必须提供更多的输出功率。图(e)是使用海洋仪器推出的博计3310D系列电子负载于定电
[模拟电子]
电子负载定电流与定电阻<font color='red'>模式</font>的区别
STM32自学之SPI的DMA操作(寄存器级)
STM32自学之SPI的DMA操作(寄存器级) 一、实验目标 学会配置STM32的SPI寄存器和DMA寄存器,实现STM32的SPI1与SPI2通信功能,每次发送一字节数据,并可多次发送,如果接收的数据正确,则点亮LED灯。之后看可以利用DMA来实现什么功能~~~ 二、实验目的 加入DMA的SPI通信相对于普通SPI通信有什么好处?ST给SPI加了DMA功能出于什么目的?我觉得这是很重要的一个问题,一直边学习边想。以下是我的看法: 减少CPU负荷?我想这应该是DMA最主要的功能,可是对于SPI通信来说,其实大部分时候我们需要根据发送的指令- 目标器件的应答来决定下一个指令,所以此时CPU还是需要一直等待每次通信的结束。而且
[单片机]
<font color='red'>STM32</font>自学之SPI的DMA操作(寄存器级)
小广播
设计资源 培训 开发板 精华推荐

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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