實驗步驟:
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中編寫。