stm32有兩個看門狗,獨立看門狗和窗口看門狗,其實兩者的功能是類似的,只是喂狗的限制時間不同。獨立看門狗有自己獨立的40Khz時鐘,不存在使能問題;而窗口看門狗使用的是PCLK1時鐘,需要先使能時鐘。以下是關于看門狗的具體說明:
?、侏毩⒖撮T狗是限制喂狗時間在0-x內,x由你的相關寄存器決定。喂狗的時間不能過晚。
?、诖翱诳撮T狗,所以稱之為窗口就是因為其喂狗時間是一個有上下限的范圍內,你可以通過設定相關寄存器,設定其上限時間和下限時間。喂狗的時間不能過早也不能過晚。
顯而易見的是,獨立看門狗比較簡單,容易理解。這里,主要對窗口看門狗的詳細含義作具體說明。
窗口看門狗介紹:
看門狗的上窗口就是配置寄存器WWDG-》CFR里設定的W[6:0];下窗口是0x40;當窗口看門狗的計數器在上窗口之外,或是低于下窗口值都會產生復位。如上圖所講,當計數器的值遞減到0x3f的計數時間內未進行喂狗操作,則會觸發(fā)復位;其次,如果在計數器值遞減到配置寄存器WWDG-》CFR里設定的W[6:0]之前進行喂狗操作,也會觸發(fā)復位。所以,在使用窗口看門狗時,要設定兩個值,一個就是窗口看門狗的上窗口值,即配置寄存器WWDG-》CFR里設定的W[6:0],另一個就是遞減計數器的計數初值。
再結合上圖中的邏輯關系分析一下:
如圖中所示標號,①③表示與門,②表示非或門;
1、當T[6:0]》W[6:0]時,比較器輸出的值是1,如果此時重裝載WWDG_CR,所以③就會輸出1,②的輸出也肯定是1,又因為使能了窗口看門狗,所以WWDG_CR的第7位WDGA也為1,即與門①的輸出是1,此時會觸發(fā)復位。簡單的概括來說,就是當遞減計數器的值在遞減到上窗口值W[6:0]之前進行喂狗操作(即重裝載WWDG_CR),會觸發(fā)看門狗復位。
2、當T[6:0]的第6位變?yōu)?時,即T[6:0]的值變?yōu)?x3f,此時②的輸出肯定為1,而WDGA也為1,因此①的輸出是1,會觸發(fā)看門狗復位。簡單的概括來說,就是當遞減計數器的值在到達0x3f時仍未進行喂狗操作(即重裝載WWDG_CR),同樣會觸發(fā)看門狗復位。
上窗口的值可以只有設定,7位二進制數最大只可以設定為127(0x7f),最小又必須大于其下窗口的0x40,所以其取值范圍為64~127(0x40~0x7f),否則不能保證窗口。
配置寄存器WWDG-》CFR寄存器中的[8:7]兩個位的設置為計數器設定時鐘分頻系數,確定這個計數器可以定時的時間范圍,從而確定窗口的時間范圍。
窗口看門狗的時鐘來自于PCLK1,在時鐘配置中,其頻率為外部時鐘經倍頻器后的二分頻時鐘,即為36Mhz,如上圖STM32時鐘樹所示。
窗口看門狗的超時公式如下:
表中數據的具體計算如下所示:
?、?、當T[5:0]全部取0時,7位計數器的值是0x40,此時距離復位值只能計數一次,在此時間之內必須執(zhí)行喂狗操作,否則觸發(fā)復位。
從而可知各個WDGTB值下的最小超時時間,如WDGTB=0時,
Twwdg=4096×2^0×1/36 (us)=113 us,依次可計算出其他WDGTB值下的最小超時時間。
?、?、當T[5:0]全部取1時,7位計數器的值是0x7f,此時距離復位值遞減計數0x40次(0x3f+1),在此時間之內執(zhí)行喂狗操作可避免復位。
從而可知各個WDGTB值下的最大超時時間,如WDGTB=0時,
Twwdg=4096×2^0×64/36 (us)=7281.7 us,依次可計算出其他WDGTB值下的最大超時時間。
STM32 系列的CPU,有多達8個定時器,其中TIM1和TIM8是能夠產生三對PWM互補輸出的高級定時器,常用于三相電機的驅動,它們的時鐘由APB2的輸出產生。其它6個為普通定時器,時鐘由APB1的輸出產生。
通用定時器的定義:STM32的通用定時器是一個通過可編程預分頻器(PSC)驅動的16位自動裝載計數器(CNT)構成。
功用:STM32的通用定時器可以被用于測量輸入信號的脈沖長度(輸入捕獲)或者產生輸出波形(輸出比較和PWM)等。
分頻系數:決定定時器的時基,即最小定時時間。
STM32看門狗的配置:
看門狗的配置有2部分:看門狗的初始化和喂狗。 下面看一下STM32是怎么初始化看門狗和喂狗的。
看門狗初始化步驟:
1.IWDG_PR和IWDG_RLR寄存器具有寫保護功能。要修改這兩個寄存器的值,必須先向 IWDG_KR寄存器中寫入0x5555。
2.設置預分頻因子 (Prescaler divider)PR[2:0] 。
3.設置看門狗計數器重裝載值。RLR[11:0]。
4.重新裝載看門狗的計數值,只要在鍵寄存器IWDG_KR中寫入0xAAAA。
5.在鍵寄存器(IWDG_KR)中寫入0xCCCC,開始啟用獨立看門狗
void Wdt_Init(void)
{
// Enable write access to IWDG_PR and IWDG_RLR registers
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //IWDG-》KR = 0x5555
// IWDG counter clock: 40KHz(LSI) / 64 = 0.625 KHz IWDG_SetPrescaler(IWDG_Prescaler_256); //IWDG-》PR = 0x06;
// Set counter reload value to 1250
IWDG_SetReload(0xfff); //IWDG-》RLR =0xFFF
Red IWDG counter
IWDG_ReloadCounter(); //IWDG-》KR = 0xAAAA
/ Enable IWDG (the LSI oscillator will be enabled by hardware) IWDG_Enable(); //IWDG-》KR = 0xCCCC
}
//喂狗
void Kick_Dog(void)
{
//Reload IWDG counter
IWDG_ReloadCounter(); //IWDG-》KR = 0xAAAA }
上面這個看門狗有 /256 26214.4 ms。即2s多一點時間沒有喂狗就復位。
LSI不穩(wěn)定,官方手冊有下面這么一個說法:
評論
查看更多