STM32学习笔记:IWDG_独立看门狗

 1、简介

独立看门狗就是一个12位的递减计数器,最大值0xFFF;
计数器的值从某一个值减到0时,系统产生一个复位信号(IWDG_RESET);
在计数器没减到0之前,刷新计数器的值,就不会产生复位信号(就是要喂狗)。

1.1 IWDG性能

        (1)自由运行的递减计数器
        (2)时钟由独立的RC振荡器提供(停止和待机模式下仍可工作)

1.2 IWDG功能

  •       开启IWDG:键寄存器写入(0xCCCC);
  •       计数器从0xFFF递减计数;
  •       计数到0x000,产生复位信号(IWDG_RESET);
  •       键寄存器中写入(0xAAAA),重装载寄存器中的值被加载到计数器,避免看门狗复位。

1.3 硬件看门狗

        如果启用了“硬件看门狗”,系统上电复位后,看门狗自行运行;
        如果计数器计数结束前,软件没有向键寄存器写入相应的值,系统就会复位。

2. IWDG的寄存器

2.1 重装载寄存器(IWDG_RLR)

12位寄存器,存储(要刷新到计数器的值),决定了看门狗溢出的时间。

2.2 键寄存器(IWDG_KR)

独立看门狗的控制寄存器
软件启动看门狗:键寄存器中写入0xCCCC,看门狗启动后就关不掉,只有复位才能关掉。

0xAAAA把RLR中的值重装载到计数器
0x555PR和RLR这两个寄存器可写
0xCCCC启动看门狗

2.3 状态寄存器(SR)

RVU:看门狗计数器重新装载值更新
PVU:看门狗预分频值更新

 3、IWDG的软件设计

(1)取消寄存器写保护
       取消PR和RLR的写保护,使得后面可以操作者两个寄存器

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

(2)设置IWDG的预分频系数和重装载值

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值
void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值

 溢出时间的计算方法 
Tout=((4×2^prer) ×rlr) /4
prer:分频
rlr:加载值 

(3)重载计数值喂狗
       向IWDG_KR写入0xAAAA,刷新计数器的值,喂狗

IWDG_ReloadCounter(); 

(4)启动看门狗
       向 IWDG_KR 写入 0XCCCC

IWDG_Enable(); //使能 IWDG

3.1 看门狗初始化

void IWDG_Init(u8 prer,u16 rlr)
{
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
    IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
    IWDG_SetReload(uint16_t Reload);
    IWDG_ReloadCounter();
    IWDG_ReloadCounter();    
}

3.2 喂狗函数

void IWDG_Feed(void)
{
    IWDG->KR=0xAAAA;
}

3.3 主函数

通过按键来喂狗,如果喂狗成功,则亮绿灯,如果喂狗失败的话,系统重启, 程序重新执行

int main(void)
{
    LED_GPIO_Config();
    
    /* 检测独立看门狗复位是否被设置 */
    if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)!= RESET)
    {
       /*独立看门狗复位了,红灯亮*/
       LED_RED; 
       RCC_ClearFlag();
    }
    else
    {
        lED_BLUE;
    }
    
    Key_GPIO_Config();
    
    /*4分频,重载值625,溢出时间1s*/
    IWDG_Init(4,625);
    
    while(1)
    {
        if(Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON)
        {
            IWDG_Feed();
            LED_GREEN;
        }
    }
}

3.4 喂狗函数的应用

while 部分是我们在项目中具体需要写的代码,这部分的程序可以用独立看门狗来监控,

  • 如果我们知道这部分代码的执行时间,比如是 500ms,那么我们可以设置独立看门狗的溢出时间是510ms,比 500ms 多一点;
  • 如果要被监控的程序没有跑飞正常执行的话,那么执行完毕之后就会执行喂狗的程序,如果程序跑飞了那程序就会超时,到达不了喂狗的程序,此时就会产生系统复位;
  • 但是也不排除程序跑飞了又跑回来了,刚好喂狗了,歪打正着。所以要想更精确的监控程序,可以使用窗口看门狗,窗口看门狗规定必须在规定的窗口时间内喂狗,早了不行,晚了也不行。
  • 项目中遇到的问题:
    • 问题:板子第一次烧程序是好的,第二次烧程序,板子挂掉;
    • 第一次烧好代码,喂狗程序启动,代码不会复位,代码正常运行
    • 第二次要把代码烧进入,必须把看门狗断开,让板子复位,重启一下,烧入新代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值