介紹一個定時器的使用小技巧,今天寫代碼需要用到一個功能,實時測量程序運行時間,要求測量時間精度要高。
精度高就想到了硬件定時器,但是整個系統(tǒng)比較復雜,硬件定時器都被占用了,想了想只能和某項功能共用一個定時器了。系統(tǒng)中使用了一個systick定時器,systick定時器是一個自動裝載遞減定時器,即,計數(shù)器從設定值開始遞減,減到零時觸發(fā)systick中斷,然后計數(shù)器自動裝載初值開始下一個計數(shù)周期。這里配置為1ms產(chǎn)生一次中斷,中斷內(nèi)有一個全局變量加1,如果直接用這個變量計算時間,精度±1ms,太差了。于是乎又寫了倆函數(shù),可以實現(xiàn)us級別測量,后面一一介紹。
void SysTick_Handler(void)
{
g_dwSysTickCnt++;//ms中斷,精度只有±1ms
}
函數(shù)1:測量開始函數(shù):
//測量開始函數(shù)
void drvMeasureUsStart(void)
{
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關(guān)閉定時器
g_dwOldTime = SysTick->VAL; //記錄當前計數(shù)值
g_dwStartTimeMs = g_dwSysTickCnt; //獲取當前ms數(shù)
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能定時器
g_dwReload = SysTick->LOAD; //獲取重載值
}
函數(shù)2:測量結(jié)束函數(shù):
DWORD drvMeasureUsStop(void)
{
DWORD dwNowTime,dwpRunTimeUs;
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關(guān)閉定時器
dwNowTime = SysTick->VAL;
g_dwStartTimeMs = g_dwSysTickCnt - g_dwStartTimeMs; //獲取ms數(shù)差值
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能定時器
if(g_dwStartTimeMs > 0u)
{
g_dwStartTimeMs--;
dwpRunTimeUs = g_dwReload - dwNowTime + g_dwOldTime;
}
else
{
dwpRunTimeUs = g_dwOldTime - dwNowTime;
}
g_dwStartTimeMs *= 1000u; //換算為us
dwpRunTimeUs = dwpRunTimeUs/(g_dwSysTickClockMhz); //換算為us
dwpRunTimeUs += g_dwStartTimeMs;
return dwpRunTimeUs;
}
使用方法:
//測量usercode()函數(shù)運行時間
{
DWORD dwTime;
...
...
drvMeasureUsStart();
usercode();
dwTime = drvMeasureUsStop();
...
...
}
-
中斷
+關(guān)注
關(guān)注
5文章
911瀏覽量
43328 -
定時器
+關(guān)注
關(guān)注
23文章
3347瀏覽量
120951 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4400瀏覽量
66361 -
代碼
+關(guān)注
關(guān)注
30文章
4922瀏覽量
72232 -
Systick
+關(guān)注
關(guān)注
0文章
66瀏覽量
13796
發(fā)布評論請先 登錄
【安富萊】【STemWin教程】第36章 窗口管理器之定時器使用
第36章 窗口管理器之定時器使用
【emWin實戰(zhàn)教程V2.0】第39章 窗口管理器之定時器使用
TIMER2定時器使用異常
如何去配置STM32的定時器使數(shù)碼管循環(huán)顯示從0~9的數(shù)字呢
如何利用定時器使L1每秒閃爍
介紹一下AT32的定時器使用
定時器、PWM、ICP范例(AVR 定時器使用范例)
如何利用單片機看門狗定時器使led閃爍

ESP-32開發(fā)踩坑歷程(三)ESP-IDF 定時器使用

CKS32F4xx系列產(chǎn)品的定時器使用-基本特征和定時操作

Linux驅(qū)動定時器使用示例
GD32G5x3系列高分辨率定時器使用指南

評論