(stm32f103學習總結)—獨立看門狗(IWDG)


一、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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM