//////////////////////////////////////////////////////////////////////////////////
//延時程序
//鄧堯
//2014.5.15.
//1.0
//Copyright(C)
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
#include
//////////////////////////////////////////////////////////////////////////////////
static u8 fac_us=0; //us延時倍乘數
static u16 fac_ms=0; //ms延時倍乘數
////////////////////////////////////////
//初始化延遲函數
//SYSTICK的時鐘固定為HCLK時鐘的1/8
//SYSCLK:系統時鐘 如72
////////////////////////////////////////
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,選擇外部時鐘 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
////////////////////////////////////////
//延時nms
//注意nms的范圍
//SysTick->LOAD為24位寄存器,所以,最大延時為:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK單位為Hz,nms單位為ms
//對72M條件下,nms<=1864
////////////////////////////////////////
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//時間加載(SysTick->LOAD為24bit)
SysTick->VAL =0x00; //清空計數器
SysTick->CTRL=0x01 ; //開始倒數
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待時間到達
SysTick->CTRL=0x00; //關閉計數器
SysTick->VAL =0X00; //清空計數器
}
////////////////////////////////////////////
//延時nus
//nus為要延時的us數.
/////////////////////////////////////////////
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //時間加載
SysTick->VAL=0x00; //清空計數器
SysTick->CTRL=0x01 ; //開始倒數
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待時間到達
SysTick->CTRL=0x00; //關閉計數器
SysTick->VAL =0X00; //清空計數器
}
////////////////////END//////////////////////////////////////////
這里的滴答時鐘能精確的達到定時的效果,但是這里有一個注意的地方就是當你用滴答時鐘做延時函數時,一旦你運行延時函數,CPU將處于空閑狀態,一般這種狀態下只有外部或者內部中斷才能打斷,但是需要注意的是滴答時鐘的中斷優先級高于我們能夠配置的外部中斷優先級,所以你在延時時如果想使用外部中斷進行打斷的話效果將不太理想,這也是我自己遇到的一個問題,至今沒有一個很好的解決辦法,所以如果我要在延時中進行打斷的話,我一般不用滴答時鐘作為我的延時定時器。而是用高級定時器或者通用定時定時,并且能在想中斷時,用優先級高的中斷進行打斷,這里又設計到了一個問題就是外部中斷的使用和STM32優先級的使用和優先級的學習,呵呵,說著說著就發現這些東西不是一兩句話就能說清的,慢慢來吧,我有時間的時候就會把這些學習的心得公布在網上,希望能有更多的人能讀到,有所成長。
滴答時鐘它本來是用給操作系統提供一個“心跳”頻率,能夠實現優先級的判定和任務之間的切換,是維持操作系統的根本。一般在UCOSII系統中滴答時鐘每10MS中斷一次,在中斷里調用任務調度函數,實現多任務系統的正常運作,當然前提必須把UCOSII移植到STM32中,當然這個會在后續的記錄中說UCOSII的使用,這個也是一個大的模塊,希望能有這么多的精力去把它分享出來給大家,我只是在這里提起一下滴答時鐘,它是一個很好用的定時器,用好了是神器,我也希望能更加深入和全面的說講解下它,現在只是說起它,希望有心之人也能去研究研究下它。