a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > stm32 窗口看門狗 wwdg與獨立看門狗iwdg的配置運用

stm32 窗口看門狗 wwdg與獨立看門狗iwdg的配置運用

作者: 時間:2016-11-27 來源:網絡 收藏
STM32筆記之十二:時鐘不息工作不止,systic時鐘應用

a) 目的:使用系統時鐘來進行兩項實驗——周期執行代碼與精確定時延遲。

本文引用地址:http://www.j9360.com/article/201611/322485.htm

b) 初始化函數定義:

void SysTick_Configuration(void);

c) 初始化函數調用:

SysTick_Configuration();

d) 初始化函數:

void SysTick_Configuration(void)

{

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//時鐘除8

SysTick_SetReload(250000); //計數周期長度

SysTick_CounterCmd(SysTick_Counter_Enable); //啟動計時器

SysTick_ITConfig(ENABLE); //打開中斷

}

e) 在NVIC的初始化函數里面增加以下代碼打開相關中斷:

NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 1, 0);//中斷等級設置,一般設置的高一些會少受其他影響

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; //變量清零

while(Tic_Val != Tic_Count){printf("");}//計時

}

v. 在stm32f10x_it.c文件中void SysTickHandler 函數里面添加

Tic_Val++;//變量遞增

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() //看門狗初始化

{

//軟件看門狗初始化

WWDG_SetPrescaler(WWDG_Prescaler_8); //時鐘8分頻4ms

// (PCLK1/4096)/8= 244 Hz (~4 ms)

WWDG_SetWindowValue(65); //計數器數值

WWDG_Enable(127); //啟動計數器,設置喂狗時間

// WWDG timeout = ~4 ms * 64 = 262 ms

WWDG_ClearFlag(); //清除標志位

WWDG_EnableIT(); //啟動中斷

//獨立看門狗初始化

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//啟動寄存器讀寫

IWDG_SetPrescaler(IWDG_Prescaler_32);//40K時鐘32分頻

IWDG_SetReload(349); //計數器數值

IWDG_ReloadCounter(); //重啟計數器

IWDG_Enable(); //啟動看門狗

}

g) RCC初始化:只有軟件看門狗需要時鐘初始化,獨立看門狗有自己的時鐘不需要但是需要systic工作相關設置。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

h) 獨立看門狗使用systic的中斷來喂狗,所以添加systic的中斷打開代碼就行了。軟件看門狗需要在NVIC打開中斷添加如下代碼:

NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel; //通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //占先中斷等級

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //響應中斷優先級

NVIC_Init(&NVIC_InitStructure); //打開中斷

i) 中斷程序,軟件看門狗在自己的中斷中喂狗,獨立看門狗需要使用systic的定時中斷來喂狗。以下兩個程序都在stm32f10x_it.c文件中。

void WWDG_IRQHandler(void)

{

WWDG_SetCounter(0x7F); //更新計數值

WWDG_ClearFlag(); //清除標志位

}

void SysTickHandler(void)

{IWDG_ReloadCounter(); //重啟計數器(喂狗)

}

j) 注意事項:

i. 有狗平常沒事情可以不理,但是千萬別忘了喂它,否則死都不知道怎么死的!

ii. 初始化程序的調用一定要在systic的初始化之后。

iii. 獨立看門狗需要systic中斷來喂,但是systic做別的用處不能只做這件事,所以我寫了如下幾句代碼,可以不影響systic的其他應用,其他systic周期代碼也可參考:

第一步:在stm32f10x_it.c中定義變量

int Tic_IWDG; //喂狗循環程序的頻率判斷變量

第二步:將SysTickHandler中喂狗代碼改為下面:

Tic_IWDG++; //變量遞增

if(Tic_IWDG>=100) //每100個systic周期喂狗

{IWDG_ReloadCounter();//重啟計數器(喂狗)

Tic_IWDG=0; //變量清零

}



評論


技術專區

關閉