第6章 独立看门狗实验
第七章 独立看门狗实验
1. 硬件设计
本实验使用到的硬件资源有:
-
指示灯DS0
-
KEY_UP按键
-
独立看门狗
前面两个在之前都有介绍,而独立看门狗实验的核心是在 STM32F4 内部进行,并不需要外部电路。但是考虑到指示当前状态和喂狗等操作,我们需要 2 个 IO 口,一个用来输入喂狗信号,另外一个用来指示程序是否重启。喂狗我们采用板上的 KEY_UP 键来操作,而程序重启,则是通过 DS0 来指示的。
2. 软件设计
2.1 编程大纲
2.2 代码分析
-
配置IWDG工作参数
-
编写喂狗函数
-
计算IWDG超时时间
-
主函数测试
2.2.1 IWDG配置
// 前置知识
/*
IWDG配置需要两个参数:
分频系数:IWDG_Prescaler_4 ~ IWDG_Prescaler_256
自动重装载值:0~0x0FFF
时间计算公式:
Time = ((分频系数*重装载值)/LSI频率
其中LSI频率通常为32.768KHz
*/
void IWDG_Init(uint8_t prescaler, uint16_t reload)
{
IWDG_Handler.Instance = IWDG; // 选择IWDG外设
IWDG_Handler.Init.Prescaler = prescaler;// 设置分频系数
IWDG_Handler.Init.Reload = reload; // 设置自动重装载值
HAL_IWDG_Init(&IWDG_Handler); // 初始化IWDG
}
void IWDG_Feed(void)
{
HAL_IWDG_Refresh(&IWDG_Handler); // 喂狗
}
2.2.2 主函数测试
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "iwdg.h"
int main(void)
{
HAL_Init();
Stm32_Clock_Init(336,8,2,7);
delay_init(168);
uart_init(115200);
LED_Init();
KEY_Init();
delay_ms(100);
// 初始化IWGD,预分频64,重载值512
// 计算公式:Time = (64 * 512) / LSI
IWDG_Init(IWDG_PRESCALER_64, 512); // 设置超时时间为1S
LED0_ON();
while(1)
{
if(KEY_Scan(0) == KEY_UP_PRES) // 如果按键被按下,进行喂狗
{
IWDG_Feed(); // 喂狗
}
delay_ms(10); // 延时10ms
}
}
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 第一次修订,后期不再维护
2024.12.22 简化内容,代码注释增加