一、实验目的
我们通过DS0和DS1来指示STM32F767的复位情况和窗口看门狗的喂狗情况。
二、代码及分析
WWDG_HandleTypeDef wwdg_handler;
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
__HAL_RCC_WWDG_CLK_ENABLE();
HAL_NVIC_EnableIRQ(WWDG_IRQn ); //使能WWDG_IRQn 中断通道
HAL_NVIC_SetPriority(WWDG_IRQn ,2,3); //抢占优先级2,子优先级3
}
void WWDG_IRQHandler (void)
{
HAL_WWDG_IRQHandler(&wwdg_handler);
}
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
// HAL_WWDG_Refresh(&wwdg_handler);
LED1_Toggle;
}
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(); //按键初始化
LED0(0); //点亮LED0
delay_ms(300); //延时300ms再初始化看门狗,LED0的变化"可见"
wwdg_handler.Instance = WWDG;
wwdg_handler.Init.Prescaler = WWDG_PRESCALER_8;
wwdg_handler.Init.Window = 0x5f;
wwdg_handler.Init.Counter= 0x7f;
wwdg_handler.Init.EWIMode=WWDG_EWI_ENABLE; //使能窗口看门狗提前唤醒中断
HAL_WWDG_Init(&wwdg_handler);
while(1)
{
LED0(1); //熄灭LED灯
}
}
(1) 通过函数HAL_WWDG_Init( )来设置 窗口值、分频数和计数器初始值。
(2) 在回调函数HAL_WWDG_MspInit( ) 中,使能看门狗时钟,设置看门狗提前唤醒中断的优先级。
(3) 在窗口看门狗中断服务函数 WWDG_IRQHandler ( ) 中调用 HAL_WWDG_IRQHandler( )。
(4) HAL_WWDG_IRQHandler( ) 会调用提前唤醒回调函数 HAL_WWDG_EarlyWakeupCallback()在该函数内部编写喂狗操作和LED1翻转。