STM32F1小白系列之四、独立看门狗(IWDG)

发布者:温文儒雅最新更新时间:2019-11-12 来源: eefocus关键字:STM32F1  独立看门狗  IWDG 手机看文章 扫描二维码
随时随地手机看文章

一、看门狗原理


1、单片机中有一个【寄存器(计数器)】专门用来倒计数,这个计数器倒计数是独立于程序之外的,不受程序影响的。(程序是井,计数器是河,井水不犯河水,你跑你的程序,我记我的数,互不影响。)


2、但是: 

这个【计数器】会有一个初值,这个值会逐次递减,终有一刻会自减到0,当计数自减到0的时候,【系统】就会强制重启,程序会从头开始运行。 

而当计数器每次倒计数到0之前,如果往计数器里面重新写入一次数值,他就永远不会倒计数到0,这时候系统也就不会重启了。


3、所以: 

程序员写程序的时候,如果开启了看门狗,会在程序中实现这样一个功能——专门设定固定的时间循环往复的往【计数器】中写入一个数值(喂狗)。


当程序正常运行的时候,每隔一段时间,【计数器】会被重新写入数值,那么它永远不会倒计时到0, 

而当程序跑飞或者系统卡死,程序不能按照预想的要求来执行,也就不能在设定的时间去喂狗,那么计数器肯定会有一个时刻倒计数到0,系统就会重启,程序就会从头开始跑,又恢复到初始运行状态。


4、所以: 

看门狗的作用就是——不用人为的检查程序是否正常运行,系统是否正常运行,需不需要重启系统,如果程序跑飞或者系统卡死,则自动重新启动系统,而不要人为的主动去重新启动系统。


二、看门狗相关寄存器


1、 键值寄存器 IWDG_KR

2、 预分频寄存器 IWDG_PR

3、 重装载寄存器 IWDG_RLR

4、 状态寄存器 IWDG_SR


三、配置看门狗步骤


1、使能寄存器可写入(即:关闭写保护)

    向【键值寄存器(IWDG_KR)】写入【0xAAAA】即可使【预分频寄存器】和【重装载寄存器】变得可以写入数据。


2、配置预分频值

    数据位[2:0]。

    预分频因子:4/8/16/32/64/128/256


3、配置重装载值

    数据位[11:0].


4、重新装载一次计数值(喂狗一次)


5、启动看门狗


四、看门狗程序


1、使用库函数


1)相关库函数


1 关闭写保护 IWDG_WriteAccessCmd();

2 配置预分频值 IWDG_SetPrescaler();

3 配置重装载值 IWDG_SetReload();

4 重新装载计数器 IWDG_ReloadCounter();

5 使能看门狗(启动看门狗) IWDG_Enable();


2)程序


/*

    函数功能:初始化独立看门狗

    函数名:init_iwdg

    返回值:void

    参数:  pre_scaler_value   预分频值

           reload_value       重装载数值

 */

void init_iwdg(uint8_t pre_scaler_value, uint32_t reload_value)

{

    IWDG_WriteAccessCmd(0x5555);//关闭写保护:IWDG->KR = 0x5555;


    IWDG_SetPrescaler(pre_scaler_value);//分频因子为4,参数由main函数传参传进来,预分频值为64,(4==100),   IWDG->PR = 4, 即:IWDG->PR的bit[2]bit[1]bit[0]分别为100


    IWDG_SetReload(reload_value);//配置重装载值,参数由main函数传参传进来,3秒,公式:T(ms) == [(4 * 2^pre_Scaler) * reload] / 40;


    IWDG_ReloadCounter();//第一次喂狗


    IWDG_Enable();//使能看门狗

}


//喂狗API

void feed_iwdg(void)

{

    IWDG_ReloadCounter();//喂狗,使STM32重新加载【IWDG_RLR中的值】到【看门狗计数器里面】。

}


2、直接配置寄存器


/*

    函数功能:初始化独立看门狗

    函数名:init_iwdg

    返回值:void

    参数:  pre_scaler_value   预分频值

           reload_value       重装载数值

 */

void init_iwdg(uint8_t pre_scaler_value, uint32_t reload_value)

{

    /*配置寄存器*/

    IWDG->KR = 0x5555;  //关闭写保护,可以向IWDG_PR和IWDG_RLR寄存器中写入数据。

    IWDG->PR = pre_scaler_value;        //配置预分频因子,4 == 0100,表示与分频因子为64

    IWDG->RLR = reload_value;               //配置重装载值,公式:T(ms) == [(4 * 2^pre_Scaler) * reload] / 40;


    /*初始化喂狗一次*/

    IWDG->KR = 0xAAAA;  //第一次喂狗。


    /*启动看门狗*/

    IWDG->KR = 0xCCCC;  

}


//喂狗API

void feed_iwdg(void)

{

    IWDG->KR = 0xAAAA;//喂狗,使STM32重新加载【IWDG_RLR中的值】到【看门狗计数器里面】。

}


3、main函数


因为寄存器版本和库函数版本只是初始化配置函数不同,不影响main函数,所以main函数是一样的。 

main函数中主要实现的功能就是:


while循环检测是否有按键按下,若有,则喂狗

程序如下:


 int main(void)

 {      

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

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

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

    KEY_Init();          //按键初始化     

    delay_ms(500);       //延时


    init_iwdg(4,1875);   //初始化看门狗

    LED0=0;              //点亮LED0

    while(1)

    {

        if (KEY_Scan(1))//循环检测,当按下任何一个按键就喂狗一次

        {

            feed_iwdg();

        }

        delay_ms(10);

    };   

}


五、备注


本程序基本是完全照抄正点原子的程序,因为是看了一遍原子哥的程序,然后关掉自己重新写的,所以一些语句可能不同,但是思路完全一样,所以想要原版程序的童鞋可以直接去正点原子论坛找找原版。

关键字:STM32F1  独立看门狗  IWDG 引用地址:STM32F1小白系列之四、独立看门狗(IWDG)

上一篇:stm32正点原子学习笔记(29)独立看门狗实验
下一篇:STM32F0x2 IWDG(独立看门狗)

推荐阅读最新更新时间:2024-11-10 09:27

STM32F1的I2C模块协议简介
I2C是一种多主从的串行通讯协议。STM32F1的I2C模块支持标速(最高100kHz)和高速(最高400kHz)两种工作模式。 一、I2C协议简介 标准的IIC接口有数据线SDA、时钟线SCL两条总线,只能工作于半双工模式,在设计中,对总线的负载电容有一定的要求,具体请查阅元件的技术手册确定。 IIC的通讯时序如图,通讯电平为正逻辑: ※数据发送的起始和终止信号为:SCL为高时, 起始:SDA下降沿 终止:SDA上升沿 ※当总线空闲时,SDA和SCL均为高电平,总线需要外接上拉电阻,阻值5-10k。 ※每次发送一字节(8bits)信号,MSB高位先发。 二、I2C通讯时序(使用时以具体被控芯片手册为准) 通讯时序(主机发
[单片机]
<font color='red'>STM32F1</font>的I2C模块协议简介
STM32 基础系列教程 18 – IWDG
前言 学习stm32 独立看门狗(IWDG)接口使用,学会用STM32内部独立看门狗(IWDG)实现程序异常时自复位功能。 STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。 IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完
[单片机]
STM32 基础系列教程 18 – <font color='red'>IWDG</font>
stm32独立看门狗和窗口看门狗的区别和联系
STM32有2个看门狗:独立看门狗和窗口看门狗。 独立看门狗IWDG:独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。 窗口看门狗WWDG:系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。 简单的讲,看门狗就是检测系统故障的,如果因为系统故障而没有及时喂狗,则引发复位重启。 对于一般的独立看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但是这样有一个隐患,有可能程序跑乱了又跑回正常的地方,或者跑乱的程序正好执行了刷新看门狗操作,这样的情况下一按的看门狗就检测不出来故障了;但是如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷
[单片机]
STM32F1_外部NorFlash存储程序代码
前言 今天总结“STM32F103 外部NorFlash存储程序代码”。今天提供的实例工程是存储程序代码到外部NorFlash,并执行外部NorFlash的代码(既然存储了程序代码,那么肯定也会运行NorFlash的程序)。对于储存在外部NorFlash的程序可以通过多种途径,今天主要使用MDK-ARM工具下载程序到外部NorFlash,但是需要“编程算法”,但这些算法官方都已经写好了的,我们只需要配置一下,直接使用就是了。 NOR FLASH是很常见的一种存储芯片,掉电不会丢失数据。 NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行。这点和NAND FLASH不一样。因此,在嵌入式系统
[单片机]
STM32F1_外部NorFlash存储程序代码
STM8关于IWDG看门狗和HSI高速时钟和复位的坑
前言:我的第一篇博客,快被逼疯了。用的STM8S003F3,耗时5天,问题已解决,结局很坑! 但因为这一个问题,我似乎将stm8的时钟,复位,看门狗,iar的使用几乎全吃透了。 忠告:不要随随便便相信百度里头随便找来的资料! 现象:主频只在16MHz时,程序频繁复位不可控,其他现象异常离奇不阐述了,防止伤脑。 正文:前因后果是这样的: 1,我配置了16M的主频 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//内部高速时钟,不分频 或者:CLK- CKDIVR = 0x00; //HSIDIV = 0 CPUDIV = 0 cpu时钟 = 16Mhz 发现它频繁
[单片机]
STM8关于<font color='red'>IWDG</font><font color='red'>看门狗</font>和HSI高速时钟和复位的坑
独立看门狗IWDG详细解析
独立看门狗IWDG详细解析 为什么要有看门狗? 看门狗的定时原理 寄存器功能简介 看门狗定时器计数原理 看门狗相关寄存器 KR寄存器 PR寄存器 RLR寄存器 SR寄存器 看门狗相关基础知识 什么是“溢出时间”? 溢出时间指的是“从重装载值递减至0的时间”,当距离上次使能键寄存器的时间超过溢出时间,那么看门狗会自动复位,重投开始执行程序。例如:当我们设定溢出时间为1s,但是我们操作键寄存器距离上次使能键寄存器的时间已经是1.2s了,这说明程序已经Reset复位,从头开始执行(从main函数的头部开始执行)。 预分频系数有什么用? “溢出时间”如何计算? 不同预分频系数
[单片机]
<font color='red'>独立</font><font color='red'>看门狗</font><font color='red'>IWDG</font>详细解析
STM32F1笔记(三)UART/USART
UART:Universal Asynchronous Receiver/Transmitter(通用异步收/发器) USART:Universal Synchronous/Asynchronous Receiver/Transmitter(通用同步/异步串行收/发器) 从命名即可看出USART就是UART的基础上添加了同步功能。通常把UART/USART称为串口。 串口包含TLL电平和232的串口,485等电气特性的串口。232、485通常应用于工业。 串口配置的一般步骤可以参考正点原子的总结: 1、串口时钟使能,GPIO时钟使能; 2、串口复位;(我不知道这一步的意义,去掉似乎也没影响,求大神指点)
[单片机]
<font color='red'>STM32F1</font>笔记(三)UART/USART
STM32F1基本定时器实验-外部触发脉冲计数
之前我们用外部中断测量了PWM的频率,而外部触发是设置2个定时器,利用按键触发,一个定时器2用来接受外部触发信号并计数,另一个定时器6实时检测按键。 按照这样的思路,我们的按键读取用状态机思想去读取,使定时器6产生10ms的定时中断来实时检测按键并利用状态机设计思想处理按键信号,将PA1设置成输出引脚,设置定时器2的PA0引脚来接收信号,通过按键触发改变标志位来发送电平信号,再定义全局数存放PA0接收脉冲信号次数,最后串口配置。 什么?你不知道状态机思想?送你学习状态机 说实话,状态机思想可以清晰把你的代码逻辑弄清楚,这个是我自己写按键时画的草图: 画的只要你自己可以看懂就行 代码讲解 首先我们需要按键的状态,
[单片机]
<font color='red'>STM32F1</font>基本定时器实验-外部触发脉冲计数
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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