stm32有兩個(gè)看門狗,獨(dú)立看門狗和窗口看門狗,其實(shí)兩者的功能是類似的,只是喂狗的限制時(shí)間不同。獨(dú)立看門狗有自己獨(dú)立的40Khz時(shí)鐘,不存在使能問題;而窗口看門狗使用的是PCLK1時(shí)鐘,需要先使能時(shí)鐘。以下是關(guān)于看門狗的具體說明:
?、侏?dú)立看門狗是限制喂狗時(shí)間在0-x內(nèi),x由你的相關(guān)寄存器決定。喂狗的時(shí)間不能過晚。
?、诖翱诳撮T狗,所以稱之為窗口就是因?yàn)槠湮构窌r(shí)間是一個(gè)有上下限的范圍內(nèi),你可以通過設(shè)定相關(guān)寄存器,設(shè)定其上限時(shí)間和下限時(shí)間。喂狗的時(shí)間不能過早也不能過晚。
顯而易見的是,獨(dú)立看門狗比較簡單,容易理解。這里,主要對(duì)窗口看門狗的詳細(xì)含義作具體說明。
窗口看門狗介紹:
看門狗的上窗口就是配置寄存器WWDG-》CFR里設(shè)定的W[6:0];下窗口是0x40;當(dāng)窗口看門狗的計(jì)數(shù)器在上窗口之外,或是低于下窗口值都會(huì)產(chǎn)生復(fù)位。如上圖所講,當(dāng)計(jì)數(shù)器的值遞減到0x3f的計(jì)數(shù)時(shí)間內(nèi)未進(jìn)行喂狗操作,則會(huì)觸發(fā)復(fù)位;其次,如果在計(jì)數(shù)器值遞減到配置寄存器WWDG-》CFR里設(shè)定的W[6:0]之前進(jìn)行喂狗操作,也會(huì)觸發(fā)復(fù)位。所以,在使用窗口看門狗時(shí),要設(shè)定兩個(gè)值,一個(gè)就是窗口看門狗的上窗口值,即配置寄存器WWDG-》CFR里設(shè)定的W[6:0],另一個(gè)就是遞減計(jì)數(shù)器的計(jì)數(shù)初值。
再結(jié)合上圖中的邏輯關(guān)系分析一下:
如圖中所示標(biāo)號(hào),①③表示與門,②表示非或門;
1、當(dāng)T[6:0]》W[6:0]時(shí),比較器輸出的值是1,如果此時(shí)重裝載WWDG_CR,所以③就會(huì)輸出1,②的輸出也肯定是1,又因?yàn)槭鼓芰舜翱诳撮T狗,所以WWDG_CR的第7位WDGA也為1,即與門①的輸出是1,此時(shí)會(huì)觸發(fā)復(fù)位。簡單的概括來說,就是當(dāng)遞減計(jì)數(shù)器的值在遞減到上窗口值W[6:0]之前進(jìn)行喂狗操作(即重裝載WWDG_CR),會(huì)觸發(fā)看門狗復(fù)位。
2、當(dāng)T[6:0]的第6位變?yōu)?時(shí),即T[6:0]的值變?yōu)?x3f,此時(shí)②的輸出肯定為1,而WDGA也為1,因此①的輸出是1,會(huì)觸發(fā)看門狗復(fù)位。簡單的概括來說,就是當(dāng)遞減計(jì)數(shù)器的值在到達(dá)0x3f時(shí)仍未進(jìn)行喂狗操作(即重裝載WWDG_CR),同樣會(huì)觸發(fā)看門狗復(fù)位。
上窗口的值可以只有設(shè)定,7位二進(jìn)制數(shù)最大只可以設(shè)定為127(0x7f),最小又必須大于其下窗口的0x40,所以其取值范圍為64~127(0x40~0x7f),否則不能保證窗口。
配置寄存器WWDG-》CFR寄存器中的[8:7]兩個(gè)位的設(shè)置為計(jì)數(shù)器設(shè)定時(shí)鐘分頻系數(shù),確定這個(gè)計(jì)數(shù)器可以定時(shí)的時(shí)間范圍,從而確定窗口的時(shí)間范圍。
窗口看門狗的時(shí)鐘來自于PCLK1,在時(shí)鐘配置中,其頻率為外部時(shí)鐘經(jīng)倍頻器后的二分頻時(shí)鐘,即為36Mhz,如上圖STM32時(shí)鐘樹所示。
窗口看門狗的超時(shí)公式如下:
表中數(shù)據(jù)的具體計(jì)算如下所示:
?、?、當(dāng)T[5:0]全部取0時(shí),7位計(jì)數(shù)器的值是0x40,此時(shí)距離復(fù)位值只能計(jì)數(shù)一次,在此時(shí)間之內(nèi)必須執(zhí)行喂狗操作,否則觸發(fā)復(fù)位。
從而可知各個(gè)WDGTB值下的最小超時(shí)時(shí)間,如WDGTB=0時(shí),
Twwdg=4096×2^0×1/36 (us)=113 us,依次可計(jì)算出其他WDGTB值下的最小超時(shí)時(shí)間。
?、?、當(dāng)T[5:0]全部取1時(shí),7位計(jì)數(shù)器的值是0x7f,此時(shí)距離復(fù)位值遞減計(jì)數(shù)0x40次(0x3f+1),在此時(shí)間之內(nèi)執(zhí)行喂狗操作可避免復(fù)位。
從而可知各個(gè)WDGTB值下的最大超時(shí)時(shí)間,如WDGTB=0時(shí),
Twwdg=4096×2^0×64/36 (us)=7281.7 us,依次可計(jì)算出其他WDGTB值下的最大超時(shí)時(shí)間。
STM32 系列的CPU,有多達(dá)8個(gè)定時(shí)器,其中TIM1和TIM8是能夠產(chǎn)生三對(duì)PWM互補(bǔ)輸出的高級(jí)定時(shí)器,常用于三相電機(jī)的驅(qū)動(dòng),它們的時(shí)鐘由APB2的輸出產(chǎn)生。其它6個(gè)為普通定時(shí)器,時(shí)鐘由APB1的輸出產(chǎn)生。
通用定時(shí)器的定義:STM32的通用定時(shí)器是一個(gè)通過可編程預(yù)分頻器(PSC)驅(qū)動(dòng)的16位自動(dòng)裝載計(jì)數(shù)器(CNT)構(gòu)成。
功用:STM32的通用定時(shí)器可以被用于測量輸入信號(hào)的脈沖長度(輸入捕獲)或者產(chǎn)生輸出波形(輸出比較和PWM)等。
分頻系數(shù):決定定時(shí)器的時(shí)基,即最小定時(shí)時(shí)間。
STM32看門狗的配置:
看門狗的配置有2部分:看門狗的初始化和喂狗。 下面看一下STM32是怎么初始化看門狗和喂狗的。
看門狗初始化步驟:
1.IWDG_PR和IWDG_RLR寄存器具有寫保護(hù)功能。要修改這兩個(gè)寄存器的值,必須先向 IWDG_KR寄存器中寫入0x5555。
2.設(shè)置預(yù)分頻因子 (Prescaler divider)PR[2:0] 。
3.設(shè)置看門狗計(jì)數(shù)器重裝載值。RLR[11:0]。
4.重新裝載看門狗的計(jì)數(shù)值,只要在鍵寄存器IWDG_KR中寫入0xAAAA。
5.在鍵寄存器(IWDG_KR)中寫入0xCCCC,開始啟用獨(dú)立看門狗
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 }
上面這個(gè)看門狗有 /256 26214.4 ms。即2s多一點(diǎn)時(shí)間沒有喂狗就復(fù)位。
LSI不穩(wěn)定,官方手冊有下面這么一個(gè)說法:
評(píng)論