STM32HAL庫-03-WWDG窗口看門狗

實驗步驟:
1、使能窗口看門狗時鐘(※)
2、設置窗口值, 分頻數 和計數器 初始值(※)
3、開啓WWDG(※)
4、餵狗(WWDG 的餵狗操作實際就是往 CR 寄存器重寫計數器值

(可選:當窗口看門狗的計數器值減到 0X40 的時候,若開啓了中斷,則會產生中斷,但是計數器仍會遞減)

5、使能中斷通道並配置中斷優先級(※)
6、編寫中斷服務函數

看門狗的計數器值,隨每個窗口看門狗計數週期(4096×分頻係數)/PCLK1 減 1

窗口看門狗工作示意圖:
在這裏插入圖片描述
1、使能窗口看門狗時鐘(※)
不同於獨立看門狗,窗口看門狗使用的是PCLK1時鐘

	__HAL_RCC_WWDG_CLK_ENABLE();

2、設置窗口值, 分頻數 和計數器 初始值(※)

	WWDG_HandleStruct.Instance = WWDG;
	WWDG_HandleStruct.Init.Counter = 0x7f; 		//0x40~ 0x7f
	WWDG_HandleStruct.Init.Prescaler = WWDG_PRESCALER_8;  //分頻係數 1,2,4,8
	WWDG_HandleStruct.Init.Window = 0x5f;			//<0x80
	
	HAL_WWDG_Init(&WWDG_HandleStruct);

3、開啓WWDG(※)

	HAL_WWDG_Start_IT(&WWDG_HandleStruct);

或者

	HAL_WWDG_Start(&WWDG_HandleStruct);

注意,兩者使用一個即可,我剛開始用時沒弄清兩個的區別,兩個都添加到程序中(先HAL_WWDG_Start,再HAL_WWDG_Start_IT)導致出錯(但是反過來卻沒問題),看了一下源碼HAL_WWDG_Start_IT裏面包含了HAL_WWDG_Start的操作。

4、餵狗(WWDG 的餵狗操作實際就是往 CR 寄存器重寫計數器值

HAL_WWDG_Refresh(&WWDG_HandleStruct,0x7f);

(可選:當窗口看門狗的計數器值減到 0X40 的時候,若開啓了中斷,則會產生中斷,但是計數器仍會遞減)
5、使能中斷通道並配置中斷優先級(※)

	HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); //設置優先級分組
	HAL_NVIC_SetPriority(WWDG_IRQn,2,2); //設置優先級
	HAL_NVIC_EnableIRQ(WWDG_IRQn);	//使能中斷

6、編寫中斷服務函數

void WWDG_IRQHandler(void)
{
	HAL_WWDG_IRQHandler(&WWDG_HandleStruct);//官方提供HAL_WWDG_IRQHandler
}
	
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg) //回調函數
{
	HAL_WWDG_Refresh(&WWDG_HandleStruct,0x7f);
	LED0^=1;
}

建議使用官方的HAL_WWDG_IRQHandler,裏面已經添加好了清除中斷標誌等一系列操作,將自己要做的操作在回調函數HAL_WWDG_WakeupCallback中編寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章