基本概念
看門狗解決的問題是什么?
在系統跑飛(程序異常執行)的情況,是系統復位,程序重新執行。
獨立看門狗適應用于需要看門狗作為一個在主程序之外能夠完全獨立工作,并且對時間精度要求低的場合。
工作原理
在鍵值寄存器中寫入0xCCCC,開始啟用獨立看門狗,此時計數器開始從其復位值遞減,當計數器值計數到0時會產生一個復位信號。
無論何時,只要在鍵值寄存器中寫入0xAAAA,重裝載寄存器的值就會重新加載到計數器,從而避免計數器到0,產生復位信號。如果程序異常,就無法往鍵值寄存器中寫入0xAAAA,重裝載寄存器的值無法加載到計數器中,計數器會減到0,從而產生一個系統復位信號。
獨立看門狗寄存器
- IWDG_KR:鍵值寄存器,0~15位有效
- IWDG_PR:預分頻寄存器,0-2位有效
- IWDG_RLR:重裝載寄存器,0~11位有效
- IWDG_SR:狀態寄存器,0~1位有效
獨立看門狗超時時間
Tout = ((4*2prer)rlr)/32
Tout:看門狗溢出時間,單位為ms
prer:預分頻值IWDG_PR
rlr:重裝載值(IWDG_RLR)
獨立看門狗操作步驟
- 初始化看門狗:預分頻系數,重裝載值
HAL_IWDG_Init();
- 啟用看門狗
HAL_IWDG_Start();
- 喂狗
HAL_IWDG_Refresh();
具體代碼
- 初始化看門狗:預分頻系數,重裝載值
IWDG_HandleTypeDef iwdg_handler;
void iwdg_init(void)
{iwdg_handler.Instance = IWDG;iwdg_handler.Init.Prescaler = IWDG_PRESCALER_64; //設置預分頻寄存器 IWDG_PRiwdg_handler.Init.Reload = 500; //設置重裝載寄存器IWDG_RLRHAL_IWDG_Init(&iwdg_handler);HAL_IWDG_Start(&iwdg_handler); //啟用看門狗
}
Prescaler = IWDG_PRESCALER_64;設置的是4*2^prer=64,Reload = 500設置的是rlr,注意IWDG_RLR重裝載寄存器,只有0~11位有效,不能超過寄存器存儲范圍。
- 啟用看門狗,在第一步實現了
- 喂狗,在main函數實現了
int main(void)
{// u8 key;HAL_Init(); //初始化HAL庫 Stm32_Clock_Init(360,25,2,8); //設置時鐘,180Mhzdelay_init(180); //初始化延時函數uart_init(115200); //初始化USARTLED_Init(); //初始化LED KEY_Init(); //初始化按鍵delay_ms(100);iwdg_init();//HAL_IWDG_Start(&iwdg_handler); //啟用看門狗LED0 = 0;while(1){if(KEY_Scan(0)==KEY0_PRES){HAL_IWDG_Refresh(&iwdg_handler);//LED1 = !LED1;delay_ms(10);}}
}