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