獨(dú)立看門狗(IWDG)的設(shè)計(jì)初衷是為了檢測(cè)和解決由軟件錯(cuò)誤所引起的故障,與窗口看門狗的主要區(qū)別在于獨(dú)立看門狗可以作為一個(gè)處于主程序之外,由內(nèi)部低速時(shí)鐘(LSI)驅(qū)動(dòng),能夠完全獨(dú)立工作的模塊,當(dāng)主時(shí)鐘發(fā)生故障或芯片處在低功耗模式的時(shí)候,獨(dú)立看門狗依舊可以繼續(xù)工作。
它的原理可以簡(jiǎn)述為:當(dāng)獨(dú)立看門狗計(jì)數(shù)器不斷遞減達(dá)到給定數(shù)值時(shí),將產(chǎn)生一個(gè)系統(tǒng)復(fù)位信號(hào)使系統(tǒng)復(fù)位或產(chǎn)生中斷信號(hào)。
MM32F0140的獨(dú)立看門狗有一個(gè)特色功能,用戶可以通過(guò)配置選擇IWDG產(chǎn)生復(fù)位還是產(chǎn)生中斷功能,比如在stop模式下,用戶可以選擇中斷方式喚醒從而不用復(fù)位MCU,SRAM數(shù)據(jù)不用因?yàn)榭撮T狗喚醒而被清除。
1產(chǎn)生復(fù)位或者中斷
MM32F014x的獨(dú)立看門狗內(nèi)部是自由運(yùn)行的12位遞減計(jì)數(shù)器,當(dāng)設(shè)置IWDG復(fù)位方式時(shí),當(dāng)計(jì)數(shù)達(dá)到0x0000時(shí),會(huì)產(chǎn)生一個(gè)系統(tǒng)復(fù)位;當(dāng)設(shè)置IWDG中斷方式時(shí),當(dāng)設(shè)置看門狗中斷生成值IGEN,每當(dāng)計(jì)數(shù)器值遞減等于該值時(shí),會(huì)產(chǎn)生一個(gè)中斷信號(hào)。
2計(jì)數(shù)器時(shí)鐘
IWDG是由低速時(shí)鐘源(LSI)驅(qū)動(dòng),經(jīng)過(guò)IWDG_PR預(yù)分頻器分頻得到,預(yù)分頻因子可以被設(shè)置為4,8,16,32,64,128,256,在開(kāi)啟IWDG前需要先開(kāi)啟LSI,如圖1所示。

圖1
3重裝載寄存器
每次執(zhí)行喂狗操作,就會(huì)將重裝載寄存器(IWDG_RLR)的值重新加載到計(jì)數(shù)器中,從而避免產(chǎn)生復(fù)位或者中斷信號(hào),該操作通常叫做喂狗操作。復(fù)位時(shí)重裝載寄存器(IWDG_RLR)的值為0xFFF,如圖2。

圖2
4看門狗超時(shí)時(shí)間
IWDG的超時(shí)周期可以通過(guò)重裝載寄存器(IWDG_RLR)的值和預(yù)分頻寄存器(IWDG_PR)計(jì)算得到,公式如下:
Tout(ms)=((4×2^PR)×RLR)/40
當(dāng)IWDG_RLR寄存器為最大值時(shí),可以獲得最長(zhǎng)的超時(shí)時(shí)間,參考時(shí)間如表1:

表1
5寄存器保護(hù)
獨(dú)立看門狗中的IWDG_PR,IWDG_RLR,IWDG_IGEN寄存器具有訪問(wèn)保護(hù)功能,只能在向鍵值寄存器(IWDG_KR)寫入0x5555,才能修改以上被保護(hù)的寄存器的值。向鍵值寄存器寫入其他值或者重載操作時(shí),寄存器依舊出在保護(hù)狀態(tài)。
6看門狗中斷
當(dāng)開(kāi)啟獨(dú)立看門狗后,計(jì)數(shù)器開(kāi)始從其復(fù)位值0xFFF開(kāi)始遞減,當(dāng)IWDG_CR控制寄存器中的IRQ_SEL位置1時(shí),計(jì)數(shù)器遞減到IWDG_IGEN設(shè)定的值后會(huì)產(chǎn)生一個(gè)中斷。獨(dú)立看門狗中斷被連接到EXTI24上,所以看門狗中斷可以使MCU從低功耗模式下喚醒,結(jié)合IWDG_IGEN寄存器的設(shè)定,可以模擬低功耗定時(shí)器來(lái)使用。
7部分庫(kù)函數(shù)參考
PVU_CheckStatus();
IWDG_SetPrescaler(IWDG_Prescaler);
修改預(yù)分頻寄存器(IWDG_PR),修改前需要先向鍵值寄存器(IWDG_KR)寫入0x5555。
RVU_CheckStatus();
IWDG_WriteAccessCmd(0x5555);
IWDG_SetReload(Reload & 0xfff);
修改重裝載寄存器(IWDG_RLR),修改前需要先向鍵值寄存器(IWDG_KR)寫入0x5555。
IVU_CheckStatus();
IWDG_WriteAccessCmd(0x5555);
IWDG_SetIGen(0x7ff);
修改中斷生成寄存器(IWDG_IGEN),修改前需要先向鍵值寄存器(IWDG_KR)寫入0x5555。
IWDG_EnableIT();
開(kāi)啟看門狗中斷,如果需要看門狗復(fù)位方式需要設(shè)置:IWDG_Reset();
IWDG_ReloadCounter();
IWDG_Enable();
重載計(jì)數(shù)器、開(kāi)啟IWDG計(jì)數(shù)器。
IWDG_ClearITPendingBit();
清除看門狗中斷標(biāo)志位。
8程序配置
8.1 開(kāi)啟獨(dú)立看門狗
開(kāi)啟看門狗前需要先打開(kāi)LSI,配置預(yù)分頻寄存器,配置重裝載寄存器,然后開(kāi)啟IWDG計(jì)數(shù)器,以下示例代碼對(duì)IWDG進(jìn)行初始化,配置預(yù)分頻因子為16,重裝載寄存器從最大值(0xFFF)開(kāi)始計(jì)數(shù),最大看門狗超時(shí)時(shí)間大概為1.6秒,代碼如下:
voidIWDG_Init(void)
{
//開(kāi)啟低速時(shí)鐘,等待時(shí)鐘穩(wěn)定
RCC_LSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);
//設(shè)置預(yù)分頻寄存器
PVU_CheckStatus();
IWDG_WriteAccessCmd(0x5555);
IWDG_SetPrescaler(0x02);//選擇對(duì)LSI進(jìn)行16分頻
//設(shè)置重裝載寄存器
RVU_CheckStatus();
IWDG_WriteAccessCmd(0x5555);
IWDG_SetReload(0xfff);//重裝載寄存器設(shè)置為0xFFF
//將重裝載寄存器的值加載到計(jì)數(shù)器,并開(kāi)啟計(jì)數(shù)器
IWDG_ReloadCounter();
IWDG_Enable();
}
8.2 重裝載計(jì)數(shù)器(喂狗)
在任何時(shí)候向IWDG_KR寄存器寫入0xAAAA,就會(huì)將重裝載寄存器(IWDG_RLR)中的值加載到計(jì)數(shù)器中,避免產(chǎn)生復(fù)位或者中斷,可以使用如下庫(kù)函數(shù):
IWDG_ReloadCounter();
或者直接操作寄存器,但要特別注意,在喂狗后最多需要5個(gè)LSI的振蕩周期。
IWDG->KR = 0xAAAA;
8.3 開(kāi)啟看門狗中斷
如需要開(kāi)啟看門狗中斷,在配置IWDG時(shí)需要配置IWDG_CR中的IRQ_SEL和IWDG_IGEN寄存器,在開(kāi)啟看門狗之前加入如下代碼:
1)配置中斷生成寄存器(IWDG_IGEN),并開(kāi)啟看門狗中斷
IVU_CheckStatus();
IWDG_WriteAccessCmd(0x5555);
IWDG_SetIGen(0x7FF);//將IWDG_IGEN配置為0x7FF,當(dāng)計(jì)數(shù)器到該值時(shí)會(huì)產(chǎn)生中斷
IWDG_EnableIT();
2)使能NVIC和外部中斷源
{
EXTI_InitTypeDefEXTI_InitStruct;
NVIC_InitTypeDefNVIC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR,ENABLE);
//EnabletheIWDGInterrupt
NVIC_InitStruct.NVIC_IRQChannel=WWDG_IWDG_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority=0;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
RCC_APB2PeriphClockCmd(RCC_APB2RSTR_SYSCFG,ENABLE);
EXTI_StructInit(&EXTI_InitStruct);
EXTI_ClearITPendingBit(EXTI_Line24);
//IWDGmaptoEXTI_Line24
EXTI_InitStruct.EXTI_Line=EXTI_Line24;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStruct);
}
3)編寫看門狗中斷服務(wù)函數(shù),由于和窗口看門狗共用一個(gè)中斷源,所以庫(kù)中函數(shù)名和窗口看門狗一致。
voidWWDG_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line24)!=RESET)
{
EXTI_ClearITPendingBit(EXTI_Line24);
IWDG_ClearIT();
IWDG_ReloadCounter();//可以在中斷中喂狗或者置標(biāo)志位
}
}
9功能驗(yàn)證
在測(cè)試驗(yàn)證程序中在看門狗中斷服務(wù)函數(shù)添加printf("IWDG IRQ Mode ");下載程序可以看到MCU上電完成后會(huì)一直循環(huán)打印“IWDG IRQ Mode”。

圖3
針對(duì)需要短時(shí)間低功耗STOP模式喚醒的應(yīng)用場(chǎng)景,可以使用該方式喚醒,同時(shí)針對(duì)LSI精度不高的問(wèn)題,可以通過(guò)HSI對(duì)LSI進(jìn)行校準(zhǔn)方式,從而獲取高精度的LSI時(shí)鐘源。
-
看門狗
+關(guān)注
關(guān)注
10文章
583瀏覽量
71811 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2291瀏覽量
96423 -
IWDG
+關(guān)注
關(guān)注
0文章
23瀏覽量
5524 -
獨(dú)立看門狗
+關(guān)注
關(guān)注
0文章
25瀏覽量
4140 -
MM32
+關(guān)注
關(guān)注
1文章
108瀏覽量
1102
原文標(biāo)題:靈動(dòng)微課堂 (第222講) | MM32F0140學(xué)習(xí)筆記——獨(dú)立看門狗(IWDG)
文章出處:【微信號(hào):MindMotion-MMCU,微信公眾號(hào):靈動(dòng)MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
獨(dú)立看門狗(IWDG)的基礎(chǔ)知識(shí)

STM32中的獨(dú)立看門狗和窗口看門狗是什么

基于MM32F0140開(kāi)發(fā)板的獨(dú)立看門狗(IWDG)設(shè)計(jì)筆記
stm32看門狗時(shí)間計(jì)算 獨(dú)立看門狗和窗口看門狗的特性是什么
什么是stm32看門狗?獨(dú)立看門狗和窗口看門狗工作原理解析

STM32:獨(dú)立看門狗、窗口看門狗的配置

STM32中的獨(dú)立看門狗和窗口看門狗
詳解獨(dú)立看門狗的實(shí)現(xiàn)原理
STM32中的獨(dú)立看門狗和窗口看門狗

評(píng)論