文章目錄
- STM32 IWDG
- 1. IWDG
- 2. IWDG框圖
- 3. IWDG寄存器
- 4. IWDG寄存器操作步驟
- 5. IWDG溢出時間計算
- 6. IWDG配置步驟
- 7. 代碼實現
STM32 IWDG
1. IWDG
-
IWDG
Independent watchdog
,即獨立看門狗,本質上是一個定時器,這個定時器有一個輸出端,可以輸出復位信號。該定時器是一個12位的遞減計數器,當計數器的值減到0的時候,就會產生一個復位信號。如果在計數沒有減到0之前,重置計數器的值的話,那么就不會產生復位信號,這個動作稱為喂狗。 -
作用
異常:外界電磁干擾或者自身系統(硬件或軟件)異常,造成程序跑飛.
獨立看門狗主要用于檢測外界電磁干擾,或者硬件異常導致的程序跑飛問題.
應用:在一些需要高穩定性的產品中,并且對時間精度要求較低的場合.
獨立看門狗是異常處理的最后手段,不可依賴,應在設計時盡量避免異常的發生.
-
IWDG工作原理
時鐘信號來自
LSI
時鐘,經過PSC預分頻器
后變為IWDG
的時鐘,在時鐘下進行遞減,當遞減計數器的值計數到0時,會產生一個復位,如果期間進行喂狗,就不會產生復位。
2. IWDG框圖
從 IWDG 框圖整體認知就是,IWDG 有一個輸入(時鐘 LSI),經過一個 8 位的可編程預分頻器提供時鐘給一個 12 位遞減計數器,滿足條件就會輸出一個復位信號。
STM32F103的獨立看門狗由內部專門的40Khz低速時鐘(LSI)驅動,即使主時鐘發生故障,它也仍然有效。這里需要注意獨立看門狗的時鐘是一個內部RC時鐘,所以并不是準確的 40Khz,而是在30~60Khz之間的一個可變化的時鐘,只是我們在估算的時候,以40Khz的頻率來計算,看門狗對時間的要求不是很精確,所以,時鐘有些偏差,都是可以接受的。
3. IWDG寄存器
-
鍵寄存器(
IWDG_KR
)
獨立看門狗的控制寄存器
0xCCCC
:開始啟動獨立看門狗;0x5555
:表示允許訪問IWDG_PR和IWDG_RLR寄存器;0xAAAA
:重新裝載寄存器的初值. -
預分頻寄存器(
IWDG_PR
)
-
重裝載寄存器(
IWDG_RLR
)
-
狀態寄存器(
IWDG_SR
)
4. IWDG寄存器操作步驟
5. IWDG溢出時間計算
最短最長超時時間
6. IWDG配置步驟
函數 | 主要寄存器 | 主要功能 |
---|---|---|
HAL_IWDG_Init | IWDG_PR/RL/KR | 使能IWDG,設置預分頻系數和重裝載值等 |
HAL_IWDG_Refresh | IWDG_KR | 把重裝載寄存器的值重載到計數器中,喂狗 |
7. 代碼實現
-
實驗效果
在配置看門狗后,LED0將常亮,如果KEY_UP按鍵按下,就喂狗,只要KEY_UP不停的按,看門狗就一直不會產生復位,保持LED0的常亮,一旦超過看門狗定溢出時間(Tot)還沒按,那么將會導致程序重啟,這將導致LED0熄滅一次。
-
硬件連接
-
軟件代碼
-
IWDG初始化函數
void iwdg_init(uint8_t prer, uint16_t rlr) {g_iwdg_handle.Instance = IWDG;g_iwdg_handle.Init.Prescaler = prer; //設置IWDG分頻系數g_iwdg_handle.Init.Reload = rlr; //重裝載值HAL_IWDG_Init(&g_iwdg_handle); //進行初始化 }
-
喂狗函數
void iwdg_feed(void) {HAL_IWDG_Refresh(&g_iwdg_handle); //重裝載計數器 }
-
主函數代碼
int main(void) {HAL_Init(); /* 初始化HAL庫 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 設置時鐘, 72Mhz */delay_init(72); /* 延時初始化 */usart_init(115200); /* 串口初始化為115200 */led_init(); /* 初始化LED */key_init(); /* 初始化按鍵 */delay_ms(100); /* 延時100ms再初始化看門狗,LED0的變化"可見" */iwdg_init(IWDG_PRESCALER_64, 625); /* 預分頻數為64,重載值為625,溢出時間約為1s */LED0(0); /* 點亮LED0(紅燈) */while (1){if (key_scan(1) == 4) /* 如果WK_UP按下,則喂狗 */{iwdg_feed(); /* 喂狗 */}delay_ms(10);} }
在main函數里,先初始化系統和用戶的外設代碼,然后先點亮LED0,在無限循環里開始獲取按鍵的鍵值,按下就喂狗,不是則延時10s,繼續上述操作。當1秒鐘后都沒測到按鍵按下,WDG就會產生一次復位信號,系統復位,可以看到LED0因系統復位熄滅一次,再亮。反之,當按下按鍵后,1秒內再按下按鍵,就會及時喂狗,結果就是系統不會復位,LED0也就不會閃爍。
-
聲明:資料來源(戰艦STM32F103ZET6開發板資源包)
- Cortex-M3權威指南(中文).pdf
- STM32F10xxx參考手冊_V10(中文版).pdf
- STM32F103 戰艦開發指南V1.3.pdf
- STM32F103ZET6(中文版).pdf
- 戰艦V4 硬件參考手冊_V1.0.pdf