生活随笔
收集整理的這篇文章主要介紹了
秉火429笔记之十二 看门狗
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
1. 概述
2. 獨立看門狗(IWDG)
3. 窗口看門狗(WWDG)
1. 概述
STM32有兩個看門狗,一個是獨立看門狗,另外一個是窗口看門狗,獨立看門狗號稱寵物狗,窗口看門狗號稱警犬。
一般情況下,使用頻次較高是獨立看門狗,也即是通常意義的看門狗。
2. 獨立看門狗(IWDG)
一個12位的遞減計數器,最大值為0XFFF,當計數器的值從某個值一直減到0的時候,系統就會產生一個復位信號,即IWDG_RESET。如果在計數沒減到0之前,刷新了計數器的值的話,那么就不會產生復位信號,這個動作就是我們經常說的喂狗。看門狗功能由 VDD 電壓域供電,在停止模式和待機模式下仍能工作.
獨立看門狗的時鐘由獨立的RC振蕩器LSI提供,即使主時鐘發生故障它仍然有效,非常獨立。LSI的頻率一般在30~60KHZ之間,根據溫度和工作場合會有一定的漂移,我們一般取40KHZ,所以獨立看門狗的定時時間并一定非常精確,只適用于對時間精度 要求比較低的場合。
遞減計數器的時鐘由LSI經過一個8位的預分頻器得到,我們可以操作預分頻器寄存器IWDG_PR來設置分頻因子,分頻因子可以是:[4,8,16,32,64,128,256,256],計數器時鐘CK_CNT= 40/ 4*2^PRV,一個計數器時鐘計數器就減一。
鍵值寄存器枚舉類型鍵值鍵值作用
| 0XAAAA | 把RLR的值重裝載到CNT |
| 0X5555 | PR和RLR這兩個寄存器可寫 |
| 0XCCCC | 啟動IWDG,軟件啟動 |
一旦獨立看門狗啟動,它就關不掉,只有復位才能關掉
獨立看門狗一般用來檢測和解決由程序引起的故障。
PS: ?可以在系統上電開始的時候檢查是否因看門狗引起的復位【RCC_GetFlagStatus(RCC_FLAG_IWDGRST)】
/** 設置 IWDG 的超時時間* Tout = prv/40 * rlv (s)* prv可以是[4,8,16,32,64,128,256]* prv:預分頻器值,取值如下:* @arg IWDG_Prescaler_4: IWDG prescaler set to 4* @arg IWDG_Prescaler_8: IWDG prescaler set to 8* @arg IWDG_Prescaler_16: IWDG prescaler set to 16* @arg IWDG_Prescaler_32: IWDG prescaler set to 32* @arg IWDG_Prescaler_64: IWDG prescaler set to 64* @arg IWDG_Prescaler_128: IWDG prescaler set to 128* @arg IWDG_Prescaler_256: IWDG prescaler set to 256** 獨立看門狗使用LSI作為時鐘。* LSI 的頻率一般在 30~60KHZ 之間,根據溫度和工作場合會有一定的漂移,我* 們一般取 40KHZ,所以獨立看門狗的定時時間并一定非常精確,只適用于對時間精度* 要求比較低的場合。** rlv:預分頻器值,取值范圍為:0-0XFFF* 函數調用舉例:* IWDG_Config(IWDG_Prescaler_64 ,625); // IWDG 1s 超時溢出 * (64/40)*625 = 1s*/void bsp_IWDG_Config(uint8_t prv ,uint16_t rlv)
{ // 使能 預分頻寄存器PR和重裝載寄存器RLR可寫IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );// 設置預分頻器值IWDG_SetPrescaler( prv );// 設置重裝載寄存器值IWDG_SetReload( rlv );// 把重裝載寄存器的值放到計數器中IWDG_ReloadCounter();// 使能 IWDGIWDG_Enable();
}// 喂狗
void bsp_IWDG_Feed(void)
{// 把重裝載寄存器的值放到計數器中,喂狗,防止IWDG復位// 當計數器的值減到0的時候會產生系統復位IWDG_ReloadCounter();
}
3. 窗口看門狗(WWDG)
窗口看門狗跟獨立看門狗一樣,也是一個遞減計數器不斷的往下遞減計數,當減到一個固定值0X40時還不喂狗的話,產生復位,這個值叫窗口的下限,是固定的值,不能改變。這個是跟獨立看門狗類似的地方,不同的地方是窗口看門狗的計數器的值在減到某一個數之前喂狗的話也會產生復位,這個值叫窗口的上限,上限值由用戶獨立設置。窗口看門狗計數器的值必須在上窗口和下窗口之間才可以喂狗,這就是窗口看門狗中窗口兩個字的含義.
窗口看門狗時鐘來自PCLK1,PCLK1最大是45M,由RCC時鐘控制器開啟。
計數器時鐘由CK計時器時鐘經過預分頻器分頻得到,分頻系數由配置寄存器CFR的位8:7 WDGTB[1:0]配置,可以是[0,1,2,3],其中CK計時器時鐘=PCLK1/4096,計數器的時鐘CNT_CK=PCLK1/4096/(2^WDGTB)。
計數器是一個遞減計數器,共有7位,其值存在控制寄存器CR的位6:0,即T[6:0],當7個位全部為1時是0X7F,這個是最大值,當遞減到T6位變成0時,即從0X40變為0X3F時候,會產生看門狗復位。計數器的值只能是:0X40~0X7F之間,實際上用來計數的是T[5:0]。當遞減計數器遞減到0X40的時候,還不會馬上產生復位,如果使能了提前喚醒中斷:CFR位9 EWI 置1,則產生提前喚醒中斷,如果真進入了這個中斷的話,就說明程序肯定是出問題了, 那么在中斷服務程序里面我們就需要做最重要的工作,比如保存重要數據,或者報警等,這個中斷我們也叫它死前中斷。
WWDG一般被用來監測,由外部干擾或不可預見的邏輯條件造成的應用程序背離正常的運行序列而產生的軟件故障。
PS: ?可以在系統上電開始的時候檢查是否因看門狗引起的復位【RCC_GetFlagStatus(RCC_FLAG_WWDGRST)】
//用于記錄看門狗 遞減計數器的值,方便喂狗函數直接使用
static uint8_t m_bsp_wwdg_cnt ;// WWDG 中斷優先級初始化
static void bsp_WWDG_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}/* WWDG 配置函數* tr :遞減計時器的值, 取值范圍為:0x7f~0x40,超出范圍會直接復位* wr :窗口值,取值范圍為:0x7f~0x40* prv:預分頻器值,取值可以是* @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1(45MHz)/4096)/1 約10968Hz 91us* @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1(45MHz)/4096)/2 約5484Hz 182us* @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1(45MHz)/4096)/4 約2742Hz 364us* @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1(45MHz)/4096)/8 約1371Hz 728us* * 例:tr = 127(0x7f,tr的最大值) wr = 80(0x50, 0x40為最小wr最小值) prv = WWDG_Prescaler_8* ~728 * (127-80) = 34.2ms < 刷新窗口 < ~728 * 64 = 46.6ms* 也就是說調用WWDG_Config進行這樣的配置,若在之后的34.2ms前喂狗,系統會復位,在46.6ms后沒有喂狗,系統也會復位。* 需要在刷新窗口的時間內喂狗,系統才不會復位。
*/
void bsp_WWDG_Config(uint8_t tr, uint8_t wr, uint32_t prv)
{ m_bsp_wwdg_cnt = tr;//保存CNT配置,用在喂狗函數// 開啟 WWDG 時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);// 設置預分頻器的值WWDG_SetPrescaler( prv );// 設置上窗口值WWDG_SetWindowValue( wr );// 設置計數器的值,使能WWDGWWDG_Enable(tr); // 清除提前喚醒中斷標志位WWDG_ClearFlag(); // 配置WWDG中斷優先級bsp_WWDG_NVIC_Config(); // 開WWDG 中斷WWDG_EnableIT();
}// 喂狗
void bsp_WWDG_Feed(void)
{// 喂狗,刷新遞減計數器的值,設置成最大WDG_CNT=0X7FWWDG_SetCounter( m_bsp_wwdg_cnt );
}
?
總結
以上是生活随笔為你收集整理的秉火429笔记之十二 看门狗的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。