日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Systick 延时函数详解

發布時間:2024/10/14 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Systick 延时函数详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


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了,就停止循環。因為只是做延時,也不需要跳到任何中斷服務那邊去處理什么,只要這個循環的耗時過程完成就可以了。

總結

以上是生活随笔為你收集整理的Systick 延时函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。