標(biāo)題: 一個(gè)關(guān)于STM32 WWDG應(yīng)用的相關(guān)話題 [打印本頁]

作者: taoran    時(shí)間: 2016-3-23 15:21
標(biāo)題: 一個(gè)關(guān)于STM32 WWDG應(yīng)用的相關(guān)話題
作者:Miler Shao
       近日,在ST社區(qū)論壇看到有人發(fā)帖咨詢有關(guān)WWDG應(yīng)用方面的問題,這里以該貼為切入點(diǎn)聊聊相關(guān)話題.帖的大致內(nèi)容是這樣的:

    “剛接觸使用WWDG,嘗試通過定時(shí)器定時(shí)喂狗。使用TIMER2并開啟溢出中斷,在中斷里置位喂狗提醒標(biāo)志。在主函數(shù)里監(jiān)測(cè)提醒標(biāo)志,若監(jiān)測(cè)到喂狗標(biāo)志置位,則進(jìn)行喂狗操作并清零喂狗標(biāo)志。可是發(fā)現(xiàn)每當(dāng)打開WWDG后,感覺就進(jìn)不去定時(shí)中斷了,總是喂狗失敗導(dǎo)致不停復(fù)位。如果關(guān)閉WWDG,定時(shí)中斷正常;不用TIMER中斷,用while延遲相等時(shí)間,也可喂狗成功。想不通為什么WWDG會(huì)導(dǎo)致中斷失?”

    在討論這個(gè)問題之前不妨簡(jiǎn)單看看STM32芯片里的窗口看門狗[WWDG]的一些基本特性和主要控制寄存器。至于STM32看門狗的細(xì)節(jié)知識(shí)建議閱讀各系列的參考手冊(cè)為宜。

    窗口看門狗通常側(cè)重于用來監(jiān)測(cè)因外部干擾或不可預(yù)見的邏輯條件造成的應(yīng)用程序背離正常的運(yùn)行序列而產(chǎn)生的軟件故障。實(shí)質(zhì)上它是個(gè)可編程的自由運(yùn)行7位遞減計(jì)數(shù)器。


        這里主要涉及到3個(gè)寄存器。WDG預(yù)分頻器,WDG控制寄存器[WWDG_CR],看門狗配置寄存器[WWDG_CFR]。WWDG_CR決定計(jì)數(shù)器的上限并控制WWDG的啟停。WWDG_CFR里的W[6:0]決定喂狗的起始時(shí)刻,從該點(diǎn)到0x40形成一個(gè)有效喂狗時(shí)間窗口,即只有當(dāng)WDG計(jì)數(shù)器的值位于這個(gè)范圍時(shí)才可以做喂狗重載操作。否則,如果在計(jì)時(shí)器的值大于W[6:0]時(shí)喂狗或者計(jì)數(shù)器的值從0x40變?yōu)?x3F時(shí)都會(huì)觸發(fā)芯片復(fù)位。


     好,繼續(xù)上面的話題。

    現(xiàn)在發(fā)帖者覺得因?yàn)殚_啟了WWDG從而TIM2不進(jìn)中斷,覺得費(fèi)解。結(jié)合上面WWDG的原理,這個(gè)比較容易想到WWDG從初始的T[6:0]一直遞減計(jì)數(shù)到0X3F沒有被喂狗而發(fā)生了復(fù)位。很可能TIM2的定時(shí)周期長(zhǎng)于或者遠(yuǎn)長(zhǎng)于WWDG從T[6:0]計(jì)數(shù)到0X3F的時(shí)間,這樣每次TIM2來不及進(jìn)中斷設(shè)置相關(guān)標(biāo)志就被WWDG復(fù)位了,這樣循環(huán)往復(fù)。當(dāng)然,這只是基于問題癥狀一種可能。

    發(fā)帖者就時(shí)間參數(shù)作了進(jìn)一步確認(rèn),認(rèn)為定時(shí)中斷的時(shí)間點(diǎn)完全落在喂狗窗口范圍內(nèi),而且關(guān)閉WWDG后,TIM2 周期性更新中斷也正常。不使用TIM2,改為別的延時(shí)定時(shí)方式又能成功喂狗。

    看來問題不是出在那個(gè)TIM2定時(shí)參數(shù)與窗口時(shí)間安排上。后來發(fā)帖者調(diào)試中無意發(fā)現(xiàn)每次開啟定時(shí)器TIM2 都會(huì)進(jìn)一次中斷。這一進(jìn)中斷就問題來了,中斷里置位了喂狗喚醒標(biāo)志,退出后主程序見到喚醒標(biāo)志立即做喂狗操作。顯然這下喂早了,WWDG發(fā)揮功能了,復(fù)位芯片!復(fù)位后每次開啟定時(shí)器時(shí)故伎重演,又是提前喂狗,導(dǎo)致復(fù)位,周而復(fù)始。這樣給人以TIM2沒進(jìn)中斷,WWDG沒有得到及時(shí)喂狗而復(fù)位的假象。其實(shí)呢,喂狗喂的時(shí)間不合適而已。

    原因找到了,就比較好解決了。發(fā)帖者調(diào)整了一下代碼,在使能TIMER前先清下相應(yīng)的UIF位就好。順便提下,盡量不要在中斷里進(jìn)行喂狗操作。

   至于TIMER配置過程中一使能就產(chǎn)生更新中斷問題,有人可能遇到或留意到這點(diǎn)了。有些情況下它可能會(huì)對(duì)應(yīng)用帶來影響或麻煩。在使能前先做下相關(guān)標(biāo)志的清除也是個(gè)不錯(cuò)的辦法。再就是注意下配置代碼順序也可以回避。


相關(guān)話題鏈接:

STM32定時(shí)器有時(shí)一開啟就進(jìn)中斷的話題






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1