历史上的今天
返回首页

历史上的今天

今天是:2024年11月12日(星期二)

正在发生

2019年11月12日 | STM32F1小白系列之四、独立看门狗(IWDG)

2019-11-12 来源:eefocus

一、看门狗原理


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

    };   

}


五、备注


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

推荐阅读

史海拾趣

问答坊 | AI 解惑

请问,以貌取单位好吗?

各位,我想问问应届生求职的情况。 我去一家央企设计院,办公室都有尘土和坏了的椅子,还是甲级设计院呢,我就不明白了,听起来的不错的单位内部怎么会是这样呢? 还有,我去航天二院面试去,安保真严啊!办公楼和办公室有些破旧就不说了,毕竟历 ...…

查看全部问答>

【labview】chinese中级Design Pattern - Producer Consumer

【labview】Design Pattern - Producer Consumer chinese 中级 [ 本帖最后由 安_然 于 2010-5-24 15:54 编辑 ]…

查看全部问答>

全球首款可录制3D影像电视8月发售

本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑    7月22日消息,松下公司21日宣布,将于8月27日发售两款具有录制和播放3D影像功能的等离子电视机“3DVIERA”。松下公司称,这是全球首款集合3D电视和录像功能于一体的新机型。 与分别购置 ...…

查看全部问答>

请教关于90092的使用

本人现在用C8051F020的SPI口线对90092进行控制,对90092进行初始化成功,但是不知道如何在屏幕上叠加字符. 比如用SPIWR()这个子程序对90092发送控制命令. 怎样才能在屏幕上有叠加字符显示?请朋友们帮帮忙,谢谢啦!急!…

查看全部问答>

redhat9.0重新编译内核(2.4.20)后USB键盘无法使用的问题?

小弟现在做linux上的framebuffer驱动,在RH9上编译,内核版本也没有动,用的RH9自带的源代码。在重新编译内核时都正常,重启后, grub菜单出现2.4.20-8custom,选择后启动,到出现xwindows登录界面后,该输入用户名密码时,键盘无法使用。之前在gru ...…

查看全部问答>

VHDL的语法测试题

1.        简述VHDL语句a <= Transport b XOR c AFTER m; 完成的主要功能。2.        分析以下程序段的主要功能:process    begin    if (clk’event and clk=’1’)   ...…

查看全部问答>

【请教】MMA7455 SPI方式读取的数据怎么计算?谢谢

接的是STC的单片机,先谢谢大家了!!!用的代码也附上:另外我中断0和中断1的管脚没接,会不会影响读取数据。数据: E代表精度,K是校验和,中间的三个数据分别是XYZ轴的数据,请问下怎么计算加速度和角度?非常感谢E 0208 023 90048 KE02080 ...…

查看全部问答>

MSP430F149 脉冲捕捉问题求助

如何用TimeB 的TB2实现脉冲捕捉,写了一个超声波程序,用TB0捕捉跳变沿好使,可是用别的就不好使了,大家指导一下啊,谢谢了…

查看全部问答>

学模拟+RS-232\RS-485转换的实际应用

本帖最后由 dontium 于 2015-1-23 11:41 编辑 博文链接: deyisupport./blog/ ... /rs-232-rs-485.aspx 该博文从RS485的原理开始介绍,接着进一步介绍应用领域,应用前景,最后对一个满足工业应用的电路进行分析,论述了一些应用常见 ...…

查看全部问答>