通過上面 4 個(gè)步驟,我們就可以啟動(dòng) STM32 的看門狗了,使能了看門狗,在程序里面就必須間隔一定時(shí)間喂狗,否則將導(dǎo)致程序復(fù)位。利用這一點(diǎn),我們本章將通過一個(gè) LED 燈來指示程序是否重啟,來驗(yàn)證 STM32 的獨(dú)立看門狗。
在配置看門狗后, DS0 將常亮,如果 WK_UP 按鍵按下,就喂狗,只要 WK_UP 不停的按,看門狗就一直不會(huì)產(chǎn)生復(fù)位,保持 DS0 的常亮,一旦超過看門狗定溢出時(shí)間(Tout)還沒按,那么將會(huì)導(dǎo)致程序重啟,這將導(dǎo)致 DS0 熄滅一次。我們要加入固件庫(kù)看門狗支持文件 stm32f10x_iwdg.h 和stm32f10x_iwdg.c 文件。
wdg.c 里面的代碼如下:
#include “wdg.h”
//初始化獨(dú)立看門狗
//prer:分頻數(shù):0~7(只有低 3 位有效?。?/p>
//分頻因子=4*2^prer.但最大值只能是 256!
//rlr:重裝載寄存器值:低 11 位有效。
//時(shí)間計(jì)算(大概):Tout=((4*2^prer)*rlr)/40 (ms)。
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //①使能對(duì)寄存器 I 寫操作
IWDG_SetPrescaler(prer); //②設(shè)置 IWDG 預(yù)分頻值:設(shè)置 IWDG 預(yù)分頻值
IWDG_SetReload(rlr); //②設(shè)置 IWDG 重裝載值
IWDG_ReloadCounter(); //③按照 IWDG 重裝載寄存器的值重裝載 IWDG 計(jì)數(shù)器
IWDG_Enable(); //④使能 IWDG
}
//喂獨(dú)立看門狗
void IWDG_Feed(void)
{
IWDG_ReloadCounter();//reload
}
該代碼就 2 個(gè)函數(shù),void IWDG_Init(u8 prer,u16 rlr)是獨(dú)立看門狗初始化函數(shù),就是按照上面介紹的步驟 1~4 來初始化獨(dú)立看門狗的。該函數(shù)有 2 個(gè)參數(shù),分別用來設(shè)置與預(yù)分頻數(shù)與重裝寄存器的值的。通過這兩個(gè)參數(shù),就可以大概知道看門狗復(fù)位的時(shí)間周期為多少了。其計(jì)算方式上面有詳細(xì)的介紹,這里不再多說了。
void IWDG_Feed(void)函數(shù),該函數(shù)用來喂狗,因?yàn)?STM32 的喂狗只需要向鍵值寄存器寫
入 0XAAAA 即可,也就是調(diào)用 IWDG_ReloadCounter()函數(shù),所以,我們這個(gè)函數(shù)也是簡(jiǎn)單的很。
頭文件 wdg.h 的源碼如下大家可以看下,這里我們就不列出來了。
接下來我們看看主函數(shù) main 的代碼。
在主程序里面我們先初始化一下系統(tǒng)代碼,然后啟動(dòng)按鍵輸入和看門狗,在看門狗開啟后馬山點(diǎn)亮 LED0(DS0) ,并進(jìn)入死循環(huán)等待按鍵的輸入,一旦 WK_UP 有按鍵,則喂狗,否則等待 IWDG 復(fù)位的到來。這段代碼很容易理解,該部分代碼如下:
int main(void)
{
delay_init(); //延時(shí)函數(shù)初始化
NVIC_Configuration(); //設(shè)置 NVIC 中斷分組 2:2 位搶占優(yōu)先級(jí),2 位響應(yīng)優(yōu)先級(jí)
uart_init(9600); //串口初始化波特率為 9600
LED_Init(); //初始化與 LED 連接的硬件接口
KEY_Init(); //按鍵初始化
delay_ms(500); //讓人看得到滅
IWDG_Init(4,625); //與分頻數(shù)為 64,重載值為 625,溢出時(shí)間為 1s
LED0=0; //點(diǎn)亮 LED0
while(1)
{
if(KEY_Scan(0)==KEY_UP)
{
IWDG_Feed(); //如果 WK_UP 按下,則喂狗
}
delay_ms(10);
};
}
電子發(fā)燒友App




















評(píng)論