娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年10月21日(星期一)

正在發生

2018年10月21日 | STM32學習之:定時器程序設計探討

發布者:平和思緒 來源: eefocus關鍵字:STM32  定時器程序 手機看文章 掃描二維碼
隨時隨地手機看文章

假設使用定時器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學習之:定時器程序設計探討

上一篇:STM32學習之:事件標志組
下一篇:STM32學習之:Context—M3簡介

推薦閱讀

STM32的RTC晶振經常出現不起振的問題,這已經是“業界共識”了。很多人在各種電子論壇上求助類似于“求高手指點!RTC晶振不起振怎么辦”的問題,而其答案基本可以概括為“這次高手幫不了你了”  更有陰謀論者提出讓人啼笑皆非的解釋——STM32的RTC晶振不起振是ST與晶振廠商串通后故意搞出來的,目的是提高某晶振廠商高端晶振的銷量?! ∽罱龅膸讐K板...
渦街流量計在調試故障原因一安裝不當方面的原因:(1)儀表上下游直管段長度不夠,密封墊凸入管道內,管道的突縮,突擴阻流件,對流場產生嚴重的擾動等。(2)對含微量氣體的液體流量測量或者含微量液體的氣體流量測量的不良安裝,造成異樣流量介質在渦街流量計流量測量管道內的滯留,對流量測量造成干擾。(3)流量測量液體時把渦街流量計安裝在自上而下...
集微網10月21日消息,隨著智能手機的使用日趨頻繁,使得智能手機的充電日益受到關注,中國電信在近日談到了智能手機充電的四大誤區,看看你有沒有中招。誤區一:智能手機電量用完再充電如果每次都把智能手機電量用完再充,會加快智能手機電池的老化。最好在智能手機提示電量過低的時候就不再玩智能手機,讓它安心充電。也不需要每次充電都充滿,隨用隨充才...
一、開發環境主 機:VMWare--Fedora 9開發板:Mini2440--64MB Nand, Kernel:2.6.30.4編譯器:arm-linux-gcc-4.3.2二、MMC/SD介紹及SDI主機控制器首先我們來理清幾個概念:MMC:(Multi Media Card)由西門子公司和首推CF的SanDisk于1997年推出的多媒體記憶卡標準。SD:(Secure Digital Memory Card)由日本松下、東芝及美國SanDisk公司于1999年8月...

史海拾趣

小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 长兴县| 弥渡县| 永宁县| 怀柔区| 黄冈市| 宁津县| 尼玛县| 梁河县| 富顺县| 西吉县| 岚皋县| 顺义区| 高尔夫| 永和县| 闵行区| 瑞安市| 尤溪县| 苍山县| 汝南县| 鄂州市| 谷城县| 宝山区| 彰化县| 迁西县| 杂多县| 阿坝县| 湖南省| 寻乌县| 梅河口市| 建平县| 宣武区| 蓬安县| 汨罗市| 友谊县| 绵竹市| 鄂尔多斯市| 钟祥市| 苗栗市| 怀宁县| 临汾市| 纳雍县|