一、IWDG介紹
1.1 IWDG簡介
STM32F1芯片內部含有兩個看門狗外設,一個是獨立看門狗IWDG,另 一個是窗口看門狗WWDG。兩個看門狗外設(獨立和窗口)均可用於檢測 並解決由軟件錯誤導致的故障。獨立看門狗簡單理解其是就是一個12位 遞減計數器,當計數器從某一個值遞減到0時(如果看門狗已激活),系 統就會產生一次復位。如果在計數器遞減到0之前刷新了計數器值,那么 系統就不會產生復位。這個刷新計數器值過程我們稱之為“喂狗”。看 門狗功能由 VDD 電壓域供電,在停止模式和待機模式下仍能工作
1.2 IWDG結構框圖
要更好的理解獨立看門狗,就需要了解它內部的結構
二、IWDG配置步驟
(1)開啟寄存器訪問(給IWDG_KR寄存器寫入0X5555)
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
2)設置IWDG預分頻系數和重裝載值
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
void IWDG_SetReload(uint16_t Reload);
Tout = (4*2^pre) / 40 * rlr
其中Tout為獨立看門狗溢出時間,單位是ms。pre是預分頻器系數(0-6),rlr 是重裝載寄存器的值,公式內的40是獨立看門狗的時鍾。
(3)重載計數器值(喂狗)(給IWDG_KR寄存器寫入0XAAAA)
IWDG_ReloadCounter();
(4)開啟IWDG(給IWDG_KR寄存器寫入0XCCCC)(外設開啟)
IWDG_Enable();
4.編寫獨立看門狗控制程序
本章所要實現的功能是:通過K_UP按鍵進行喂狗,喂狗的時候D2指示 燈亮,同時串口輸出“喂狗”提示信息,超過喂狗時間系統重啟D2指示 燈滅,同時串口輸出“復位系統”提示信息,同時使用D1指示燈閃爍表 示系統運行。程序框架如下:
(1)初始化IWDG(開啟IWDG,設置溢出時間)
(2)編寫主函數
1 #ifndef _iwdg_H 2 #define _iwdg_H
3
4 #include "system.h"
5 void IWDG_Init(u8 pre,u16 rlr); 6 void IWDG_FeedDog(void); //喂狗
7
8 #endif
1 #include "iwdg.h"
2
3 /******************************************************************************* 4 * 函 數 名 : IWDG_Init 5 * 函數功能 : IWDG初始化 6 * 輸 入 : pre:預分頻系數(0-6) 7 rlr:重裝載值(12位范圍0xfff) 8 獨立看門狗復位時間計算公式:t=(4*2^pre*rlr)/40 9 * 輸 出 : 無 10 *******************************************************************************/
11 void IWDG_Init(u8 pre,u16 rlr) 12 { 13 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器寫保護
14 IWDG_SetPrescaler(pre);//設置預分頻系數 0-6
15 IWDG_SetReload(rlr);//設置重裝載值
16 IWDG_ReloadCounter(); //重裝載初值
17 IWDG_Enable(); //打開獨立看門狗
18
19 } 20
21 /******************************************************************************* 22 * 函 數 名 : IWDG_FeedDog 23 * 函數功能 : 喂狗 24 * 輸 入 : 無 25 * 輸 出 : 無 26 *******************************************************************************/
27 void IWDG_FeedDog(void) //喂狗
28 { 29 IWDG_ReloadCounter(); //重裝載初值
30 }
1 #include "system.h"
2 #include "SysTick.h"
3 #include "led.h"
4 #include "usart.h"
5 #include "key.h"
6 #include "iwdg.h"
7
8
9 /******************************************************************************* 10 * 函 數 名 : main 11 * 函數功能 : 主函數 12 * 輸 入 : 無 13 * 輸 出 : 無 14 *******************************************************************************/
15 int main() 16 { 17 u8 i=0; 18
19 SysTick_Init(72); 20 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷優先級分組 分2組
21 LED_Init(); 22 USART1_Init(9600); 23
24 KEY_Init(); 25 IWDG_Init(4,800); //只要在1280ms內進行喂狗就不會復位系統
26
27 led2=1; 28 printf("復位系統\r\n"); 29
30 while(1) 31 { 32 if(KEY_Scan(0)==KEY_UP) 33 { 34 IWDG_FeedDog();//喂狗
35 led2=0; 36 printf("喂狗\r\n"); 37 } 38
39 i++; 40 if(i%20==0) 41 { 42 led1=!led1; 43
44 } 45 delay_ms(10); 46 } 47 }