预分频寄存器 IWDG_PR
该寄存器用来设置看门狗时钟(LSI)的分频系数,最低为 4,最高为 256,该寄存器是一个 32 位的寄存器,但是我们只用了最低 3 位,其他都是保留位。
重装载寄存器 IWDG_RLR
该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,只有低 12 位是有效的。
HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);
/* 关键结构体 */
typedef struct
{
IWDG_TypeDef *Instance; /* IWDG 寄存器基地址 */
IWDG_InitTypeDef Init; /* IWDG 初始化参数 */
}IWDG_HandleTypeDef;
typedef struct
{
uint32_t Prescaler; /* 预分频系数 */
uint32_t Reload; /* 重装载值 */
} IWDG_InitTypeDef;
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);
#define __HAL_IWDG_START(__HANDLE__)
WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_ENABLE);
#ifndef __WDG_H
#define __WDG_H
#include "./SYSTEM/sys/sys.h"
void iwdg_init(uint32_t prer, uint16_t rlr); /* 初始化IWDG,并使能IWDG */
void iwdg_feed(void); /* 喂狗 */
#endif
#include "./BSP/WDG/wdg.h"
IWDG_HandleTypeDef iwdg_handler; /*独立看门狗句柄 */
/**
* @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) / 32 (ms).
* @retval 无
*/
void iwdg_init(uint32_t prer, uint16_t rlr)
{
iwdg_handler.Instance = IWDG;
iwdg_handler.Init.Prescaler = prer; /* 设置IWDG分频系数 */
iwdg_handler.Init.Reload = rlr; /* 从加载寄存器 IWDG->RLR 重装载值 */
HAL_IWDG_Init(&iwdg_handler); /* 初始化IWDG并使能 */
}
/**
* @brief 喂独立看门狗
* @param 无
* @retval 无
*/
void iwdg_feed(void)
{
HAL_IWDG_Refresh(&iwdg_handler); /* 喂狗 */
}
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/KEY.h"
#include "./BSP/WDG/wdg.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
key_init(); /* 初始化按键 */
delay_ms(100); /* 延时100ms再初始化看门狗,LED0的变化"可见" */
printf("您还没喂狗,请及时喂狗!\r\n");
iwdg_init(IWDG_PRESCALER_64, 500); /* 预分频数为64,重载值为500,溢出时间约为1s */
LED0(0); /* 点亮LED0(红灯) */
while(1)
{
if (key_scan(1) == WKUP_PRES) /* 如果WK_UP按下,则喂狗,支持连按 */
{
iwdg_feed(); /* 喂狗 */
printf("您已喂狗!\r\n");
}
delay_ms(10);
}
}