STM32延時函式的三種方法 最好掌握第三種

2021-08-22 07:07:45 字數 2316 閱讀 1019

微控制器程式設計過程中經常用到延時函式,最常用的莫過於微秒級延時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...