第6章 独立看门狗实验

第七章 独立看门狗实验

1. 硬件设计

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

  • 指示灯DS0

  • KEY_UP按键

  • 独立看门狗

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

2. 软件设计

2.1 编程大纲

2.2 代码分析

  1. 配置IWDG工作参数

  2. 编写喂狗函数

  3. 计算IWDG超时时间

  4. 主函数测试

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 简化内容,代码注释增加

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