STM32看門(mén)狗時(shí)間計(jì)算(TWDG):
1.STM32看門(mén)狗的例子
IWDG的時(shí)限定為280微秒。這個(gè)時(shí)限可能會(huì)隨著LSI(內(nèi)部低速時(shí)鐘)的頻率漂移而產(chǎn)生微
小的變化。
/* IWDG timeout equal to 280 ms (the timeout may varies due to LSI frequency
dispersion) -------------------------------------------------------------
*/
/* Enable write access to IWDG_PR and IWDG_RLR registers */
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
/* IWDG counter clock: 40KHz(LSI) / 32 = 1.25 KHz */
IWDG_SetPrescaler(IWDG_Prescaler_32);
/* Set counter reload value to 349 */
IWDG_SetReload(349);
/*該參數(shù)允許取值范圍為0 – 0x0FFF *
/* Reload IWDG counter */
IWDG_ReloadCounter();
/* Enable IWDG (the LSI oscillator will be enabled by hardware) */
IWDG_Enable();
2.獨(dú)立看門(mén)狗(IWDG)由專用的40kHz 的低速時(shí)鐘為驅(qū)動(dòng);? 因此,即使主時(shí)鐘發(fā)生故障它也仍然有效。窗口看門(mén)狗由從APB1 時(shí)鐘分頻后得到的時(shí)鐘驅(qū)動(dòng),通過(guò)可配置的時(shí)間窗口來(lái)檢測(cè)應(yīng)用程序非正常的過(guò)遲或過(guò)早的行為。可通過(guò)
IWDG_SetPrescaler(IWDG_Prescaler_32); 對(duì)其時(shí)鐘進(jìn)行分頻,4-256,
通過(guò)以下方式喂狗 :
/* Reload IWDG counter */
IWDG_ReloadCounter();
3. 1.25KHz 即每周期 為0.8ms
共計(jì)時(shí) 350 個(gè)周期,即350*0.8ms=280ms
綜合以上,STM32看門(mén)狗時(shí)間(時(shí)限)與頻率計(jì)算公式為:
看門(mén)狗定時(shí)時(shí)限= IWDG_SetReload()的值 / 看門(mén)狗時(shí)鐘頻率
看門(mén)狗時(shí)鐘頻率=LSI(內(nèi)部低速時(shí)鐘)的頻率(40KHz)/ 分頻數(shù)
stm32獨(dú)立看門(mén)狗和窗口看門(mén)狗特性、區(qū)別:
總結(jié)起來(lái),兩者大概有以下幾點(diǎn)特性和區(qū)別:
1)獨(dú)立看門(mén)狗沒(méi)有中斷,窗口看門(mén)狗有中斷
2)獨(dú)立看門(mén)狗有硬件軟件之分,窗口看門(mén)狗只能軟件控制
3)獨(dú)立看門(mén)狗只有下限,窗口看門(mén)狗又下限和上限
4)獨(dú)立看門(mén)狗是12位遞減的。窗口看門(mén)狗是7位遞減的
5)獨(dú)立看門(mén)狗是用的內(nèi)部的大約40KHZ RC振蕩器,窗口看門(mén)狗是用的系統(tǒng)時(shí)鐘APB1ENR
下面我給你們?cè)敿?xì)介紹下:
獨(dú)立看門(mén)狗沒(méi)有中斷功能,只要在計(jì)數(shù)器減到0(下限)之前,重新裝載計(jì)數(shù)器的值,就不會(huì)產(chǎn)生復(fù)位,獨(dú)立看門(mén)夠有硬件和軟件之分,硬件是通過(guò)燒寫(xiě)器的“設(shè)定選項(xiàng)幾節(jié)等”配置,一旦開(kāi)啟了硬件看門(mén)狗,那么就停不下來(lái)了,只能在重新配置“設(shè)定選項(xiàng)幾節(jié)等”才能關(guān)掉硬件看門(mén)狗,軟件看門(mén)狗只需要設(shè)置IWDG->KR=0XCCCC;就可以啟動(dòng)看門(mén)狗了,軟件狗可以在系統(tǒng)復(fù)位時(shí)關(guān)掉,如果在在初始化里開(kāi)啟軟件看門(mén)狗,那就開(kāi)啟了軟件看門(mén)狗,獨(dú)立看門(mén)狗是12位遞減的寄存器,使用片子內(nèi)部的RC振蕩器,這個(gè)振蕩器是關(guān)不掉的。
窗口看門(mén)狗有中斷,這個(gè)中斷的作用是在計(jì)數(shù)器達(dá)到下限0x40的時(shí)候,產(chǎn)生中斷,讓你喂狗,如果你不喂狗,計(jì)數(shù)器的值變?yōu)?x3f的時(shí)候,將會(huì)產(chǎn)生系統(tǒng)復(fù)位,即使是喂狗,也應(yīng)該在中斷里快速喂狗,要不時(shí)間長(zhǎng)了計(jì)數(shù)器減一也會(huì)變成0x3f產(chǎn)生復(fù)位,這個(gè)時(shí)間根據(jù)芯片手冊(cè)的公式進(jìn)行計(jì)算即可得到,窗口看門(mén)狗只有軟件開(kāi)啟方式,還有一個(gè)上限值,這個(gè)值如果大于計(jì)數(shù)器的初始值,那么就沒(méi)有任何作用了,這個(gè)值小于計(jì)數(shù)器的初始值得時(shí)候,當(dāng)計(jì)數(shù)器的值大于上限值時(shí)你對(duì)計(jì)數(shù)器進(jìn)行裝載,將會(huì)產(chǎn)生復(fù)位,只有在計(jì)數(shù)器減到小于上限值時(shí),你才能重新裝載計(jì)數(shù)器,意思就是說(shuō)只有計(jì)數(shù)器的值在上限值和下限值之間你才能裝載計(jì)數(shù)器,否則就會(huì)產(chǎn)生系統(tǒng)復(fù)位,當(dāng)上限值小于下限值,也沒(méi)有意義。
獨(dú)立看門(mén)狗Iwdg——我的理解是獨(dú)立于系統(tǒng)之外,因?yàn)橛歇?dú)立時(shí)鐘,所以不受系統(tǒng)影響的系統(tǒng)故障探測(cè)器。主要用于監(jiān)視硬件錯(cuò)誤。
窗口看門(mén)狗wwdg——我的理解是系統(tǒng)內(nèi)部的故障探測(cè)器,時(shí)鐘與系統(tǒng)相同。如果系統(tǒng)時(shí)鐘不走了,這個(gè)狗也就失去作用了。主要用于監(jiān)視軟件錯(cuò)誤。
以下是經(jīng)過(guò)測(cè)試發(fā)現(xiàn)的:
//發(fā)現(xiàn)1:當(dāng)窗口值大于等于計(jì)數(shù)器的值,無(wú)論怎么更改配置的順序,都是正確的運(yùn)行結(jié)果
//發(fā)現(xiàn)2:當(dāng)窗口值小于計(jì)數(shù)器的值,順序一旦改變就運(yùn)行錯(cuò)誤
經(jīng)過(guò)測(cè)試發(fā)現(xiàn),當(dāng)初始化的順序不是正常順序的話,就會(huì)把WWDG->SR置一,為什么我也不知道,誰(shuí)知道片子里面怎么搞的。
你在開(kāi)啟中斷就進(jìn)入中斷的,這時(shí)你又進(jìn)行喂狗,就會(huì)復(fù)位的,因?yàn)檫@時(shí)計(jì)數(shù)器的值>上限窗口的值,所以會(huì)復(fù)位,所以就會(huì)一直出錯(cuò)下去。
解決辦法是,初始話的時(shí)候最后兩句是先清除中斷標(biāo)志然后在開(kāi)啟中斷,如果你不這么干,那么在初始化的時(shí)候很可能把WWDG->SR置位,那么你在開(kāi)啟中斷,就會(huì)毫不猶豫的進(jìn)入中斷,你在中斷重裝計(jì)數(shù)器值得時(shí)候,就會(huì)產(chǎn)生復(fù)位。
評(píng)論