1. 程式人生 > >STM32自學筆記——看門狗

STM32自學筆記——看門狗

STM32的看門狗有倆個 WWDG和IWDG 兩者最大的區別就是IWDG只有一個餵食下限而WWDG顧名思義窗戶必須在一個範圍內餵食才能保證不會觸發復位

一.IWDG(獨立看門狗)
1) 取消暫存器防寫( 向 IWDG_KR 寫入 0X5555)通過這步,我們取消 IWDG_PR 和 IWDG_RLR 的防寫,使後面可以操作這兩個暫存器,
設定 IWDG_PR 和 IWDG_RLR 的值。 這在庫函式中的實現函式是:

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

這個函式非常簡單, 顧名思義就是開啟/取消防寫,也就是使能/失能寫許可權。
2) 設定獨立看門狗的預分頻係數和重灌載值,

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //分頻係數
IWDG_Prescaler_4 設定 IWDG 預分頻值為 4
IWDG_Prescaler_8 設定 IWDG 預分頻值為 8
IWDG_Prescaler_16 設定 IWDG 預分頻值為 16
IWDG_Prescaler_32 設定 IWDG 預分頻值為 32
IWDG_Prescaler_64 設定 IWDG 預分頻值為 64
IWDG_Prescaler_128 設定 IWDG 預分頻值為 128
IWDG_Prescaler_256 設定 IWDG 預分頻值為 256
void IWDG_SetReload(uint16_t Reload); //重灌載值0-0x0fff

下面是倆個函式的資料
設定好看門狗的分頻係數 prer 和重灌載值就可以知道看門狗的喂狗時間,該時間的計算方式為:
Tout=((4×prer) ×rlr) /40
其中 Tout 為看門狗溢位時間(單位為 ms); prer 為看門狗時鐘預分頻值( IWDG_PR 值); rlr 為看門狗的重灌載值( IWDG_RLR 的值);
比如我們設定 prer 值為 16, rlr 值為 625,那麼就可以得到 Tout=64×625/40=1000ms,這樣,看門狗的溢位時間就是 1s。這裡需要提醒大家的是,看門狗的時鐘不是準確的 40Khz,所以在喂狗的時候,最好不要太晚了,否則,有可能發生看門狗復位。
3) 過載計數值喂狗( 向 IWDG_KR 寫入 0XAAAA)庫函式裡面過載計數值的函式是:

IWDG_ReloadCounter(); //按照 IWDG 重灌載暫存器的值重灌載 IWDG 計數器

4) 啟動看門狗(向 IWDG_KR 寫入 0XCCCC)庫函式裡面啟動獨立看門狗的函式是:

IWDG_Enable(); //使能 IWDG

注意 IWDG 在一旦啟用,就不能再被關閉!想要關閉,只能重啟,並且重啟之後不能開啟 IWDG,否則問題依舊,所以在這裡提醒大家,如果不
用 IWDG 的話,就不要去開啟它,免得麻煩。
一般示例如下

#include "wdg.h"
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //①使能寫操作
IWDG_SetPrescaler(prer); //②設定 IWDG 預分頻值:設定 IWDG 預分頻值
IWDG_SetReload(rlr); //②設定 IWDG 重灌載值
IWDG_ReloadCounter(); //③按照 IWDG 重灌載暫存器的值重灌載 IWDG 計數器
IWDG_Enable(); //④使能 IWDG
}
//喂獨立看門狗
void IWDG_Feed(void)
{
IWDG_ReloadCounter();//reload 
}

二.窗戶看門狗
WWDG 窗戶看門狗 Window Watch DoG
在自己的中斷程式喂狗
1.可程式設計自由執行的遞減計數器
2.復位條件: (1). 當計數器的數值從0x40減到0x3F時(2) .當重新整理看門狗時計數器的數值大於視窗上限值時(視窗的值可以進行設定最大為0x7f 當喂狗時會比較窗戶暫存器和遞減計數器的值如果遞減計數器的值大於視窗暫存器時,會發生置位就相當於設定了一個上限喂狗的時間必須在上限以下才行 這也體現了視窗這個詞的含義)
3.若允許中斷,當遞減計數器等於0x40時可以產生中斷,使遞減計數器值被重灌以避免復位

1) 使能 WWDG 時鐘
WWDG 不同於 IWDG, IWDG 有自己獨立的 40Khz 時鐘,不存在使能問題。而 WWDG使用的是 PCLK1 的時鐘,需要先使能時鐘。 方法是:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 時鐘使能

2) 設定視窗值函式是:

void WWDG_SetWindowValue(uint8_t WindowValue);//設定看門狗的上視窗值值在0x40-0x7f

設定分頻數的函式是:

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);//設定看門狗的分頻值
WWDG_Prescaler_1 WWDG 計數器時鐘為( PCLK/4096) /1
WWDG_Prescaler_2 WWDG 計數器時鐘為( PCLK/4096) /2
WWDG_Prescaler_4 WWDG 計數器時鐘為( PCLK/4096) /4
WWDG_Prescaler_8 WWDG 計數器時鐘為( PCLK/4096) /8

3) 開啟 WWDG 中斷並分組,開啟 WWDG 中斷的函式為:

WWDG_EnableIT(); //開啟視窗看門狗中斷

再用NVIC_Init()函式即可。
4) 設定計數器初始值並使能看門狗

void WWDG_Enable(uint8_t Counter);
該引數取值必須在 0x400x7F 之間
WWDG 一旦被使能就不能被失能

該函式既設定了計數器初始值,同時使能了視窗看門狗。
5) 編寫中斷服務函式
用來儲存重要的資訊
示例

void WWDG_Init(u8 wr,u32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 時鐘使能
WWDG_SetPrescaler(fprer); //設定 IWDG 預分頻值
WWDG_SetWindowValue(wr); //設定視窗值
WWDG_Enable(0x7f); //使能看門狗,設定 counter
WWDG_ClearFlag(); //清除提前喚醒中斷標誌位
WWDG_NVIC_Init(); //初始化視窗看門狗 NVIC
WWDG_EnableIT(); //開啟視窗看門狗中斷
}
//視窗看門狗中斷服務程式
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與IWDG的主要區別是有一個視窗控制,WWDG的中斷是給你最後一次喂狗的機會,通常這個中斷不是讓你執行喂狗操作的;一般進到這個中斷時表示你在其它地方安排的喂狗操作不能奏效,而發生這種現象時,肯定是系統有問題了,或者是程式有Bug,或者是碰到了干擾,在這種情況下,這個中斷是為了讓你的程式在發生真正的看門狗復位前,有一個緊急處理的機會,如儲存重要的資料,或做系統剎車等操作。
由此看出,簡單地在WWDG中斷喂狗,既沒有發揮WWDG相對於IWDG的優勢,又因為在中斷中喂狗而為以後的產品留下了隱患。

幾點思考:
第一、我們可以發現即使設定了最大值,WWDG最大計時僅僅有58ms,我們在比較大的程式中也沒必要執行一小段就新增一個喂狗程式,想使其定時5S或10S的時間再復位系統應該怎樣處理呢?通過實驗我找到一種方法,就是在中斷函式中再做一個額外計數器,如果計數器沒有達到設定值,就重新載入喂狗定時器初值,同時使設定值加1,當計數器達到設定值時,就不載入喂狗定時器初值,這時看門狗定時器就會從從0x40減到0x3F產生系統復位。使用這個方法可以將定時時間拓展到 58ms*額外計數器設定值,定個幾十秒都不是問題

第二,當額外計數器達到設定值時,此時說明程式沒有及時復位這個額外計數器,軟體或硬體發生了錯誤,將時系統復位,我們需要儲存一些執行過程中的變數,僅僅有不到1ms的時間(從0x40減到0x3F最長大概為910us)怎麼夠用呢? 

這樣就先寫Wwdg_Feed(0x7F)重新加定時器初值,再對我們的儲存函式進行改造,多新增一些Wwdg_Feed(0x7F)函式,使其不至於再減到0x40,儲存工作都做好之後,不再喂狗,那麼再次發生中斷後不再喂狗就會復位系統了。

第三,如果發生復位,如何區分是上電覆位還是看門狗復位呢?
在初始化WWDG時候,有一個RCC_GetFlagStatus(RCC_FLAG_WWDGRST)可以用於判斷是否發生看門狗復位,如果是重新上電引起的復位這個值當然是系統預設值,如果是看門狗復位的話這個值就會發生變化,這樣就可以針對這兩種不同狀態進行狀態恢復。

理解
1、有個7位遞減計數器(WWDG->CR),就這個計數器和視窗計數器(WWDG->CFR)決定什麼時候喂狗。 狗喂早了,復位——“早”體現在 計數器值(tr)>視窗值(wr),也就是計數器值還沒有減到視窗值以下

2、當 0x40 < 計數器值(tr) < 視窗值(wr) 時,這時候最適合喂狗了,也只有在這時候喂狗才合適;

3、當 計數器的值 從0x40變到0x3F的時候,將產生看門狗復位;當然在要產生復位的前一段時間,如果開啟了提前喚醒中斷,那麼就會進入中斷,在中斷函式裡,我們需要及時喂狗,否則會產生復位;

4、據網上資料介紹,在這個中斷裡面一般不進行喂狗,一般是系統去世前的“遺囑”,比如儲存重要的資料等。這個就需要根據個人需要設計。

相關推薦

STM32自學筆記——看門

STM32的看門狗有倆個 WWDG和IWDG 兩者最大的區別就是IWDG只有一個餵食下限而WWDG顧名思義窗戶必須在一個範圍內餵食才能保證不會觸發復位 一.IWDG(獨立看門狗) 1) 取消暫存器防寫( 向 IWDG_KR 寫入 0X5555)通過這步,我們

STM32之獨立看門與視窗看門總結

一、獨立看門狗 STM32 的獨立看門狗由內部專門的 40Khz 低速時鐘驅動,即使主時鐘發生故障,它也仍然有效。 看門狗的原理:微控制器系統在外界的干擾下會出現程式跑飛的現象導致出現死迴圈,看門狗電路就是為了避免這種情況的發生。看門狗的作用就是在一定時間內(通

STM32-自學筆記(9.SysTick定時器控制LED燈閃爍,程式用到的庫函式介紹)

1.SysTick_CLKSourceConfig 函式原型:viod SysTick_CLKSourceConfig (u32 SysTick_CLKSource) 功能:選擇SysTick的時鐘源 引數:SysTick_CLKSource:SysTick時鐘源 引數:S

STM32-自學筆記(8.使用STM32的SysTick定時器控制LED燈閃爍)

SysTick定時器,被稱為“系統節拍時鐘”。SysTick屬於ARM  Cortex-M3核心的一個內設,STM32也帶有SysTick定時器。 SysTick定時器的基本結構 SysTick工作原理: SysTick從時鐘源介面獲得時鐘驅動 從重灌暫存器將

STM32-自學筆記(7.用GPIO點亮LED,程式用到的庫函式介紹)

1.RCC_DeInit 函式原型:void RCC_DeInit (void) 功能:將外設RCC暫存器重設為預設值。 引數:無 例子:RCC_DeInit ();      //將外設RCC暫存器重設為預設值   2.RCC_HSE

STM32-自學筆記(6.用GPIO點亮LED)

實驗說明:將兩個LED燈點亮,隔一段時間後,將它們熄滅。 硬體電路: 如圖 GPIOA.2引腳連線LED燈,在連線一個1kΩ的限流電阻,最後接地。          GPIOA.3引腳連線LED燈,在連線一個1kΩ的限流電阻,最後接

STM32自學筆記(1.什麼是STM32

STM32微控制器的核心:  Cortex-M3處理器。 巢狀中斷向量控制器(NVIC)是Cortex-M3處理器中一個比較關鍵的元件。提供了標準的中斷架構和優秀的中斷響應能力,為超過240個終端源提供專門的中斷入口,並可以賦予每個中斷源單獨的優先順序。 Cort

STM32之獨立看門和視窗看門定時器

STM32F10系列晶片內建了2個看門狗,提高了更高的安全性等好處。獨立看門狗(IWDG)是由專門的40KHz的低速時鐘驅動,即使主時鐘發生故障也仍然有效。 IWDG的主要特徵有自由執行的遞減計數器,時鐘由獨立的RC振盪器提供,看門狗被啟用後,則在計數器計數至0x000時產

ARM開發(7)基於STM32的獨立看門

基於STM32的獨立看門狗 一 獨立看門狗原理: 1.1 本實驗實現STM32的獨立看門狗 1.2 實驗思路:理解STM32獨立看門狗原理,根據其原理寫驅動。 1.3 開發環境 : MDK5 庫函式版本開發 JLINK模擬

stm32的視窗看門的一點發現

今天看stm32的視窗看門狗,突然發現很不正常,於是做了各方面的實驗得出以下結論,由於只是實驗了得出的結論沒有官方結論,所以如果有人有理論依據請告知我,非常感謝1 1.一旦使能視窗看門狗的時鐘,SR暫存器的EWIF位就會被置1 2.一旦在定義的視窗範圍外喂狗就會復位 3.在

STM32之獨立看門的那些事

為什麼MCU會具有看門狗呢?帶著這個疑問,來了解看門狗的那些事。就連51微控制器都帶有看門狗,說明這條狗對我們來說有著 不一般的意義。看門狗的目的一句話說:防止程式亂跑。MCU在不同的環境下程式的執行會受到干擾,比如陷入死迴圈怎麼辦? 這就是養狗的好處呀,就算你沒養過狗,你

STM32的獨立看門

STM32 內 部自帶了 2 個看門狗:獨立看門狗(IWDG)和視窗看門狗(WWDG) STM32 的獨立看門狗由內部專門的 40Khz 低速時鐘驅動,即使主時鐘發生故障,它也仍然 有效。這裡需要注意

STM32自學筆記——複用重對映

埠複用 什麼事埠複用: STM32有很多的內建外設,這些外設的外部引腳都是與GPIO複用的。也就是說,一個GPIO如果可以複用為內建外設的功能引腳,那麼當這個GPIO作為內建外設使用的時候,就叫做複

STM32之獨立看門原理

STM32的獨立看門狗由內部專門的40Khz低速時鐘驅動,即主時鐘發生故障,它也仍然有效,這裡我們需要注意獨立看門狗的時鐘不是準確的40Khz,二是在30~60Khz之間變化的一個時鐘,只是我們估算以40Khz來計算,看門狗對時間要求不是很青雀,時鐘有點偏差還是可以接受的

STM32開發筆記45:看門驅動程式的移植

微控制器型號:STM32F070F6P6 本文介紹將看門狗驅動程式移植到自己工程中的方法,本專案使用的是獨立看門狗IWDG。   1、在STM32CubeMX中使能看門狗,如下圖所示。 2、檢視看門狗時鐘。 3、對看門狗進行設定,這裡主要的是設定IW

stm32 獨立看門和窗口看門區別h5魚蝦蟹源碼出售

情況 企鵝 電路 判斷 默認 設置 如果 添加 正常 看門狗介紹看門狗這東西雖然簡單h5魚蝦蟹源碼出售(h5.hxforum.com) 聯系方式170618633533企鵝2952777280 微信Tel17061863533 源碼出售,售房卡出售,平臺出租,但我相信絕大

STM32看門了解及代碼演示

clear tle 最小值 就會 del size 概念 channels gpio 一、介紹: STM32看門狗分為獨立看門狗和窗口看門狗兩種,其兩者使用調條件如下所示, IWDG和WWDG兩者特點如下圖所示: 獨立看門狗的手冊資料: 串口

MSP430看門使用筆記&&低功耗模式下如何用看門監控程序跑飛

register 循環 就會 但是 thold 溢出 避免 都是 由於 一、看門狗簡介 1、看門狗可用來當定時器計時,也可用來防止程序跑死。主要對應到兩種工作模式,定時器模式和看門狗模式。 2、MSP430默認看門狗模式打開,因此一般在程序初始化前,會用到指令“WDTCTL

stm32 獨立看門和視窗看門區別

本文轉自: http://blog.sina.com.cn/s/blog_dc9571b90101isxs.html   1)獨立看門狗沒有中斷,視窗看門狗有中斷   2)獨立看門狗有硬體軟體之分,視窗看門狗只能軟體控制   3)獨立看

STM32看門總結

轉自:http://www.openedv.com/thread-56260-1-1.html   STM32看門狗總結 調原子哥的開發板一年多,基本上能用,但是對於STM32某些基本外設的工作機理還不甚明瞭。藉此暑假的機會對各個外設的功能做一個簡短的總結