stm32基本都內置兩種看門狗(另外還有外置的看門狗芯片),窗口看門狗和獨立看門狗,兩種看門狗的使用方法和應用場景各不相同,今天主要講講最常用的獨立看門狗(工作這么多年,沒見誰用過窗口看門狗,這種估計在時序嚴格的場合會用上)。
所謂獨立(Independent watchdog),就是該看門狗有獨立的時鐘源供看門狗使用,VIP專屬。這樣即使程序跑飛,或者主時鐘掛掉,照樣運行。但是精度嘛,你懂的(VIP用戶一般比較飄)。
所謂看門狗,外形雖然不像(一堆電子電路,肯定不像),但行為真的狗,還是一條瘋狗。為啥這么說呢?
這只狗一定要在規定以內的時間(這個時間自己設置)喂食,超出一點都不行,否則就咬人(復位整個程序,讓你的人生重新來過)
但是瘋狗用的好,就是一條專業的好狗,比誰都敬業(雖然會有點飄哈,因此喂狗的時間不能卡太死,需要有充足的余量)。所以絕大部分產品都會用上看門狗,以防意外情況發生,可以有重頭再來的機會。
但是喂狗也有方法,不能隨便喂,不然狗的行為就不專業了(該復位的時候不復位)。所以需要專業的調教。
比如,喂狗的地方一般只有一個地方,并且是一定會執行的。
裸機時,一般放主循環while(1)里面定時執行(沒必要太頻繁)。
RTOS時,一般放在優先級最低的任務中執行,或者空閑任務中(使用鉤子函數)。
千萬千萬不要在中斷處理程序中喂狗,因為可能你的主程序已經跑死,中斷還好好的運行呢(如果要用中斷觸發,可以在中斷處理程序中只設置一個變量標志位,然后在另外位置判斷標志位決定是否喂狗)。
但是看門狗只是一個預防措施,而不是一個正常行為,因此開發過程中,一定要關注看門狗是否出現復位現象,只要出現一次,都要揪出問題的根本原因,否則到了市場上一定會復位的。
引起程序復位的原因有很多種,比如上電、掉電,那么如何看是否由看門狗引起的呢?有個寄存器是可以看到具體原因的,比如stm32f1 (其他的可以自己查手冊)
代碼實現:
hw_cpu_reset_flag_t hw_cpu_reset_get(void)
{
hw_cpu_reset_flag_t temp = {.value = 0};// 自定義的一個結構變量,方便使用
if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
{
temp.flag.power = 1;
}
if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST)!= RESET)
{
temp.flag.low_power = 1;
}
if(RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
{
temp.flag.pin_reset = 1;
}
if(RCC_GetFlagStatus(RCC_FLAG_SFTRST)!= RESET)
{
temp.flag.software_reset = 1;
}
if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
{
temp.flag.independent_dog = 1;
}
if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)!= RESET)
{
temp.flag.window_dog = 1;
}
RCC_ClearFlag();//清除RCC中復位標志
return temp;
}
另外在調試過程中,我們可以一開始就禁用看門狗(一般在調試寄存器中)比如
DBGMCU_Config (DBGMCU_IWDG_STOP, ENABLE);
這樣即使程序因調試而長時間暫停,也不會產生復位,否則看門狗復位,會影響調試。
需要注意的是,即使在在線調試環境下,一旦全速運行,如果程序喂狗不及時,仍然會引起復位(這也是我們希望的,可以在調試過程中發現喂狗是否有問題)
如果我們的代碼已經下載到單片機,但又沒用設置該位,如果你采用魚鷹之前介紹的抓現場環境的方法(關鍵字 顛覆認知),那么也可能會引起看門狗的復位,因此我們既可以在寄存器界面手動設置(看你手速快不快,能不能在復位前設置),也可以通過 *.ini 文件設置該寄存器完成(建議使用該方法,不用拼手速,哈哈)
*.ini 禁用看門狗:
_WWORD (0xE0042004, 0x100); // 注意該代碼會將其它位清零。可以采用下面這種方式
//
DEFINE int temp;
temp = _RWORD (0xE0042004); // CSR address
temp |= 0x100;
_WWORD (0xE0042004, temp);
-
看門狗
+關注
關注
10文章
566瀏覽量
70949 -
寄存器
+關注
關注
31文章
5363瀏覽量
121162 -
RTOS
+關注
關注
22文章
819瀏覽量
119887 -
STM32單片機
+關注
關注
59文章
549瀏覽量
58821 -
stm32f1
+關注
關注
1文章
57瀏覽量
12249
發布評論請先 登錄
相關推薦
獨立看門狗(IWDG)的基礎知識
![<b class='flag-5'>獨立</b><b class='flag-5'>看門狗</b>(IWDG)的基礎知識](https://file.elecfans.com/web2/M00/71/DF/pYYBAGNPvWOAcWdNAAEJcO3mNEI108.png)
STM32中的獨立看門狗和窗口看門狗是什么
![STM32中的<b class='flag-5'>獨立</b><b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>是什么](https://file.elecfans.com/web2/M00/8B/8B/poYBAGPXZXSAK_HNAADYSGGyteo518.jpg)
關于看門狗的一點經驗程序
stm32看門狗時間計算 獨立看門狗和窗口看門狗的特性是什么
STM32看門狗配置(獨立看門狗IWDG和窗口看門狗WWDG)
![STM32<b class='flag-5'>看門狗</b>配置(<b class='flag-5'>獨立</b><b class='flag-5'>看門狗</b>IWDG和窗口<b class='flag-5'>看門狗</b>WWDG)](https://file1.elecfans.com//web2/M00/A6/E1/wKgZomUMQQeANJA7AAAvqvkO9zw240.png)
一文讀懂STM32之獨立看門狗/窗口看門狗的原理
![<b class='flag-5'>一</b>文讀懂STM32之<b class='flag-5'>獨立</b><b class='flag-5'>看門狗</b>/窗口<b class='flag-5'>看門狗</b>的原理](https://file1.elecfans.com//web2/M00/A7/48/wKgZomUMQ42AKZrjAAAe2fikSPw553.png)
MCU獨立看門狗與窗口看門狗的區別
![MCU<b class='flag-5'>獨立</b><b class='flag-5'>看門狗</b>與窗口<b class='flag-5'>看門狗</b>的區別](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32中的獨立看門狗和窗口看門狗
STM32中的獨立看門狗和窗口看門狗
![STM32中的<b class='flag-5'>獨立</b><b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>](https://file.elecfans.com/web2/M00/8B/8B/poYBAGPXZXSAK_HNAADYSGGyteo518.jpg)
評論