stm32 窗口看門(mén)狗 wwdg與獨(dú)立看門(mén)狗iwdg的配置運(yùn)用
a) 目的:使用系統(tǒng)時(shí)鐘來(lái)進(jìn)行兩項(xiàng)實(shí)驗(yàn)——周期執(zhí)行代碼與精確定時(shí)延遲。
本文引用地址:http://m.butianyuan.cn/article/201611/322485.htmb) 初始化函數(shù)定義:
void SysTick_Configuration(void);
c) 初始化函數(shù)調(diào)用:
SysTick_Configuration();
d) 初始化函數(shù):
void SysTick_Configuration(void)
{
}
e) 在NVIC的初始化函數(shù)里面增加以下代碼打開(kāi)相關(guān)中斷:
NVIC_SystemHandlerPriorityCon
f) 在stm32f10x_it.c文件中找到void SysTickHandler 函數(shù)
void SysTickHandler(void)
{
執(zhí)行代碼
}
g) 簡(jiǎn)單應(yīng)用:精確延遲函數(shù),因?yàn)閟ystic中斷往往被用來(lái)執(zhí)行周期循環(huán)代碼,所以一些例程中使用其中斷的啟動(dòng)和禁止來(lái)編寫(xiě)的精確延時(shí)函數(shù)實(shí)際上不實(shí)用,我自己編寫(xiě)了精確計(jì)時(shí)函數(shù)反而代碼更精簡(jiǎn),思路更簡(jiǎn)單。思路是調(diào)用后,變量清零,然后使用時(shí)鐘來(lái)的曾變量,不斷比較變量與延遲的數(shù)值,相等則退出函數(shù)。代碼和步驟如下:
i. 定義通用變量:u16 Tic_Val=0; //變量用于精確計(jì)時(shí)
ii. 在stm32f10x_it.c文件中相應(yīng)定義:
extern u16 Tic_Val;//在本文件引用MAIN.c定義的精確計(jì)時(shí)變量
iii. 定義函數(shù)名稱(chēng):void Tic_Delay(u16 Tic_Count);//精確延遲函數(shù)
iv. 精確延時(shí)函數(shù):
void Tic_Delay(u16 Tic_Count)
{ Tic_Val=0;
}
v. 在stm32f10x_it.c文件中void SysTickHandler 函數(shù)里面添加
vi. 調(diào)用代碼:Tic_Delay(10); //精確延時(shí)
vii. 疑問(wèn):如果去掉計(jì)時(shí)行那個(gè)沒(méi)用的printf("");函數(shù)將停止工作,這個(gè)現(xiàn)象很奇怪
C語(yǔ)言功底問(wèn)題。是的,那個(gè)“注意事項(xiàng)”最后的疑問(wèn)的原因就是這個(gè)
Tic_Val應(yīng)該改為vu16
while(Tic_Val != Tic_Count){printf("");}//計(jì)時(shí)
就可以改為:
while(Tic_Val != Tic_Count);
STM32筆記之十三:惡搞,兩只看門(mén)狗
a) 目的:
了解兩種看門(mén)狗(我叫它:系統(tǒng)運(yùn)行故障探測(cè)器和獨(dú)立系統(tǒng)故障探測(cè)器,新手往往被這個(gè)并不形象的象形名稱(chēng)搞糊涂)之間的區(qū)別和基本用法。
b) 相同:
都是用來(lái)探測(cè)系統(tǒng)故障,通過(guò)編寫(xiě)代碼定時(shí)發(fā)送故障清零信號(hào)(高手們都管這個(gè)代碼叫做“喂狗”),告訴它系統(tǒng)運(yùn)行正常。一旦系統(tǒng)故障,程序清零代碼(“喂狗”)無(wú)法執(zhí)行,其計(jì)數(shù)器就會(huì)計(jì)數(shù)不止,直到記到零并發(fā)生故障中斷(狗餓了開(kāi)始叫喚),控制CPU重啟整個(gè)系統(tǒng)(不行啦,開(kāi)始咬人了,快跑……)。
c) 區(qū)別:
獨(dú)立看門(mén)狗Iwdg——我的理解是獨(dú)立于系統(tǒng)之外,因?yàn)橛歇?dú)立時(shí)鐘,所以不受系統(tǒng)影響的系統(tǒng)故障探測(cè)器。(這條狗是借來(lái)的,見(jiàn)誰(shuí)偷懶它都咬?。┲饕糜诒O(jiān)視硬件錯(cuò)誤。
窗口看門(mén)狗wwdg——我的理解是系統(tǒng)內(nèi)部的故障探測(cè)器,時(shí)鐘與系統(tǒng)相同。如果系統(tǒng)時(shí)鐘不走了,這個(gè)狗也就失去作用了。(這條狗是老板娘養(yǎng)的,老板不干活兒他不管?。┲饕糜诒O(jiān)視軟件錯(cuò)誤。
d) 初始化函數(shù)定義:鑒于兩只狗作用差不多,使用過(guò)程也差不多初始化函數(shù)栓一起了,用的時(shí)候根據(jù)情況刪減。
void WDG_Configuration(void);
e) 初始化函數(shù)調(diào)用:
WDG_Configuration();
f) 初始化函數(shù)
void WDG_Configuration()
{
//軟件看門(mén)狗初始化
// (PCLK1/4096)/8= 244 Hz (~4 ms)
WWDG_SetWindowValue(65);
// WWDG timeout = ~4 ms * 64 = 262 ms
WWDG_ClearFlag();
//獨(dú)立看門(mén)狗初始化
}
g) RCC初始化:只有軟件看門(mén)狗需要時(shí)鐘初始化,獨(dú)立看門(mén)狗有自己的時(shí)鐘不需要但是需要systic工作相關(guān)設(shè)置。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
h) 獨(dú)立看門(mén)狗使用systic的中斷來(lái)喂狗,所以添加systic的中斷打開(kāi)代碼就行了。軟件看門(mén)狗需要在NVIC打開(kāi)中斷添加如下代碼:
i) 中斷程序,軟件看門(mén)狗在自己的中斷中喂狗,獨(dú)立看門(mén)狗需要使用systic的定時(shí)中斷來(lái)喂狗。以下兩個(gè)程序都在stm32f10x_it.c文件中。
void WWDG_IRQHandler(void)
{
WWDG_ClearFlag();
}
void SysTickHandler(void)
{
}
j) 注意事項(xiàng):
i. 有狗平常沒(méi)事情可以不理,但是千萬(wàn)別忘了喂它,否則死都不知道怎么死的!
ii. 初始化程序的調(diào)用一定要在systic的初始化之后。
iii. 獨(dú)立看門(mén)狗需要systic中斷來(lái)喂,但是systic做別的用處不能只做這件事,所以我寫(xiě)了如下幾句代碼,可以不影響systic的其他應(yīng)用,其他systic周期代碼也可參考:
第一步:在stm32f10x_it.c中定義變量
int Tic_IWDG;
第二步:將SysTickHandler中喂狗代碼改為下面:
Tic_IWDG++;
if(Tic_IWDG>=100)
{
}
評(píng)論