STM32F103ZET6独立看门狗
1、IWDG簡(jiǎn)介
STM32F103ZET6的獨(dú)立看門狗(IWDG)是由內(nèi)部LSI(內(nèi)部約40KHZ低速時(shí)鐘)時(shí)鐘驅(qū)動(dòng)的。由于IWDG是由內(nèi)部低速時(shí)鐘驅(qū)動(dòng),所以就算主時(shí)鐘發(fā)生故障,IWDG依然能夠工作。
由于LSI是一個(gè)內(nèi)部RC時(shí)鐘,所以時(shí)鐘不是很準(zhǔn)確的40KHZ,而是在30KHZ~60KHZ之間變化的時(shí)鐘,所以IWDG時(shí)間的計(jì)算并不是很準(zhǔn)確,只能是一個(gè)大概的值。一般用40KHZ來估算。
IWDG的計(jì)數(shù)器是一個(gè)遞減計(jì)數(shù)器,當(dāng)IWDG被激活后,計(jì)數(shù)器開始向下遞減計(jì)數(shù),當(dāng)計(jì)數(shù)器計(jì)數(shù)至0x0000時(shí)產(chǎn)生復(fù)位信號(hào),使芯片復(fù)位。
當(dāng)芯片處于停止和待機(jī)模式下工作時(shí),IWDG依然繼續(xù)工作。
2、IWDG工作原理
當(dāng)IWDG被激活后,IWDG的計(jì)數(shù)器開始向下遞減計(jì)數(shù),當(dāng)IWDG的計(jì)數(shù)器的值遞減到0x000時(shí),芯片就會(huì)復(fù)位。所以為了保證芯片正常工作,必須在IWDG的計(jì)數(shù)器的值遞減到0x000之前,重新給IWDG的計(jì)數(shù)器賦值,否者芯片就會(huì)不斷的復(fù)位。
必須注意的是:IWDG一旦啟用,就不能在被關(guān)閉,想要關(guān)閉IWDG,只能復(fù)位,并且在復(fù)位后不能打開IWDG。
3、IWDG的配置
IWDG的寄存器并不復(fù)雜,只有IWDG_KR鍵值寄存器、IWDG_PR分頻寄存器、IWDG_RLR重裝載寄存器這3個(gè)寄存器。
IWDG_KR鍵值寄存器:
當(dāng)向IWDG_KR寄存器寫入0xCCCC后,IWDG就開始工作,IWDG的計(jì)數(shù)器從IWDG_RLR寄存器的值開始向下遞減計(jì)數(shù),當(dāng)計(jì)數(shù)到0x0000時(shí),就會(huì)產(chǎn)生一個(gè)復(fù)位信號(hào)。
當(dāng)向IWDG_KR寄存器寫入0xAAAA后,IWDG_RLR中的值就會(huì)重新加載到IWDG計(jì)數(shù)器中,從而避免IWDG產(chǎn)品復(fù)位信號(hào)。
需要注意的是IWDG_RLR和IWDG_PR這兩個(gè)寄存器是有寫保護(hù)的,當(dāng)操作這兩個(gè)寄存器的時(shí)候,必須先向IWDG_KR寄存器寫入0x5555,之后才能操作IWDG_RLR和IWDG_PR這兩個(gè)寄存器。
IWDG_PR寄存器:
IWDG_PR寄存器是IWDG的預(yù)分頻寄存器。IWDG_PR寄存器可以對(duì)IWDG的時(shí)鐘進(jìn)行分頻,分頻系數(shù)從4分頻到256分頻。IWDG_PR寄存器只用到了低3位,PR[2:0]組成IWDG的分頻系數(shù)。如下:
- PR[2:0] = 000: 4分頻
 - PR[2:0] = 001: 8分頻
 - PR[2:0] = 010: 16分頻
 - PR[2:0] = 011: 32分頻
 - PR[2:0] = 100: 64分頻
 - PR[2:0] = 101: 128分頻
 - PR[2:0] = 110: 256分頻
 - PR[2:0] = 111: 256分頻
 
IWDG_RLR寄存器:
IWDG_RLR寄存器只有低12位有效,所以IWDG的計(jì)數(shù)值最大只有0xFFF。
IWDG的配置流程:
首先向IWDG_KR寫入0x5555,取消IWDG_PR和IWDG_RLR的寫保護(hù);
取消寫保護(hù)之后設(shè)置IWDG_PR和IWDG_RLR的值;
為了將IWDG_RLR寄存器的值加載到IWDG的計(jì)數(shù)器中,將0xAAAA的值寫入IWDG_KR寄存器中。
最后將值0xCCCC寫入IWDG_KR寄存器中啟動(dòng)IWDG。
IWDG的時(shí)間計(jì)算:
假設(shè)IWDG的預(yù)分頻系數(shù)為pr,重裝載值為rlr,那么IWDG的時(shí)間計(jì)算公式為:
T = ((4*2^pr)*rlr)/40000 (計(jì)算后的單位為秒)
4、HAL庫(kù)操作IWDG
IWDG初始化代碼如下:
void IWDG_Init(void)
{
IWDG_HandleTypeDef IWDG_Handle; IWDG_Handle.Instance = IWDG;
IWDG_Handle.Init.Prescaler = IWDG_PRESCALER_4;
IWDG_Handle.Init.Reload = 0xFFF;
HAL_IWDG_Init(&IWDG_Handle);
}
IWDG_Handle是IWDG的句柄。
IWDG_Handle.Instance = IWDG是將句柄指向外設(shè)IWDG。
IWDG_Handle.Init.Prescaler = IWDG_PRESCALER_4是設(shè)定IWDG的分頻系數(shù)。
IWDG_Handle.Init.Reload = 0xFFF是設(shè)定IWDG的重裝載值。
HAL_IWDG_Init(&IWDG_Handle)是將句柄傳入HAL_IWDG_Init函數(shù)對(duì)IWDG進(jìn)行初始化。
IWDG重新更新計(jì)數(shù)器(喂狗)代碼如下:
void IWDG_CLR(void)
{
IWDG_HandleTypeDef IWDG_Handle; IWDG_Handle.Instance = IWDG; HAL_IWDG_Refresh(&IWDG_Handle);
}
將句柄參數(shù)傳入HAL_IWDG_Refresh函數(shù),HAL_IWDG_Refresh函數(shù)的作用是更新IWDG的計(jì)數(shù)值,防止IWDG的計(jì)數(shù)值計(jì)算到0x0000時(shí)產(chǎn)生復(fù)位信號(hào)。
總結(jié)
以上是生活随笔為你收集整理的STM32F103ZET6独立看门狗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Mitmproxy教程
 - 下一篇: SpringBoot_04_Spring