微控制器程式設計過程中經常用到延時函式,最常用的莫過於微秒級延時delay_us( )和毫秒級delay_ms( )。
1.普通延時法
這個比較簡單,讓微控制器做一些無關緊要的工作來打發時間,經常用迴圈來實現,不過要做的比較精準還是要下一番功夫。下面的**是在網上搜到的,經測試延時比較精準。
//粗延時函式,微秒
void delay_us(u16 time)
}//毫秒級的延時
void delay_ms(u16 time)
}
2.systick 定時器延時
cm3 核心的處理器,內部包含了乙個systick 定時器,systick 是乙個24 位的倒計數定時器,當計到0 時,將從reload暫存器中自動重裝載定時初值。只要不把它在systick 控制及狀態暫存器中的使能位清除,就永不停息。systick 在stm32的參考手冊裡面介紹的很簡單,其詳細介紹,請參閱《cortex-m3 權威指南》。
這裡面也有兩種方式實現:
a.中斷方式 如下,定義延時時間time_delay,systick_config()定義中斷時間段,在中斷中遞減time_delay,從而實現延時。
volatile unsigned long time_delay; // 延時時間,注意定義為全域性變數
//延時n_ms
void delay_ms(volatile unsigned long nms)
time_delay=nms;//讀取定時時間
while(time_delay);
systick->ctrl=0x00; //關閉計數器
systick->val =0x00; //清空計數器
}//延時nus
void delay_us(volatile unsigned long nus)
time_delay=nus;//讀取定時時間
while(time_delay);
systick->ctrl=0x00; //關閉計數器
systick->val =0x00; //清空計數器
} //在中斷中將time_delay遞減。實現延時
void systick_handler(void)
b.非中斷方式
主要仿照原子的《stm32不完全手冊》。systick 的時鐘固定為hclk 時鐘的1/8,在這裡我們選用內部時鐘源72m,所以systick的時鐘為9m,即systick定時器以9m的頻率遞減。systick 主要包含ctrl、load、val、calib 等4 個暫存器,
systick->ctrl
位段名稱
型別復位值
描述countflag
r如果在上次讀本暫存器後systick已為0,則該位為1,若 讀該位自動清零
clksource
rw0:外部時鐘源 1:內部時鐘
tickint
rw0:減到0無動作;1:減到0產生systick異常請求
enable
rwsystick定時器使能位
systick-> load
位段名稱
型別復位值
描述23:0
reload
rw減到0時被重新裝載的值
systick-> val
位段名稱
型別復位值
描述23:0
current
rw讀取時返回當前倒計數的值,寫則清零,同時還會清除在systick控制及狀態暫存器中的countflag標誌
systick-> calib 不常用,在這裡我們也用不到,故不介紹了。
程式如下,相當於查詢法。
//仿原子延時,不進入systic中斷
void delay_us(u32 nus)
while((temp&0x01)&&(!(temp&(1<<16))));//等待時間到達
systick->ctrl=0x00; //關閉計數器
systick->val =0x00; //清空計數器
}void delay_ms(u16 nms)
while((temp&0x01)&&(!(temp&(1<<16))));//等待時間到達
systick->ctrl=0x00; //關閉計數器
systick->val =0x00; //清空計數器
}
三種方式各有利弊,第一種方式容易理解,但不太精準。第二種方式採用庫函式,編寫簡單,由於中斷的存在,不利於在其他中斷中呼叫此延時函式。第三種方式直接操作暫存器,看起來比較繁瑣,其實也不難,同時克服了以上兩種方式的缺點,個人感覺比較好用。 STM32延時函式的三種方法
微控制器程式設計過程中經常用到延時函式,最常用的莫過於微秒級延時delay us 和毫秒級delay ms 1.普通延時法 這個比較簡單,讓微控制器做一些無關緊要的工作來打發時間,經常用迴圈來實現,不過要做的比較精準還是要下一番功夫。下面的 是在網上搜到的,經測試延時比較精準。粗延時函式,微秒 vo...
STM32三種延時函式
這個比較簡單,讓微控制器做一些無關緊要的工作來打發時間,經常用迴圈來實現,不過要做的比較精準還是要下一番功夫。下面的 是在網上搜到的,經測試延時比較精準。粗延時函式,微秒 void delay us u16 time 毫秒級的延時 void delay ms u16 time 2.systick 定...
stm32延時函式的三種寫法
我常用的延時函式有3種,一種是空迴圈,一種是使用systick中斷,還有一種是正點原子的延時。第一種就不做舉例,因為平時不常用。但是一些模組給的參考 的延時函式都會採用這樣的方法,直接用就好了,不做贅述。第二種方法是採用sistick中斷服務函式。中斷服務函式。引用定義的全域性變數。extern u...