天天看点

【STM32】(6) 窗口看门狗实验一、实验目的

一、实验目的

我们通过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翻转。

继续阅读