新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32之獨(dú)立看門(mén)狗(IWDG)和窗體看門(mén)狗(WWDG)

STM32之獨(dú)立看門(mén)狗(IWDG)和窗體看門(mén)狗(WWDG)

作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò) 收藏
  之前有很風(fēng)靡的游戲,名字叫《看門(mén)狗》。該游戲用了很新的引擎技術(shù),打造出了一個(gè)遼闊龐大的世界,內(nèi)容是玩家Aiden·Pearce(主角)是一名精通黑客技術(shù)的高手,當(dāng)時(shí)的世界是處于所有物品都被置了電子設(shè)備控制,整個(gè)城市都在依賴著他們,主人公決定利用自己的技術(shù)為這個(gè)世界懲奸除惡。

    

本文引用地址:http://m.butianyuan.cn/article/201611/318193.htm

  這個(gè)游戲以極高的自由度、出色的游戲質(zhì)量與豐富的游戲內(nèi)容被業(yè)界公認(rèn)為開(kāi)啟次世代游戲的大門(mén)之作,該游戲被IGN評(píng)為年度最佳射擊游戲(下載地址:http://down.ali213.net/pcgame/WatchDogs.html 有機(jī)會(huì)一定玩玩。)

二 開(kāi)門(mén)見(jiàn)山:


    下面言歸正傳,在工作中用的STM32需要使用看門(mén)狗技術(shù):

     看門(mén)狗通俗解釋:

       單片機(jī)系統(tǒng)在外界的干擾下會(huì)出現(xiàn)程序跑飛的現(xiàn)象導(dǎo)致出現(xiàn)死循環(huán),看門(mén)狗電路就是為了避免這種情況的發(fā)生。看門(mén)狗的作用就是在一定時(shí)間內(nèi)(通過(guò)定時(shí)計(jì)數(shù)器實(shí)現(xiàn))沒(méi)有接收喂狗信號(hào)(表示 MCU 已經(jīng)掛了),便實(shí)現(xiàn)處理器的自動(dòng)復(fù)位重啟(發(fā)送復(fù)位信號(hào))。

三  廬山面目:


    STM32芯片一共有兩個(gè)看門(mén)狗,一個(gè)是獨(dú)立看門(mén)狗(IWDG),另一個(gè)是窗體看門(mén)狗(WWDG)

   ?、傧葋?lái)講講獨(dú)立看門(mén)狗:

STM32 的獨(dú)立看門(mén)狗由內(nèi)部專門(mén)的 40Khz 低速時(shí)鐘驅(qū)動(dòng),即使主時(shí)鐘發(fā)生故障,它也仍然
有效。這里需要注意獨(dú)立看門(mén)狗的時(shí)鐘是一個(gè)內(nèi)部 RC 時(shí)鐘,所以并不是準(zhǔn)確的 40Khz,而是
在 30~60Khz 之間的一個(gè)可變化的時(shí)鐘,只是我們?cè)诠浪愕臅r(shí)候,以 40Khz 的頻率來(lái)計(jì)算,看
門(mén)狗對(duì)時(shí)間的要求不是很精確,所以,時(shí)鐘有些偏差,都是可以接受的。

   獨(dú)立看門(mén)狗的配置工作代碼:   

1 void IWDG_Init(u8 prer,u16 rlr)2 {3    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //①使能對(duì)寄存器 I 寫(xiě)操作4    IWDG_SetPrescaler(prer); //②設(shè)置 IWDG 預(yù)分頻值:設(shè)置 IWDG 預(yù)分頻值5    IWDG_SetReload(rlr); //②設(shè)置 IWDG 重裝載值6    IWDG_ReloadCounter(); //③按照 IWDG 重裝載寄存器的值重裝載 IWDG 計(jì)數(shù)器7    IWDG_Enable(); //④使能 IWDG8 }9 //喂獨(dú)立看門(mén)狗10 void IWDG_Feed(void)11 {12    IWDG_ReloadCounter();//reload13 }

主邏輯區(qū)代碼:

1 delay_init();//延時(shí)函數(shù)初始化2 NVIC_Configuration(); //設(shè)置 NVIC 中斷分組 2:2 位搶占優(yōu)先級(jí),2 位響應(yīng)優(yōu)先級(jí)3 KEY_Init(); //按鍵初始化4 IWDG_Init(4,625); //與分頻數(shù)為 64,重載值為 625,溢出時(shí)間為 1s5 while(1)6 {7     if(KEY_Scan(0)==KEY_UP)8     {9         IWDG_Feed(); //如果 按鍵按下,則喂狗10     }11     delay_ms(10);12 }       

程序的功能就是通過(guò)按鍵打開(kāi)看門(mén)狗,當(dāng)看門(mén)狗被觸發(fā)之后執(zhí)行相應(yīng)的操作。

②再來(lái)看看窗體看門(mén)狗

窗口看門(mén)狗(WWDG)通常被用來(lái)監(jiān)測(cè)由外部干擾或不可預(yù)見(jiàn)的邏輯條件造成的應(yīng)用程序
背離正常的運(yùn)行序列而產(chǎn)生的軟件故障。除非遞減計(jì)數(shù)器的值在 T6 位(WWDG->CR 的第六位)
變成 0 前被刷新,看門(mén)狗電路在達(dá)到預(yù)置的時(shí)間周期時(shí),會(huì)產(chǎn)生一個(gè) MCU 復(fù)位。在遞減計(jì)數(shù)
器達(dá)到窗口配置寄存器(WWDG->CFR)數(shù)值之前,如果 7 位的遞減計(jì)數(shù)器數(shù)值(在控制寄存器中)
被刷新, 那么也將產(chǎn)生一個(gè) MCU 復(fù)位。這表明遞減計(jì)數(shù)器需要在一個(gè)有限的時(shí)間窗口中被刷
新。

看門(mén)狗時(shí)間計(jì)算公式:

窗口看門(mén)狗的超時(shí)公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
其中:
Twwdg:WWDG 超時(shí)時(shí)間(單位為 ms)
Fpclk1:APB1 的時(shí)鐘頻率(單位為 Khz)
WDGTB:WWDG 的預(yù)分頻系數(shù)
T[5:0]:窗口看門(mén)狗的計(jì)數(shù)器低 6 位

1 void WWDG_Init(u8 tr,u8 wr,u32 fprer)2 {3     RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 時(shí)鐘使能4     WWDG_CNT=tr&WWDG_CNT; //初始化 WWDG_CNT.5     WWDG_SetPrescaler(fprer); //設(shè)置 IWDG 預(yù)分頻值6     WWDG_SetWindowValue(wr); //設(shè)置窗口值7     WWDG_Enable(WWDG_CNT);8     //使能看門(mén)狗,設(shè)置 counter9     WWDG_ClearFlag(); //清除提前喚醒中斷標(biāo)志位10     WWDG_NVIC_Init(); //初始化窗口看門(mén)狗 NVIC11     WWDG_EnableIT(); //開(kāi)啟窗口看門(mén)狗中斷12 }13 //重設(shè)置 WWDG 計(jì)數(shù)器的值14 void WWDG_Set_Counter(u8 cnt)15 {16     WWDG_Enable(cnt); //使能看門(mén)狗,設(shè)置 counter .17 }18 //窗口看門(mén)狗中斷服務(wù)程序19 void WWDG_NVIC_Init()20 {21     NVIC_InitTypeDef NVIC_InitStructure;22     NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG 中斷23     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //搶占 2 子優(yōu)先級(jí) 3 組 224     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //搶占 2,子優(yōu)先級(jí) 3,組 225     NVIC_Init(&NVIC_InitStructure); //NVIC 初始化26 }27 void WWDG_IRQHandler(void)28 {29     WWDG_SetCounter(WWDG_CNT);30     //當(dāng)禁掉此句后,窗口看門(mén)狗將產(chǎn)生復(fù)位31     WWDG_ClearFlag();32     //清除提前喚醒中斷標(biāo)志位33     LED1=!LED1;34     //LED 狀態(tài)翻轉(zhuǎn)35 }

主邏輯區(qū)代碼:

1 int main(void)2 {3     delay_init();//延時(shí)函數(shù)初始化4     NVIC_Configuration(); //設(shè)置 NVIC 中斷分組 25     usart1_init();串口1初始化6     LED_Init(); //LED 初始化7     KEY_Init(); //按鍵初始化8     LED0=0;9     delay_ms(500);10     WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);//計(jì)數(shù)器值為 7f,窗口寄存器為 5f,//分頻數(shù)為 811     while(1)12     {13         LED0=1;14     }15 }    

功能:

通過(guò) LED0(DS0)來(lái)指示是否正在初始化。而 LED1(DS1)用來(lái)指示是否發(fā)生了中
斷。我們先讓 LED0 亮 300ms,然后關(guān)閉以用于判斷是否有復(fù)位發(fā)生了。在初始化 WWDG 之
后,我們回到死循環(huán),關(guān)閉 LED1,并等待看門(mén)狗中斷的觸發(fā)/復(fù)位。

四  泛泛而談:


再來(lái)分析一下獨(dú)立看門(mén)狗(IWDG)和窗體看門(mén)狗(WWDG)的區(qū)別:

(1)獨(dú)立看門(mén)狗沒(méi)有中斷,窗口看門(mén)狗有中斷
(2)獨(dú)立看門(mén)狗有硬件軟件之分,窗口看門(mén)狗只能軟件控制
(3)獨(dú)立看門(mén)狗只有下限,窗口看門(mén)狗又下限和上限
(4)獨(dú)立看門(mén)狗是12位遞減的。窗口看門(mén)狗是7位遞減的
(5)獨(dú)立看門(mén)狗是用的內(nèi)部的大約40KHZ RC振蕩器,窗口看門(mén)狗是用的系統(tǒng)時(shí)鐘APB1ENR
End!


評(píng)論


技術(shù)專區(qū)

關(guān)閉