一、实验目的
考虑到指示当前状态和喂狗等操作,我们需要2个I0口,一个用来输入喂狗信号,另外一个用来指示程序是否重启。喂狗我们采用板上的KEY_UP键来操作,而程序重启,则是通过DSO来指示的。
二、代码及分析
#define __HAL_IWDG_START(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_ENABLE)
IWDG_HandleTypeDef iwdg_handler;
int main(void)
{
Cache_Enable(); //打开L1-Cache
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz
delay_init(216); //延时初始化
uart_init(115200); //串口初始化
LED_Init(); //初始化LED
KEY_Init(); //按键初始化
delay_ms(100);
iwdg_handler.Instance = IWDG;
iwdg_handler.Init.Prescaler = IWDG_PRESCALER_64;
iwdg_handler.Init.Reload = 500;
iwdg_handler.Init.Window =IWDG_WINDOW_DISABLE ;//关闭窗口功能
HAL_IWDG_Init(&iwdg_handler);
LED0(0);
while(1)
{
if(KEY_Scan(0)==WKUP_PRES) //如果WK_UP按下,喂狗
{
HAL_IWDG_Refresh(&iwdg_handler); //喂狗
}
delay_ms(10);
}
}
(1) 初始化看门狗:预分频系数,重装载值。
HAL_IWDG_ Init( ) ,该函数在操作PR和RLR寄存器之前会取消写保护。
(2) 启动看门狗 :#define __HAL_IWDG_START(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_ENABLE)
在while循环喂狗:HALIWDG Refresh( )
复位之后LED0灭,延时0.1s后LED0亮,若超出看门后溢出时间1s,因没有喂狗,产生复位,LED0灭。即没有喂狗的情况下,LED0 1s闪烁1次。若按下KYUP进行喂狗,LED0则常亮。