第6章 独立看门狗实验

第六章 独立看门狗实验

1. 硬件设计

本实验使用到的硬件资源有:

  • 指示灯DS0

  • KEY_UP按键

  • 独立看门狗

前面两个在之前都有介绍,而独立看门狗实验的核心是在 STM32F4 内部进行,并不需要外部电路。但是考虑到指示当前状态和喂狗等操作,我们需要 2 个 IO 口,一个用来输入喂狗信号,另外一个用来指示程序是否重启。喂狗我们采用板上的 KEY_UP 键来操作,而程序重启,则是通过 DS0 来指示的。

2. 软件设计

  • 看门狗函数
IWDG_HandleTypeDef IWDG_Handler; // 独立看门狗句柄
// 初始化独立看门狗
// prer:分频数:IWDG_PRESCALER_4 ~ IWDG_PRESCALER_256
// rlr:自动重装载值,0~0XFFF.
// 时间计算(大概):Tout=((4*2^prer)*rlr)/32 (ms).
void IWDG_Init(u8 prer,u16 rlr)
{
    IWDG_Handler.Instance = IWDG;      // 选择IWDG外设
    IWDG_Handler.Init.Prescaler = prer;// 设置IWDG分频系数
    IWDG_Handler.Init.Reload = rlr;    // 重装载值
    HAL_IWDG_Init(&IWDG_Handler);      // 初始化IWDG,默认会开启独立看门狗    
}

// 喂独立看门狗
void IWDG_Feed(void)
{   
    HAL_IWDG_Refresh(&IWDG_Handler); // 喂狗
}

该函数有 2 个参数,分别用来设置预分频数与重装载寄存器的值。通过这两个参数,就可以大概知道看门狗复位的时间周期为多少了。其计算方式上面有详细的介绍,这里不再多说了。

void IWDG_Feed(void)函数,该函数用来喂狗,因为 STM32 的喂狗只需要向关键字寄存器写入 0XAAAA 即可,也就是调用库函数 HAL_IWDG_Refresh,所以这个函数也是很简单的。

  • 主函数看门狗部分
    IWDG_Init(IWDG_PRESCALER_64, 500);// 看门狗初始化,预分频数为64,重载值为500,溢出时间为1s    
    LED0 = 0; // LED0 熄灭
    while(1)
    {    
        if(KEY_Scan(0) == WKUP_PRES) // 如果WK_UP按下,喂狗
        {
            IWDG_Feed();// 喂狗
        }
        delay_ms(10); 
    }
}

3. 小结

独立看门狗比较简单,没什么好说的,实际上你可以理解为一个向下递减的定时器,只不够多了一个监控功能,如果不能在定时器规定的时间内及时喂狗,那么看门狗就会代替你复位整个程序。独立看门狗配置也不麻烦,参考下面这个结构体:

void IWDG_Init(u8 prer,u16 rlr)
{
    IWDG_Handler.Instance = IWDG;      // 选择IWDG外设
    IWDG_Handler.Init.Prescaler = prer;// 设置IWDG分频系数
    IWDG_Handler.Init.Reload = rlr;    // 重装载值
    HAL_IWDG_Init(&IWDG_Handler);      // 初始化IWDG,默认会开启独立看门狗    
}

2024.9.29 第一次修订,后期不再维护

posted @ 2024-09-29 11:23  hazy1k  阅读(2)  评论(0编辑  收藏  举报