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

五、备注

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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值