陶 靜
(全球能源互聯(lián)網研究院,南京 210003)
一種采用SysTick中斷實現(xiàn)精確延時的方法*
陶 靜
(全球能源互聯(lián)網研究院,南京 210003)
在使用STM32微控制器作為處理器的系統(tǒng)中,常采用遞減函數實現(xiàn)延時,該方法適用于一般延時,實現(xiàn)精確延時時誤差較大。本文介紹了一種采用SysTick中斷實現(xiàn)精確延時的方法,該方法能大大提升延時精度。通過實驗驗證,SysTick中斷方式可將1 μs延時的誤差由26%降低至3%。
STM32;延時;SysTick
STM32是ST(意法半導體)公司發(fā)布的一款32位ARM微控制器,該微控制器基于針對高性能、低成本、低功耗的嵌入式應用設計的Cortex-M3內核。隨著STM32在工業(yè)控制系統(tǒng)、無線網絡與傳感器等領域廣泛應用,暴露出來的問題也越來越多,其中包含如何實現(xiàn)精確延時。常見的延時方法是調用遞減函數,該方法能實現(xiàn)固定未知時間段的延時,但運用在對延時精度要求高的場合時(例如采用私有協(xié)議的高頻通信、高頻數據存儲與解析等),誤差較大。本文提出了一種基于SysTick的延時方式,能夠很好地解決這個問題。
為了更好地說明并驗證效果,本文以實現(xiàn)1 μs的延時為目標,以STM32F207ZGT6最小系統(tǒng)PCB板、Agilent Technologies MS07104B示波器、ST-LINK下載器為硬件環(huán)境,Keil μVision4為軟件調試工具,進行程序編寫及調試。
1.1 方法介紹
在一般對延時精確度要求不高的場合下,例如:以一定的頻率設置GPIO口的電平高低來點亮或熄滅LED燈、產生占空比為50%的PWM波形、隨機延時等,常使用設置一個參數并調用遞減函數的方式來實現(xiàn)延時。使用這種方法時需要按照以下步驟進行:
① 首先定義一個參數delayCount;
② 然后定義一個函數Delay,在該函數中循環(huán)執(zhí)行遞減操作,直到delayCount遞減為0才能跳出循環(huán)。
void Delay(__IO uint32_t delayCount){
while(delayCount--)
}
③ 根據運用場景的需要,在函數中調用Delay函數,并給delayCount賦值。
1.2 實驗結果
為了直觀高效地驗證效果,本文采用了通過調用STM32庫函數GPIO_ToggleBits來變換某一引腳電平的方式。在main函數中完成系統(tǒng)及GPIO口初始化后執(zhí)行以下操作:
while (1){
GPIO_ToggleBits(GPIOD, GPIO_Pin_1);
Delay(0x100);
}
程序編譯成功后通過ST-LINK下載到STM32F207ZGT6中,通過示波器采集到的PD1引腳的波形如圖1所示。
圖1 遞減函數實現(xiàn)未知時間的延時
由圖1可知,占空為比50.2%的PWM波,正脈沖寬度為15.3 μs,負脈沖寬度為15.2 μs(正脈沖比負脈沖多出的0.1 μs是因為PD1引腳被設置為內部STM32F207ZGT6引腳電平拉高所占用時間,可忽略不計)。本例中共執(zhí)行了0x100(即256)次自減,推算出每次自減耗時為59.375 ns。若在實際應用中需要產生1 μs的延時,需遞減16.84次,取整為17次,則將while (1)中的Delay(0x100)修改為Delay(0x11)。重新編譯程序并下載后,采得的波形如圖2所示。
圖2 遞減函數實現(xiàn)1 μs的延時
由圖2可知,占空比為50.4%的PWM波,正脈沖寬度為1.28 μs,負脈沖寬度為1.26 μs,誤差為26%。
由上述實驗可知,該方法可以適用于未知時間或某一范圍的延時。若需采用該方法實現(xiàn)某一范圍的延時,需具備以下條件:①需要結合示波器或軟件仿真工具測量并計算得出遞減指令執(zhí)行的時間,再計算所需延時執(zhí)行遞減函數的次數,在調用函數時,將次數賦值給函數中的參數;②減少計算過程中四舍五入去整的次數,避免累計誤差導致精度出現(xiàn)較大偏差。
2.1 SysTick實現(xiàn)精確延時的原理
SysTick是Cortex-M3內核自帶的一個24位倒數計時定時器,將SysTick控制及狀態(tài)寄存器中的使能位置1后,SysTick會從SysTick_LOAD寄存器中加載計數值并開始遞減,當減為0時重新加載計數值并產生中斷。只要不清除使能位,則不停地執(zhí)行上述操作。SysTick在STM32F2xx的時鐘樹中有2個來源:AHB時鐘或AHB/8。本文基于STM32F207ZGT6最小系統(tǒng)PCB板進行實驗仿真,硬件中外接的是25 MHz晶振,時鐘配置時采用HSE時鐘源,經PLL倍頻后得到SYSCLK。在main函數中調用RCC_GetClocksFreq(&ClockInfo)函數核實時鐘配置,結果如圖3所示。
圖3 STM32的時鐘配置
可知SYSCLK的頻率為0x0727 0E00(即120 MHz),而AHB分頻為1,則可知AHB時鐘也為120 MHz。當需要實現(xiàn)精確延時,可以按以下步驟實現(xiàn):
① 先計算出延時期間晶振振蕩的次數,配置SysTick,并將該次數加載到SysTick_LOAD中,配置SysTick的中斷優(yōu)先級;
② 編寫中斷函數和延時函數;
③ 根據運用場景的需要,在函數中調用延時函數并給延時參數賦值。
2.2 具體實現(xiàn)方法
根據上述原理,當需要實現(xiàn)1 μs的精確延時,需將SysTick計數值配置成120M/106,即每振蕩120次也就是每1 μs進入一次中斷程序。具體函數如下:
voidSysTick_Configuration(void){
if (SysTick_Config(SystemCoreClock / 1000000)) {
while (1);
}
NVIC_SetPriority(SysTick_IRQn, 0x0);
}
SysTick在Cortex-M3中有獨立的中斷程序,在其他應用場景下可完成系統(tǒng)的定時任務,本文中只完成計數值的遞減。具體函數如下:
voidSysTick_Handler(void){
if (delayCount !=0x00)
delayCount --;
}
在main函數中調用精確延時的delay_us函數,同時賦值給nus。只有當dalayCount遞減為0時,才跳出循環(huán)。具體函數如下:
void delay_us(u16 nus){
delayCount =nus;
while(delayCount !=0);
}
2.3 實驗結果
本文在main函數中完成系統(tǒng)及GPIO口初始化、SysTick配置后,執(zhí)行以下操作:
while (1){
GPIO_ToggleBits(GPIOD, GPIO_Pin_1);
delay_us (1);
}
示波器抓取的波形如圖4所示。
圖4 SysTick實現(xiàn)1 μs的延時
由圖4可知,占空比為50.5%的PWM波,正脈沖寬度為0.99 μs,負脈沖寬度為0.97 μs,誤差為3%,延時精度遠高于遞減方式實現(xiàn)的延時,適用于對延時精度要求較高的場合,且此方法與遞減方法相比,不需要預先計算指令執(zhí)行所需時間,也無需多次計算得出需遞減的數值。
[1] 廖義奎.Cortex-M3之STM32嵌入式系統(tǒng)設計[M].北京:中國電力出版社,2012.
[2] 丁紅,王懷德.基于Cortex-M3為內核的開發(fā)板設計與制作[J].現(xiàn)代電子技術,2012,35(18):19-21.
[3] YIU Joseph.Cortex-M3權威指南[M].宋巖,譯.北京:北京航空航天大學出版社,2009.
[4] ST.RM0033:STM32F205xx,STM32F207xx,STM32F215xx and STM32F217xx advanced ARM-based 32-bit MCUs[EB/OL].[2017-04].http://www.st.com/content/ccc/resource/technical/document/reference_manual/51/f7/f3/06/cd/b6/46/ec/CD00225773.pdf/files/CD00225773.pdf/jcr:content/translations/en.CD00225773.pdf.
[5] 趙一夔.基于ARM Cortex-M3的嵌入式系統(tǒng)設計與實現(xiàn)[D].西安:西安電子科技大學,2010.
[6] Son S,Baek Y.Design and Implementation of Real-Time Vehicular Camera for Driver Assistance and Traffic Congestion Estimation[J].Sensors,2015,15(8):20-31.
[7] 王永虹,徐煒,郝立平.STM32系列ARM Cortex-M3微控制器原理與實踐[M].北京:北京航空航天大學出版社,2008.
[8] 李曉丹.基于STM32的物聯(lián)網嵌入式網關的設計[J].計算機工程與應用,2015,51(4):61-65.
[9] 張從鵬,趙康康.基于STM32的串口服務器系統(tǒng)開發(fā)[J].儀表技術與傳感器,2016(1):73-75.
[10] 趙祥,周建斌,周靖,等.基于Cortex-M3處理器的時間交替采樣系統(tǒng)的設計[J].儀表技術與傳感器,2015(12):100-102.
[11] 楊振江.基于STM32 ARM處理器的編程技術[M].西安:西安電子科技大學出版社,2016.
[12] 丁力,宋志平,徐萌萌,等.基于STM32的嵌入式測控系統(tǒng)設計[J].中南大學學報:自然科學版,2013(S1):260-265.
陶靜(高級工程師),主要從事電力系統(tǒng)通信技術的研究。
Precise Delay Method Using SysTick Interrupt
Tao Jing
(Global Energy Interconnection Research Institute,Nanjing 210003,China)
The system uses STM32 MCU as the processor,which often uses a decreasing function to generate delay,but this method is only suitable for generating a general delay and not suitable for precise delay.In the paper,a method to realize precise delay by using SysTick interrupt is introduced.This method can greatly improve the precision of delay.Through the experiment,the SysTick interrupt mode can reduce the deviation of 1 μs delay from 26% to 3%.
STM32;delay;SysTick
* 國家電網公司科技項目“面向電力通信多域交互的軟件定義光網絡關鍵技術研究”[SGRIXTKJ[2016]500號]。
TP311
A
?士然
2017-04-12)