1. 程式人生 > 其它 >c++視窗 owner_STM32微控制器:獨立看門狗、視窗看門狗的配置

c++視窗 owner_STM32微控制器:獨立看門狗、視窗看門狗的配置

技術標籤:c++視窗 ownerproteus stm32 定時器pyqt 只能開啟子視窗一次rplidar stm32stm32 fatfs fopen err_disk_stm32 i2c cube

9242e89a-8419-eb11-8da9-e4434bdf6706.png

SATM32微控制器的看門狗有獨立看門狗和視窗看門狗之分,這兩者的工作原理卻完全不同,今天來看一下他們的具體區別和配置方法。 ▍STM32獨立看門狗 由專門的低速時鐘(LSI)驅動,即便是主時鐘發生故障它仍能夠有效,所以此狗狗可以工作在與主時鐘無關的要求下,或者待機模組下等,所以它叫獨立看門狗,注意一旦開啟此看門狗則只能由MCU復位後才清除,讓它不再工作。 它的時鐘是一個內部RC時鐘,它會在30KHZ到60KHZ之間變化,並非是精確的40KHZ,而只是一般計算時取40KHZ。 獨立看門狗需設定四個暫存器如下: 9542e89a-8419-eb11-8da9-e4434bdf6706.png
其中,預分頻暫存器(IWDG_PR),最低三位PR[2:0](Prescaler divider)有效,可設定有8種不同的計數器時鐘預分頻因子。 重灌載暫存器(IWDG_RLR)低12位RL[11:0]: 看門狗計數器重灌載值 (Watchdog counter reload value) 有效,用來設定計數器的重灌載值。 注意要設定以上兩個暫存器的值需滿足兩個條件,詳見如下: 鍵暫存器(IWDG_KR),用來控制去除IWDG_PR和IWDG_RLR防寫功能以便正常寫值,向此暫存器寫入0x5555則暫時去除IWDG_PR和IWDG_RLR的防寫功能才可向兩個暫存器中寫值。 當向此暫存器寫入0xAAAA則IWDG_RLR的值會重灌載,防止MCU復位,向入0xCCCC是開啟狗立看門狗動作。 狀態暫存器(IWDG_SR)最低兩位有效RVU: 看門狗計數器重灌載值更新 (Watchdog counter reload value update) 標識位和PVU: 看門狗預分頻值更新(Watchdog prescaler value update) 標識位,分別用來指示此時是否可向IWDG_RLR 和 IWDG_PR寫值,此暫存器由硬體置1與清0,只有當為0時才可向上面兩個暫存器寫值。 它的初始化過程大致如下 :
//時間計算(大概):Tout=((4*2^prer)*rlr)/40(ms)
voidIWDG_Init(u8prer,u16rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(prer);
IWDG_SetReload(rlr);
IWDG_ReloadCounter();
IWDG_Enable();
}

喂狗可通過呼叫如下函式進行:

IWDG_ReloadCounter();//reload
另外要注意不要使用硬體時鐘中斷喂狗,因為硬體時鐘中斷一般都有較高優先順序且獨立於主控程式,這樣有時會出現主控程式雖然跑飛了,但仍能夠正常喂狗的現象。 獨立看門狗能夠在一定程度上監控著程式正常執行,然而我認為更加強大,應用更靈活及更能保證程式穩定執行的還屬視窗看門狗,雖然它開始時不太好理解。
STM32視窗看門狗
共三個暫存器,如下圖:

9a42e89a-8419-eb11-8da9-e4434bdf6706.png

看似簡單,但設定及應用起來有不少玄機。 控制暫存器(WWDG_CR)中的值必須在0xFF與0xC0之間, 因為它的第0至第6位為遞減計數器CNT,在它的第6位變為0時將產生復位,所以在初始化時需要為1,第7位WDGA是用來設定啟動或禁止視窗看門狗的,當為1進才會啟動視窗看門狗,所以第6和第7位都需為1,即WWDG_CR 的值需要大於等於0xC0 。 配置暫存器(WWDG_CFR) 第0至第6位 是設定視窗邊界值用的,只有當遞減計數器CNT的值小於邊界值時才可以喂狗,過早不行,狗還不餓,撐死了。 並且7位遞減計數器CNT減少到0x3F時即T6位變為0,此時MCU也會復位,過晚了,狗餓死了。 所以必須在指定的時間範圍喂狗,過早或過晚都將產生復位,而這樣設計可以減少軟體跑飛了卻仍能夠歪打正著地喂狗的發生概率。 狀態暫存器(WWDG_CFR) 只用到了第0位,EWIF(Early wakeup interrupt flag )是提前喚醒中斷標識,當遞減計數器CNT的值到達0X40(若再減少一次則T6位變為0,產生復位)時此位由硬體置1,且需用軟體清0,注意無論中斷是否使能此位都會被硬體置1。 而提前喚醒中斷使能設定是在配置暫存器(WWDG_CFR)第9位EWI(Early wakeup interrupt),此位需由軟體置1,則會在當遞減計數器CNT的值到達0X40時產生中斷,並且與EWIF不同,此位是由硬體清0。 另外控制暫存器(WWDG_CR)中第7位WDGA(Activation bit)啟用位,需用軟體來置1,以啟動視窗看門狗,並且一旦啟動後,只能在復位或重啟後由硬體來清0。 配置暫存器(WWDG_CFR)的第8位和第7位WDGTB[1:0]用來設定時基(Timer base)預分頻數。 以上描述可參考下圖以更清晰的理解: 9e42e89a-8419-eb11-8da9-e4434bdf6706.png 視窗看門狗應用時還要注意算準最小與最大喂狗時間,以便正確地喂狗,如下: a142e89a-8419-eb11-8da9-e4434bdf6706.jpeg 在PCLK1頻率為36MHz 時,則 上視窗時間:T_min = 4096 * (2^WDGTB)*(WWDG_CR[6:0] - WWDG_CFR[6:0])/36 (us) 下視窗時間:T_max = 4096 * (2^WDGTB)*(WWDG_CR[6:0] - 0x40)/36 (us) 。 喂狗動作需在這段時間之間進行,而喂狗動作為向控制暫存器(WWDG_CR)中寫值。 視窗看門狗中斷函式void WWDG_IRQHandler(void);是用來做什麼的呢。 視窗看門狗中斷函式是在遞減計數器減少到0x40是被呼叫,因為它本身計數就比較慢,所以離數到0x3F復位還有一段時間,我認為這樣設計是為MCU復位之前留下一點時間,能夠使工程設計人員根據需要在中斷函式儲存一些重要的資料,這樣在復位後MCU可知道系統因異常復位的某此狀態,以使系統有更高穩定性。 並且我覺得在視窗看門狗中斷函式中喂狗沒有什麼意義,程式本來已經不按正常運行了,還在中斷函式中喂狗防止復位只會錯上加錯,不好好利用它乾點正事, 更是浪費資源。 這點上我個人認為不要被點原子示例程式碼誤導哦,但其還是有部分借鑑意義的,以下為初始化相關程式碼:
//視窗看門狗中斷服務設定程式
voidWWDG_NVIC_Init()
{
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;//WWDG中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶佔2子優先順序3組2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//搶佔2,子優先順序3,組2
NVIC_Init(&NVIC_InitStructure);//NVIC初始化
}
//儲存WWDG計數器的設定值,預設為最大.
u8WWDG_CNT=0x7f;
//初始化視窗看門狗
//tr:T[6:0],計數器值
//wr:W[6:0],視窗值
//fprer:分頻係數(WDGTB),僅最低2位有效
//Fwwdg=PCLK1/(4096*2^fprer).
voidWWDG_Init(u8tr,u8wr,u32fprer)
{
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_EnableIT(); 函式相關程式碼

#defineCFR_EWI_BB(PERIPH_BB_BASE+(CFR_OFFSET*32)+(EWI_BitNumber*4))

用到位帶操作,具體理解可參照《Cortex-M3權威指南》第五章的位帶操作相關介紹(具體89頁)。

推薦閱讀:

  • 軟硬體之間其實還有一個韌體!你知道嗎?

  • 為什麼會有0歐電阻這種東西?

  • 你眼裡的嵌入式工程師是這樣的嗎?

  • 模組化程式設計到底有多重要?

  • 硬體工程師日常崩潰圖鑑

  • 33歲入行嵌入式軟體開發晚不晚啊?

  • 乾貨||稀里煳塗學習STM32完整版

  • 【視訊】教你DC-DC及做一個開關電源,不信你學不會!

  • 什麼是PWM“死區”?

  • 這2個微控制器程式設計的思想,請你掌握

  • 長文:嵌入式程式設計師的程式設計修養

  • 485通訊自動收發電路 歷史上最詳細的解釋

  • 多個微控制器的通訊方式【詳細】

  • 10個微控制器電路設計中的難點,你都解決了嗎?