亚洲日韩精品一区二区,91超碰人人看,日韩久久四区成人,日韩 精品无一区二区三区,欧美 日韩 综合 色,国产日韩欧美电影,午夜天堂精品久久久久91,日韩精品亚洲天堂,天天草免费视频观看

您好,歡迎來(lái)到深圳市亞泰盈科電子有限公司

STM32F030K6T6 學(xué)習(xí)之:定時(shí)器程序設(shè)計(jì)探討 STM32F030K6T6使用注意事項(xiàng)

發(fā)布時(shí)間:2018/11/6

假設(shè)使用定時(shí)器3每1毫秒定時(shí);保存至SD卡的函數(shù)是StartSave();
第一種情況:定時(shí)器快,主循環(huán)慢
1、代碼設(shè)計(jì)1(錯(cuò)誤的設(shè)計(jì))
[cpp] view plain copy
int cnt = 0; //計(jì)數(shù)  
//TIM3中斷處理函數(shù)  
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  
   }  
}  
分析:第一種設(shè)計(jì)經(jīng)測(cè)試發(fā)現(xiàn)并沒(méi)有按照預(yù)期的100毫秒間隔保存;原因何在呢?
很明顯后臺(tái)程序運(yùn)行較快,當(dāng)cnt 變?yōu)?00的倍數(shù)時(shí),主循環(huán)可能到達(dá)“代碼段3”,當(dāng)主循環(huán)再次到達(dá)
“代碼段2”時(shí),定時(shí)器中斷已經(jīng)改變了cnt的值。


2、代碼設(shè)計(jì)2(在這種情況下正確)
[cpp] view plain copy
int cnt = 0; //計(jì)數(shù)  
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  
   }  
}  
設(shè)計(jì)2避免了1中所出現(xiàn)的問(wèn)題。
第二種情況:定時(shí)器慢,主循環(huán)快
在這種情況下上面的代碼設(shè)計(jì)2就出現(xiàn)問(wèn)題了。出現(xiàn)保存多了的情況。
原因很明顯,isOK這個(gè)變量的變化相對(duì)于主循環(huán)來(lái)說(shuō)變化太慢了。會(huì)出現(xiàn)isOK一直為1 的情況。
假設(shè)定時(shí)器定時(shí)1ms,主循環(huán)0.5ms周期
1、代碼設(shè)計(jì)1(錯(cuò)誤的設(shè)計(jì))
[cpp] view plain copy
void TIM3_IRQHandler(void)  
{  
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)   
    {  
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );    
        cnt++;//該值理論保持時(shí)間僅1ms  
    }  
}  
void main(void)  
{  
   unsigned char saveFin = 0;  
   代碼段1  
   while(1)  
   {  
     代碼段2  
     if(cnt%100 )  
     {  
        StartSave();//明顯出現(xiàn)100ms內(nèi)多次保存的情況,因?yàn)橹餮h(huán)快  
     }  
     代碼段3  
   }  
}  
2、代碼設(shè)計(jì)2(正確的設(shè)計(jì))
[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++;//該值理論保持時(shí)間僅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  
   }  
}  
第三種情況:不能確定定時(shí)器和main循環(huán)周期哪個(gè)快的設(shè)計(jì)
當(dāng)然主循環(huán)的周期不能大于保存周期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++;//該值理論保持時(shí)間10ms,需要在主循環(huán)中清零  
    }  
}  
void main(void)  
{  
   unsigned char saveFin = 1;//注意這里的初始值為1,與前面設(shè)計(jì)不同  
   代碼段1  
   while(1) //循環(huán)周期不能大于10ms,否則丟失對(duì)cnt的判斷  
   {  
     代碼段2  
     if(cnt%10 == 0) //例如在100ms--110ms之間時(shí)將“保存標(biāo)志”清零  
     {  
    saveFin = 0;   
     }  
     else  //例如在110ms--200ms之間時(shí)完成保存  
     {  
        if(saveFin == 0)//在110ms--200ms之間只能保存一次的代碼設(shè)計(jì)  
        {  
           startSave();  
           saveFin = 1;  
        }  
     }  
     代碼段3  
衡东县| 黔西| 芒康县| 获嘉县| 都兰县| 梓潼县| 尼木县| 札达县| 长治县| 南昌县| 左权县| 微山县| 华坪县| 绥中县| 方城县| 桓仁| 绩溪县| 万盛区| 景谷| 防城港市| 眉山市| 阳新县| 甘南县| 女性| 鄂托克旗| 罗平县| 桃江县| 边坝县| 屯门区| 建平县| 乐清市| 汉源县| 富顺县| 扶沟县| 德庆县| 许昌市| 吴江市| 砀山县| 巫山县| 商城县| 绥江县|