假設使用定時器3每1毫秒定時;保存至SD卡的函數是StartSave();
第一種情況:定時器快,主循環慢
1、代碼設計1(錯誤的設計)
[cpp] view plain copy
int cnt = 0; //計數
//TIM3中斷處理函數
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
cnt ++;
}
}
void main(void)
{
代碼段1
while(1)
{
代碼段2
if(cnt %100 == 0)
{
StartSave();
}
代碼段3
}
}
分析:第一種設計經測試發現并沒有按照預期的100毫秒間隔保存;原因何在呢?
很明顯后臺程序運行較快,當cnt 變為100的倍數時,主循環可能到達“代碼段3”,當主循環再次到達
“代碼段2”時,定時器中斷已經改變了cnt的值。
2、代碼設計2(在這種情況下正確)
[cpp] view plain copy
int cnt = 0; //計數
unsigned char isOK = 0;
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
if(cnt++ % 100 == 0)
isOK = 1;
}
}
void main(void)
{
代碼段1
while(1)
{
代碼段2
if(isOK == 1)
{
isOK = 0;
StartSave();
}
代碼段3
}
}
設計2避免了1中所出現的問題。
第二種情況:定時器慢,主循環快
在這種情況下上面的代碼設計2就出現問題了。出現保存多了的情況。
原因很明顯,isOK這個變量的變化相對于主循環來說變化太慢了。會出現isOK一直為1 的情況。
假設定時器定時1ms,主循環0.5ms周期
1、代碼設計1(錯誤的設計)
[cpp] view plain copy
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
cnt++;//該值理論保持時間僅1ms
}
}
void main(void)
{
unsigned char saveFin = 0;
代碼段1
while(1)
{
代碼段2
if(cnt%100 )
{
StartSave();//明顯出現100ms內多次保存的情況,因為主循環快
}
代碼段3
}
}
2、代碼設計2(正確的設計)
[cpp] view plain copy
unsigned char saveFin = 0;
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
cnt++;//該值理論保持時間僅1ms
}
}
void main(void)
{
unsigned char saveFin = 0;
代碼段1
while(1)
{
代碼段2
if(cnt%100 == 0 && saveFin == 0 )
{
saveFin = 1;
StartSave();
}
else
{
saveFin = 0;
}
代碼段3
}
}
第三種情況:不能確定定時器和main循環周期哪個快的設計
當然主循環的周期不能大于保存周期100ms
[cpp] view plain copy
unsigned char isOK = 0;
unsigned int clkCnt = 0;
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
if(clkCnt++ % 10 == 0)
cnt++;//該值理論保持時間10ms,需要在主循環中清零
}
}
void main(void)
{
unsigned char saveFin = 1;//注意這里的初始值為1,與前面設計不同
代碼段1
while(1) //循環周期不能大于10ms,否則丟失對cnt的判斷
{
代碼段2
if(cnt%10 == 0) //例如在100ms--110ms之間時將“保存標志”清零
{
saveFin = 0;
}
else //例如在110ms--200ms之間時完成保存
{
if(saveFin == 0)//在110ms--200ms之間只能保存一次的代碼設計
{
startSave();
saveFin = 1;
}
}
代碼段3
}
}
上一篇:STM32學習之:事件標志組
下一篇:STM32學習之:Context—M3簡介
推薦閱讀
史海拾趣
設計資源 培訓 開發板 精華推薦
- ADI有獎下載活動之12 ADI基于視覺的占用檢測解決方案
- 已結束|TI 直播【創新下一代汽車網關系統】
- 泰克專家邀你了解大數據時代全新解決方案,參與翻蓋有禮!
- 【XILINX 主題分享月】 信號處理資料大搜集?。?!
- 中國版BeagleBone Black超低價團購!11月18日火爆開團
- 如何在FPGA設計環境中加時序約束
- 寶藏電路圖分享計劃開啟,學習拿獎兩不誤
- 【NI有獎直播】當DeepSeek遇到LabVIEW【進入直播頁面,掃碼看回放】
- 有獎直播 | 與英飛凌一同革新您的電動汽車溫控系統:集成熱管理系統(低壓側)
- 下載應用文章有禮啦!新方案新標準:助你克服第四代I/O應用中的接收機測試挑戰!