介紹一個定時器的使用小技巧,今天寫代碼需要用到一個功能,實時測量程序運行時間,要求測量時間精度要高。
精度高就想到了硬件定時器,但是整個系統(tǒng)比較復(fù)雜,硬件定時器都被占用了,想了想只能和某項功能共用一個定時器了。系統(tǒng)中使用了一個systick定時器,systick定時器是一個自動裝載遞減定時器,即,計數(shù)器從設(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; //記錄當(dāng)前計數(shù)值
g_dwStartTimeMs = g_dwSysTickCnt; //獲取當(dāng)前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文章
900瀏覽量
41649 -
定時器
+關(guān)注
關(guān)注
23文章
3255瀏覽量
115176 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4345瀏覽量
62874 -
代碼
+關(guān)注
關(guān)注
30文章
4823瀏覽量
68897 -
Systick
+關(guān)注
關(guān)注
0文章
62瀏覽量
13126
發(fā)布評論請先 登錄
相關(guān)推薦
評論