欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

STM32延時函數

作者:佚名   來源:本站原創   點擊數:  更新時間:2014年01月22日   【字體:
void delay_init(u8 SYSCLK) 
        SysTick->CTRL&=0xfffffffb;

 
         fac_us=SYSCLK/8;                        
        fac_ms=(u16)fac_us*1000; 
}

 
Systick 主要的作用就是拿來計時,其原理和應用簡述一下就是這樣的:通過配置寄存器 SysTick->CTRL來設定Systick的計時頻率并Enable使Systick開始計數,這里的 SysTick->CTRL&=0xfffffffb應該很好理解,把第2位設定為0,查找應用手冊可以知道這是把Systick的計時頻率設定為CPU主頻(SYSCLK)的1/8。

 
假定我們板子默認的晶振頻率是8Mhz,默認CPU工作頻率(SYSCLK)是9倍頻,即72M,那Systick的頻率就是72/8=9Mhz。

 
知道了Systick的頻率,下一步就是確定倒時計數器的數值,即SysTick-> LOAD這個寄存器的配置。上面已經知道了,Systick的工作頻率F=9Mhz=SYSCLK/8,即每秒鐘計數器自減900萬次,也就是說,SYSCLK/8次的自減耗時1秒,那么(8/SYSCLK)/1000,000次自減就耗時1微秒了,這也就是fac_us的值了。那么上面函數中的fac_us為什么是SYSCLK/8呢?這里先搞清楚一點,函數中SYSCLK的單位是Mhz,所以SYSCLK的值是72(這個以Mhz為單位應該是STM32基礎庫里面做過宏定義的),否則也不可能用一個8位整形去表示一個7200萬的數值;而我們這里計算的SYSCLK是以Hz為單位的,即 72Mhz/1000,000=72,所以這個SYSCLK/8是對的。

 
你可能還沒搞清楚 fac_us到底是干嘛的。很簡單,fac_us就是要寫入SysTick-> LOAD寄存器的值,Systick的工作原理是這個寄存器的值在Systick被Enable之后就開始以設定的工作頻率自減,減到0的時候就發出中斷,實現定時。所以,寫入fac_us到SysTick-> LOAD寄存器,就是要Systick在自減了fac_us次以后發出中斷,自減fac_us所耗的時間已經說了,1微秒。

 
下面的fac_ms應該很好理解了,就是1毫秒的計數次數,剛好是1微妙的1000倍,注意9×1000超出了8位整形的表示范圍,所以要用(u16)先把fac_us轉成16位變量,以保證計算的正確。

 
具體的應用函數是用來做延時,如下:

 
void delay_us(u32 nus) 
{               
        u32 temp;                           
        SysTick->LOAD=nus*fac_us; //時間加載                      
        SysTick->VAL=0x00;                //清空計數器 
        SysTick->CTRL=0x01 ;            //Enable Systick,開始倒數      
        do 
        { 
                temp=SysTick->CTRL; 
        } 
        while(temp&0x01&&!(temp&(1<<16)));//等待時間到達       
        SysTick->CTRL=0x00;              //Disable Systick

 
        SysTick->VAL =0X00;              //清空計數器         
}

 
具體的寄存器配置只要看手冊就知道了,這里只需要理解一句:

 
do 
        { 
                temp=SysTick->CTRL; 
        } 
        while(temp&0x01&&!(temp&(1<<16)));//等待時間到達   

 
核心就是while(temp&0x01&&!(temp&(1<<16)));//等待時間到達   

 
temp 已經是Systick控制寄存器的值了,temp&0x01就是把該寄存器的值讀出并且把除第一位之外位都清零(當然要通過temp變量來傳遞值而不是直接修改寄存器),第一位就是Systick的Enable配置信息,寫入1就是Enable,寫入0就是Disable,讀這一位是判斷 Systick是否仍然處于Enable狀態(可能被其他中斷禁用掉),temp&(1<<16)就是讀取第16位的值,這一位如果為0就表示計數器的值不是0(即還在計數),如果是1就表示計數器已經自減到0了。

 
       那么這段就很好理解了,即判斷,如果Systick還在Enable的狀態,并且計數器還沒數到0,就不停的循環把當前的 SysTick->CTRL寄存器值寫入變量temp,繼續下一次判斷。當Systick被Disable或者計數器數到0了,就停止循環。因為只是做延時,也不需要跳到任何中斷服務那邊去處理什么,只要這個循環的耗時過程完成就可以了。
關閉窗口

相關文章