基于stm32f103zet6的看門狗學(xué)習(xí)
看門狗,這個東西在哪都能看見,關(guān)于其中簡單介紹在我的另一篇博文中有的,那是關(guān)于arm11的,不過大體一樣http://blog.csdn.net/king_bingge/article/details/8510713
一、首先就是獨立看門狗
直接上操作流程吧
1、三個比較重要的寄存器:鍵值寄存器(IWDG_KR)、預(yù)分頻寄存器(IWDG_PR)、重載寄存器(IWDG_RLR)
向IWDG_KR 寫入0X5555:能夠去除寫保護,方便我們給分頻寄存器和重載寄存器進行寫操作嘛!不就是類似于DS1302的寫保護么。。
2、有一個知識點就是關(guān)于看門狗使用的時鐘,這里使用的是內(nèi)部低速時鐘40k左右的樣子,那么我們就能算出,定時的最大時間了。Tout=40Khz/((4*2^prer )*rlr)
向IWDG_KR 寫入0XAAAA:這一步能夠?qū)⑽覀儗懭氲倪@個值重裝載到IWDG_RLR這個寄存器中,類似于我們51的定時器!
3、接著就是像IWDG_KR 寫入0XCCCC來啟動看門狗,同時也就關(guān)閉了寫保護,防止意外寫入。
注意了:每次我們給IWDG_KR 寫入0XAAAA的時候,他會自動重新進行喂狗!
二、分析代碼
1、 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能對寄存器IWDG_PR和IWDG_RLR的寫操作,也就是帶開寫保護了!
不信跟蹤進去看一看吧,僅僅嘗試這一次,因為之前學(xué)arm11裸機的時候,全是操作寄存器的,現(xiàn)在煩了,這也是我第一次分析寄存器吧,反正我還是覺得庫函數(shù)用著方便
GO GO GO !
voidIWDG_WriteAccessCmd(uint16_tIWDG_WriteAccess)
{
/*Checktheparameters*/
assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess));
IWDG->KR=IWDG_WriteAccess;
}
上面是函數(shù)定義;
#defineIWDG((IWDG_TypeDef*)IWDG_BASE)
上面是原型
#defineIWDG_BASE(APB1PERIPH_BASE+0x3000)
這是跟蹤到的地址,繼續(xù)!
#defineAPB1PERIPH_BASEPERIPH_BASE
#definePERIPH_BASE((uint32_t)0x40000000)/*! 好的,反推回去! IWDG_BASE=0x40000000+0x3000 最后找到這個結(jié)構(gòu)體咯 typedefstruct { __IOuint32_tKR; __IOuint32_tPR; __IOuint32_tRLR; __IOuint32_tSR; }IWDG_TypeDef; 再看芯片手冊 0x40003000-0x400033FF獨立看門狗(IWDG) 繼續(xù)跟蹤參數(shù)。。 #define IWDG_WriteAccess_Enable ((uint16_t)0x5555) 發(fā)現(xiàn)了??所以嘛 IWDG->KR = IWDG_WriteAccess; 就是相當于給 voidIWDG_Init(u8prer,u16rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//使能對寄存器IWDG_PR和IWDG_RLR的寫操作 IWDG_SetPrescaler(prer);//設(shè)置IWDG預(yù)分頻值:設(shè)置IWDG預(yù)分頻值為64 IWDG_SetReload(rlr);//設(shè)置IWDG重裝載值 IWDG_ReloadCounter();//按照IWDG重裝載寄存器的值重裝載IWDG計數(shù)器 IWDG_Enable();//使能IWDG } //喂獨立看門狗 voidIWDG_Feed(void) { IWDG_ReloadCounter(); } 下面看代碼吧! 1、直接給初始化函數(shù) voidWWDG_Init(u8tr,u8wr,u32fprer) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//WWDG時鐘使能 WWDG_SetPrescaler(fprer);//設(shè)置IWDG預(yù)分頻值 WWDG_SetWindowValue(wr);//設(shè)置窗口值 WWDG_Enable(tr);//使能看門狗,設(shè)置counter. WWDG_ClearFlag(); WWDG_NVIC_Init();//初始化窗口看門狗NVIC WWDG_EnableIT();//開啟窗口看門狗中斷 } 2、同樣也有喂狗函數(shù) //喂狗 voidWWDG_Set_Counter(u8cnt) { WWDG_Enable(cnt); } 3、上面提到了當技術(shù)到0x40的時候就會長生中斷,那么中斷怎么實現(xiàn)? //窗口看門狗中斷服務(wù)程序 voidWWDG_NVIC_Init() { NVIC_InitTypeDefNVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;//WWDG中斷 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占2,子優(yōu)先級3,組2 NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//搶占2,子優(yōu)先級3,組2 NVIC_Init(&NVIC_InitStructure);//NVIC初始化 } voidWWDG_IRQHandler(void) { //UpdateWWDGcounter WWDG_SetCounter(0x7F);//當禁掉此句后,窗口看門狗將產(chǎn)生復(fù)位 //ClearEWIflag*/ WWDG_ClearFlag();//清除提前喚醒中斷標志位 } 就是這樣配置了!這樣就能實現(xiàn)我們的兩只狗看著程序這個大門了!!!
寄存器(IWDG_KR )0x40003000 地址寫 0x5555。
OK分析完畢,ST32的庫函數(shù)都是這樣組織的,我很喜歡這種形式,開發(fā)速度相當快呀!即使有些地方的口碑不太好,但是我們在那部分就可以操作寄存器了,一舉兩得的事情
2、直接給出初始化代碼,有興趣的自己可以分析,我是沒什么興趣了