一、看門狗概述
1、為什么要看門狗
在由單片機構成的微型計算機系統中,由于單片機的工作常常會受到來自外界電磁場的干擾,造成程序的跑飛。而陷入死循環,程序的正常運行被打斷,由單片機控制的系統無法繼續工作,會造成整個系統陷入停滯狀態,發生不可預料的后果,所以出于對單片機運行狀態進行實時監測的考慮,便產生了一種專門用于監測單片機程序運行狀態的模塊或者芯片,俗稱“看門狗”(watchdog)。
2、看門狗解決的問題是什么
在啟動正常運行的時候,系統不能復位。在系統跑飛(程序異常執行)的情況下,系統復位程序重新執行。
明白了,所以就要每過一段時間喂狗,如果超過該時間段還沒有進行喂狗程序,將視為程序跑飛,則系統看門狗復位。
二、STM32看門狗
STM32內置兩個看門狗,提供了更高的安全性,時間的精確性和使用的靈活性。兩個看門狗設備(獨立看門狗和窗口看門狗)可以用來檢測和解決由軟件錯誤引起的故障。當計數器達到給定的超時值是,觸發一個中斷(僅適用窗口看門狗)或者產生系統復位。
獨立看門狗(IWDG):
由專用的低速時鐘(LSI)驅動,即使主時鐘發生故障它仍有效。
適合應用于需要看門狗作為一個在主程序之外能夠完全獨立工作,并且對時間精度要求低的場合。
窗口看門狗(WWDG):
由從APB1時鐘分頻后得到的時鐘驅動。通過可配置的時間窗口來檢測應用程序非正常的過遲或過早操作。
適合那些要求看門狗在精確計時窗口起作用的程序。
三、獨立看門狗
1、IWDG主要性能
● 自由運行的遞減計數器
● 時鐘由獨立的RC振蕩器提供(可在停止和待機模式下工作)
● 看門狗被激活后,則在計數器計數至0x000時產生復位
2、IWDG功能描述
在鍵寄存器(IWDG_KR)中寫入0xCCCC,開始啟用獨立看門狗;此時計數器開始從其復位值0xFFF遞減計數。當計數器計數到末尾0x000時,會產生一個復位信號(IWDG_RESET)。
無論何時,只要在鍵寄存器IWDG_KR中寫入0xAAAA(喂狗), IWDG_RLR中的值就會被重新加載到計數器,從而避免產生看門狗復位 。
3、IWDG寄存器描述
需要注意:
IWDG_PR 和 IWDG_RLR 寄存器具有寫保護功能。要修改這兩個寄存器的值,必須先向IWDG_KR 寄存器中寫入 0x5555。 將其他值寫入這個寄存器將會打亂操作順序,寄存器將重新被保護。重裝載操作(即寫入 0xAAAA)也會啟動寫保護功能。
鍵寄存器(IWDG_KR)
預分頻寄存器(IWDG_PR)
重裝載寄存器(IWDG_RLR)
狀態寄存器(IWDG_SR)
4、獨立看門狗超時時間
注: 這些時間是按照40kHz時鐘給出。實際上, MCU內部的RC頻率會在30kHz到60kHz之間變化。此外,即使RC振蕩器的頻率是精確的,確切的時序仍然依賴于APB接口時鐘與RC振蕩器時鐘之間的相位差,因此總會有一個完整的RC周期是不確定的。
超出(溢出)時間計算:
Tout=((4×2^PR) ×RLR)/40
其中:Tout的單位為毫秒。
時鐘頻率LSI=40K, 一個看門狗時鐘周期就是最短超時時間。最長超時時間= (IWDG_RLR寄存器最大值)X看門狗時鐘周期。
5、IWDG獨立看門狗操作庫函數
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消寫保護:0x5555使能
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//設置預分頻系數:寫PR
void IWDG_SetReload(uint16_t Reload);//設置重裝載值:寫RLR
void IWDG_ReloadCounter(void);//喂狗:寫0xAAAA到KR
void IWDG_Enable(void);//使能看門狗:寫0xCCCC到KR
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);//狀態:重裝載/預分頻 更新
6、獨立看門狗操作步驟
代碼實現:
void BSP_WDTDOG_Init(void)
{
/ * IWDG超時等于280 ms(超時可能因LSI頻率分散而變化)* /
/ *啟用對IWDG_PR和IWDG_RLR寄存器的寫訪問* /
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
/ * IWDG計數器時鐘:40KHz(LSI)256/40每記一次數時間為:6.4ms * /
IWDG_SetPrescaler(IWDG_Prescaler_256);
/ *將計數器重載值設置為349 總計時間間距為:6.4ms * 1875 = OS_SYSWDG_TIMES * /
IWDG_SetReload((u16)(SYSWDG_TIMEOUT * 1000 /6.4 + 0.5));
/*使能看門狗*/
IWDG_Enable();
/ *重新加載IWDG計數器* /
IWDG_ReloadCounter();
}
① 取消寄存器寫保護:
IWDG_WriteAccessCmd();
例子:
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
取消IWDG_PR和IWDG_RLR寄存器具有寫保護功能(0x5555使能)
其中:
#define IWDG_WriteAccess_Enable ((uint16_t)0x5555)
#define IWDG_WriteAccess_Disable ((uint16_t)0x0000)
② 設置獨立看門狗的預分頻系數,確定時鐘:
IWDG_SetPrescaler();
例子:
IWDG_SetPrescaler(IWDG_Prescaler_256);
IWDG計數器時鐘:40KHz(LSI)256/40每記一次數時間為:6.4ms
#define IWDG_Prescaler_4 ((uint8_t)0x00)
#define IWDG_Prescaler_8 ((uint8_t)0x01)
#define IWDG_Prescaler_16 ((uint8_t)0x02)
#define IWDG_Prescaler_32 ((uint8_t)0x03)
#define IWDG_Prescaler_64 ((uint8_t)0x04)
#define IWDG_Prescaler_128 ((uint8_t)0x05)
#define IWDG_Prescaler_256 ((uint8_t)0x06)
③ 設置看門狗重裝載值,確定溢出時間:
IWDG_SetReload();
超出(溢出)時間計算:
Tout=((4×2^PR) ×RLR)/40
其中:Tout的單位為毫秒。
分頻因子=4*2^prer. 最大值只能是256
其中 Tout 為看門狗溢出時間(單位為 ms); prer 為看門狗時鐘預分頻值(IWDG_PR 值),范圍為 0~7; rlr 為看門狗的重裝載值(IWDG_RLR 的值);比如我們設定 prer 值為 4, rlr 值為 625,那么就可以得到 Tout=64×625/40=1000ms,這樣,看門狗的溢出時間就是 1s, 只要你在一秒鐘之內,有一次寫入 0XAAAA 到 IWDG_KR,就不會導致看門狗復位(當然寫入多次也是可以的)。
例子:
IWDG_SetReload((u16)(SYSWDG_TIMEOUT * 1000 /6.4 + 0.5));
我要設置12s超時,分頻因子為256.
12000= (256)XPLR/40
因此,rlr 看門狗的重裝載值為 1875.
④ 使能看門狗
IWDG_Enable();
#define KR_KEY_RELOAD ((uint16_t)0xAAAA)
#define KR_KEY_ENABLE ((uint16_t)0xCCCC)
void IWDG_Enable(void)
{
IWDG->KR = KR_KEY_ENABLE;
}
使能看門狗(寫0xCCCC到KR),啟動看門狗工作。
注意:
IWDG 在一旦啟用,就不能再被關閉!想要關閉,只能重啟,并且重啟之后不能打開 IWDG,否則問題依舊
⑤ 應用程序喂狗:
IWDG_ReloadCounter();
將使 STM32 重新加載 IWDG_RLR 的值到看門狗計數器里面。 即實現獨立看門狗的喂狗操作。
四、窗口看門狗
1、WWDG簡介
窗口看門狗通常被用來監測,**由外部干擾或不可預見的邏輯條件造成的應用程序背離正常的運行序列而產生的軟件故障。**除非遞減計數器的值在T6位變成0前被刷新,看門狗電路在達到預置的時間周期時,會產生一個MCU復位。在遞減計數器達到窗口寄存器數值之前,如果7位的遞減計數器數值(在控制寄存器中)被刷新, 那么也將產生一個MCU復位。這表明遞減計數器需要在一個有限的時間窗口中被刷新。
2、WWDG主要特性
● 可編程的自由運行遞減計數器
● 條件復位
─ 當遞減計數器的值小于0x40, (若看門狗被啟動)則產生復位。
─ 當遞減計數器在窗口外被重新裝載, (若看門狗被啟動)則產生復位。見0。
● 如果啟動了看門狗并且允許中斷,當遞減計數器等于0x40時產生早期喚醒中斷(EWI),它可以被用于重裝載計數器以避免WWDG復位。
3、WWDG功能描述
如果看門狗被啟動(WWDG_CR寄存器中的WDGA位被置’1’), 并且當7位(T[6:0])遞減計數器從0x40翻轉到0x3F(T6位清零)時,則產生一個復位**。如果軟件在計數器值大于窗口寄存器中的數值時重新裝載計數器,將產生一個復位。**
應用程序在正常運行過程中必須定期地寫入WWDG_CR寄存器以防止MCU發生復位。只有當計數器值小于窗口寄存器的值時,才能進行寫操作。儲存在WWDG_CR寄存器中的數值必須在0xFF和0xC0之間:
● 啟動看門狗
在系統復位后,看門狗總是處于關閉狀態,設置WWDG_CR寄存器的WDGA位能夠開啟看門狗,隨后它不能再被關閉,除非發生復位。
● 控制遞減計數器
遞減計數器處于自由運行狀態,即使看門狗被禁止,遞減計數器仍繼續遞減計數。當看門狗被啟用時, T6位必須被設置,以防止立即產生一個復位。
T[5:0]位包含了看門狗產生復位之前的計時數目;復位前的延時時間在一個最小值和一個最大值之間變化,這是因為寫入WWDG_CR寄存器時,預分頻值是未知的。
配置寄存器(WWDG_CFR) 中包含窗口的上限值:要避免產生復位,遞減計數器必須在其值小于窗口寄存器的數值并且大于0x3F時被重新裝載, 0描述了窗口寄存器的工作過程。
另一個重裝載計數器的方法是利用早期喚醒中斷(EWI)。設置WWDG_CFR寄存器中的WEI位開啟該中斷。當遞減計數器到達0x40時,則產生此中斷,相應的中斷服務程序(ISR)可以用來加載計數器以防止WWDG復位。在WWDG_SR寄存器中寫’0’可以清除該中斷。
注: 可以用T6位產生一個軟件復位(設置WDGA位為’1’, T6位為’0’)。
4、如何編寫看門狗超時程序
除非遞減計數器的值在 T6 位(WWDG->CR 的第六位)變成 0 前被刷新,看門狗電路在達到預置的時間周期時,會產生一個 MCU 復位。在遞減計數器達到窗口配置寄存器(WWDG->CFR)數值之前,如果 7 位的遞減計數器數值(在控制寄存器中)被刷新, 那么也將產生一個 MCU 復位。這表明遞減計數器需要在一個有限的時間窗口中被刷新。
T[6:0]就是 WWDG_CR 的低七位, W[6:0]即是 WWDG->CFR 的低七位。
T[6:0]就是窗口看門狗的計數器,而 W[6:0]則是窗口看門狗的上窗口,下窗口值是固定的(0X40)。
當窗口看門狗的計數器在上窗口值之外被刷新,或者低于下窗口值都會產生復位。
上窗口值(W[6:0]) 是由用戶自己設定的,根據實際要求來設計窗口值,但是一定要確保窗口值大于 0X40,否則窗口就不存在了。
窗口看門狗的超時公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
其中:
Twwdg: WWDG 超時時間(單位為 ms)
Fpclk1: APB1 的時鐘頻率(單位為 Khz)
WDGTB: WWDG 的預分頻系數
T[5:0]:窗口看門狗的計數器低 6 位
根據上面的公式,假設 Fpclk1=36Mhz,那么可以得到最小-最大超時時間表如下表所示:
5、寄存器描述
控制寄存器(WWDG_CR)
WWDG_CR 只有低八位有效, T[6: 0]用來存儲看門狗的計數器值,
隨時更新的,每個窗口看門狗計數周期(4096×2^ WDGTB)減 1。當該計數器的值從 0X40 變為 0X3F 的時候,將產生看門狗復位。
WDGA 位則是看門狗的激活位,該位由軟件置 1,以啟動看門狗,并且一定要注意的是該位一旦設置,就只能在硬件復位后才能清零了。
配置寄存器(WWDG_CFR)
該位中的 EWI 是提前喚醒中斷,也就是在快要產生復位的前一段時間(T[6:0]=0X40) 來提醒我們,需要進行喂狗了,否則將復位!因此,我們一般用該位來設置中斷,當窗口看門狗的計數器值減到 0X40 的時候,如果該位設置,并開啟了中斷,則會產生中斷,我們可以在中斷里面向 WWDG_CR 重新寫入計數器的值,來達到喂狗的目的。注意這里在進入中斷后, 必須在不大于 1 個窗口看門狗計數周期的時間(在 PCLK1 頻率為 36M 且 WDGTB 為 0 的條件下,該時間為 113us)內重新寫 WWDG_CR,否則,看門狗將產生復位!
狀態寄存器(WWDG_SR)
該寄存器用來記錄當前是否有提前喚醒的標志。該寄存器僅有位 0 有效,其他都是保留位。當計數器值達到 40h 時,此位由硬件置 1。
它必須通過軟件寫 0 來清除。對此位寫 1 無效。 即使中斷未被使能, 在計數器的值達到 0X40的時候, 此位也會被置 1。
6、窗口看門狗操作步驟
代碼示例:
//保存 WWDG 計數器的設置值,默認為最大.
u8 WWDG_CNT=0x7f;
//初始化窗口看門狗
//tr :T[6:0],計數器值
//wr :W[6:0],窗口值
//fprer:分頻系數(WDGTB) ,僅最低 2 位有效
//Fwwdg=PCLK1/(4096*2^fprer).
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 時鐘使能
WWDG_CNT=tr&WWDG_CNT; //初始化 WWDG_CNT.
WWDG_SetPrescaler(fprer); //設置 IWDG 預分頻值
WWDG_SetWindowValue(wr); //設置窗口值
WWDG_Enable(WWDG_CNT); //使能看門狗,設置 counter
WWDG_ClearFlag(); //清除提前喚醒中斷標志位
WWDG_NVIC_Init(); //初始化窗口看門狗 NVIC
WWDG_EnableIT(); //開啟窗口看門狗中斷
}
//重設置 WWDG 計數器的值
void WWDG_Set_Counter(u8 cnt)
{
WWDG_Enable(cnt); //使能看門狗,設置 counter .
}
//窗口看門狗中斷服務程序
void WWDG_NVIC_Init()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG 中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //搶占 2 子優先級 3 組 2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //搶占 2,子優先級 3,組 2
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure); //NVIC 初始化
}
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT); //當禁掉此句后,窗口看門狗將產生復位
WWDG_ClearFlag(); //清除提前喚醒中斷標志位
LED1=!LED1; //LED 狀態翻轉
}
① 使能 WWDG 時鐘
WWDG 不同于 IWDG, IWDG 有自己獨立的 40Khz 時鐘,不存在使能問題。而 WWDG使用的是 PCLK1 的時鐘,需要先使能時鐘。 方法是:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 時鐘使能
② 設置窗口值和分頻數
設置窗口值的函數是:
void WWDG_SetWindowValue(uint8_t WindowValue);
這個函數的入口參數 WindowValue 用來設置看門狗的上窗口值。設置分頻數的函數是:
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
這個函數同樣只有一個入口參數,用來設置看門狗的分頻值。
③ 開啟 WWDG 中斷并分組
開啟 WWDG 中斷的函數為:
WWDG_EnableIT(); //開啟窗口看門狗中斷
接下來是進行中斷優先級配置,這里就不重復了,使用 NVIC_Init()函數即可。
④ 設置計數器初始值并使能看門狗
這一步在庫函數里面是通過一個函數實現的:
void WWDG_Enable(uint8_t Counter);
該函數既設置了計數器初始值,同時使能了窗口看門狗。
五、總結
看門狗,這個因為工程里用的是獨立看門狗,所以對它了解比較多一些。
窗口看門狗,我是真心的沒有看一下去。。。 復制粘貼了一通,也沒太搞明白。
上一篇:STM32開發 -- YModem詳解
下一篇:STM32開發 -- UTC、UNIX時間戳、北京時間之間的轉換
推薦閱讀
史海拾趣
進入90年代,電動變焦鏡頭逐漸成為市場的新寵。CBC株式會社緊跟時代潮流,于1992年成功推出電動6倍系列鏡頭。這款鏡頭采用電動變焦設計,操作簡便、速度快捷,極大地提高了拍攝效率。電動6倍系列鏡頭的全球上市,不僅進一步擴大了CBC的市場影響力,也為公司的未來發展奠定了堅實的基礎。
通過以上五個故事,我們可以看到COMPUTAR公司(前身為CBC株式會社)在電子行業中的發展歷程。從創立之初的艱苦創業,到逐步拓展國際市場;從手動變焦鏡頭的研制成功,到非球面高速鏡頭和電動6倍系列鏡頭的誕生與上市,每一步都凝聚著COMPUTAR人的智慧和汗水。正是這些不懈的努力和持續的創新,使得COMPUTAR在電子行業中脫穎而出,成為一家備受尊敬的企業。
Astec America, Inc的創立可以追溯到上世紀80年代,當時創始人看到了電源技術的巨大潛力,并決定在這一領域進行深耕。公司初創時期,團隊主要專注于電源技術的研發,推出了一系列具有創新性的電源產品。這些產品不僅性能穩定、效率高,而且價格合理,很快就在市場上獲得了良好的口碑。
隨著公司業務的不斷發展,芯邦開始積極布局UWB(超寬帶通信)產品線。UWB技術以其高速率、高精度和低功耗的特點,在智能家居、物聯網等領域展現出巨大的應用潛力。芯邦通過研發UWB等信息傳輸技術及產品,致力于從移動存儲及智能家電市場出發,以手機及移動智能設備、車規及汽車周邊產品應用、智能家居及物聯網領域為目標市場,打造多系列產品線格局,提升公司的市場競爭力。
企業文化是企業發展的靈魂。ECM Electronics Limited.注重企業文化的建設,倡導“誠信、創新、協作、共贏”的價值觀。公司注重員工的培訓和發展,為員工提供良好的工作環境和職業發展機會。通過團隊建設活動,增強員工的凝聚力和歸屬感。正是這些積極向上的企業文化和優秀的團隊,為ECM Electronics Limited.的持續發展提供了源源不斷的動力。
隨著全球環保意識的提高,Edcon Components Netherlands Cv積極響應綠色生產的號召。公司采用環保材料和工藝進行生產,減少廢棄物排放和能源消耗。同時,公司還加強了員工的環保意識培訓,鼓勵員工積極參與環?;顒?。這些舉措不僅有助于提升企業的社會責任感,也為公司的可持續發展奠定了堅實基礎。
隨著全球環保意識的提高,Edcon Components Netherlands Cv積極響應綠色生產的號召。公司采用環保材料和工藝進行生產,減少廢棄物排放和能源消耗。同時,公司還加強了員工的環保意識培訓,鼓勵員工積極參與環保活動。這些舉措不僅有助于提升企業的社會責任感,也為公司的可持續發展奠定了堅實基礎。
如題,今天一個女孩如是對我說 覺得挺好玩的 假期在學校里面做機器人呢,17舵機的雙足機器人,主要是做機器人劇場賽的 我們組做了兩個人一條蛇 怪就怪在這幾個機器人調試的過程中只要我小小在他們就好好的,我一離開就出事%…… 不是舵機里面 ...… 查看全部問答∨ |
我按照手冊的時序來寫了2個讀寫函數。但是讀寫的數據總是不對。 我網上找了很多相關資料,感覺他們的操作時序跟我一樣的呀。 我設置的是8位,CPOL=0,CPHA=0。 下面是操作的函數,望有人幫忙分析下。 /******************************** ...… 查看全部問答∨ |
工信部副部長奚國華6月底在北京舉行“2010中國物聯網大會”上表示,工業和信息 化部副部長奚國華在致辭時表示,對于物聯網,工信部將加強規劃指導和政策引導,加強指導協調,盡快研究解決物聯網的內涵,產業界定和產業統計的問題。同時 將超 ...… 查看全部問答∨ |
|
學電子技術的,畢業后一直做軟件開發,現在想重新做硬件或嵌入式開發,想問一下大家, 1、大家在公司做硬件或嵌入式開發都具體做些什么事??? 2、做硬件或嵌入式開發現在有些什么要求、或有些什么必須掌握的技能??? 希望大家幫助解答一下! ...… 查看全部問答∨ |
需要做個窗口顯示網頁 本來想用Iwebbrowser2 ,結果SDK中沒有關鍵的piedocvw.lib Htmlcrl,SDK中有mshtml.h, mshtml.idl 卻沒有mshtml.dll.......... 這該怎么弄?? 還有別的方法嗎? 現在我想自己解析html文件,有沒有什么現成的API或開源代 ...… 查看全部問答∨ |
函數體和函數聲明都是下面的那個,有4個參數 void culDmaFromAes(DMA_DESC* PDmaChannel ,BYTE __xdata* pDstAddr ,BYTE length ,BOOL generateInterrupt) 函數體和函數聲明是一樣的,可是編譯的時候還是報函數體和 ...… 查看全部問答∨ |
|
BeagleBone Black設計:Qt程序編寫和桌面圖標添加! 24bit的7寸LCD屏和觸摸屏調試通過之后,Qt程序的編寫就要提上日程! 因為我用的是官方的SDK,所以其自帶了Qt4.8的庫!我需要做的只是按照官方說明編寫自己的Qt程序,然后編譯之后生成可執行文件,放入開發板當中去執行即可!! 具體搭建Qt編程環 ...… 查看全部問答∨ |