这里写目录标题
- 一、IWDG简介(了解)
- 二、IWDG工作原理(熟悉)![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ae55fb4f2d2f49edb468122f67de67e4.png)
- 三、IWDG框图(熟悉)
- 四、IWDG寄存器(熟悉)
- 五、IWDG溢出时间计算(掌握)
- 六、IWDG配置步骤(掌握)
- 七、编程实战:验证不及时喂狗,系统将复位重启(掌握)
一、IWDG简介(了解)
IWDG有什么作用?
二、IWDG工作原理(熟悉)
三、IWDG框图(熟悉)
四、IWDG寄存器(熟悉)
键寄存器(IWDG_KR)
预分频器寄存器 (IWDG_PR)
重装载寄存器(IWDG_RLR)
状态寄存器(IWDG_SR)
寄存器配置操作步骤(了解)
五、IWDG溢出时间计算(掌握)
IWDG最短最长超时时间(F1)
六、IWDG配置步骤(掌握)
c
HAL_IWDG_Init()
c
HAL_IWDG_Refresh()
HAL库相关函数介绍
七、编程实战:验证不及时喂狗,系统将复位重启(掌握)
wdg.c
c
#include "./BSP/WDG/wdg.h"
IWDG_HandleTypeDef g_iwdg_handle; /* 独立看门狗句柄 */
/**
* @brief 初始化独立看门狗
* @param prer: IWDG_PRESCALER_4~IWDG_PRESCALER_256,对应4~256分频
* @arg 分频因子 = 4 * 2^prer. 但最大值只能是256!
* @param rlr: 自动重装载值,0~0XFFF.
* @note 时间计算(大概):Tout=((4 * 2^prer) * rlr) / 40 (ms).
* @retval 无
*/
void iwdg_init(uint8_t prer, uint16_t rlr)
{
g_iwdg_handle.Instance = IWDG;
g_iwdg_handle.Init.Prescaler = prer; /* 设置IWDG分频系数 */
g_iwdg_handle.Init.Reload = rlr; /* 重装载值 */
HAL_IWDG_Init(&g_iwdg_handle); /* 初始化IWDG并启动 */
}
/**
* @brief 喂独立看门狗
* @param 无
* @retval 无
*/
void iwdg_feed(void)
{
HAL_IWDG_Refresh(&g_iwdg_handle); /* 重装载计数器 */
}
wdg.h
c
#ifndef __WDG_H
#define __WDG_H
#include "./SYSTEM/sys/sys.h"
void iwdg_init(uint8_t prer, uint16_t rlr);
void iwdg_feed(void);
#endif
main.c
c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/WDG/wdg.h"
#include "./BSP/KEY/key.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
key_init(); /* 初始化按键 */
delay_ms(100); /* 延时100ms再初始化看门狗,LED0的变化"可见" */
iwdg_init(IWDG_PRESCALER_64, 625); /* 预分频数为64,重载值为625,溢出时间约为1s */
LED0(0); /* 点亮LED0(红灯) */
while (1)
{
if (key_scan(1) == WKUP_PRES) /* 如果WK_UP按下,则喂狗 */
{
iwdg_feed(); /* 喂狗 */
}
delay_ms(10);
}
}