介紹一個定時器的使用小技巧,今天寫代碼需要用到一個功能,實時測量程序運行時間,要求測量時間精度要高。
精度高就想到了硬件定時器,但是整個系統比較復雜,硬件定時器都被占用了,想了想只能和某項功能共用一個定時器了。系統中使用了一個systick定時器,systick定時器是一個自動裝載遞減定時器,即,計數器從設定值開始遞減,減到零時觸發systick中斷,然后計數器自動裝載初值開始下一個計數周期。這里配置為1ms產生一次中斷,中斷內有一個全局變量加1,如果直接用這個變量計算時間,精度±1ms,太差了。于是乎又寫了倆函數,可以實現us級別測量,后面一一介紹。
void SysTick_Handler(void)
{
g_dwSysTickCnt++;//ms中斷,精度只有±1ms
}
函數1:測量開始函數:
//測量開始函數
void drvMeasureUsStart(void)
{
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關閉定時器
g_dwOldTime = SysTick->VAL; //記錄當前計數值
g_dwStartTimeMs = g_dwSysTickCnt; //獲取當前ms數
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能定時器
g_dwReload = SysTick->LOAD; //獲取重載值
}
函數2:測量結束函數:
DWORD drvMeasureUsStop(void)
{
DWORD dwNowTime,dwpRunTimeUs;
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關閉定時器
dwNowTime = SysTick->VAL;
g_dwStartTimeMs = g_dwSysTickCnt - g_dwStartTimeMs; //獲取ms數差值
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()函數運行時間
{
DWORD dwTime;
...
...
drvMeasureUsStart();
usercode();
dwTime = drvMeasureUsStop();
...
...
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
中斷
+關注
關注
5文章
898瀏覽量
41471 -
定時器
+關注
關注
23文章
3246瀏覽量
114721 -
函數
+關注
關注
3文章
4327瀏覽量
62573 -
代碼
+關注
關注
30文章
4779瀏覽量
68525 -
Systick
+關注
關注
0文章
62瀏覽量
13073
發布評論請先 登錄
相關推薦
【安富萊】【STemWin教程】第36章 窗口管理器之定時器使用
`第36章 窗口管理器之定時器使用 本期教程跟大家講一下STemWin自帶的定時器使用方法,這個定時器使用起來非常簡單,而且很實用。在需要定時更新的時候可以用這個
發表于 04-25 11:09
CC2640的軟件定時器使用教程
本帖最后由 冒汗的心情 于 2016-4-12 09:53 編輯
CC2640的軟件定時器使用教程轉載自:http://blog.csdn.net/haozi0_0/article
發表于 04-11 15:53
第36章 窗口管理器之定時器使用
轉stemwin教程本期教程跟大家講一下STemWin自帶的定時器使用方法,這個定時器使用起來非常簡單,而且很實用。在需要定時更新的時候可以用這個定時器。 36. 1
發表于 10-16 10:51
【emWin實戰教程V2.0】第39章 窗口管理器之定時器使用
轉最新版本教程本期教程為大家講解窗口管理器之定時器使用方法,這個定時器使用起來比較簡單,而且很實用,以后的項目工程中很多時候要用到,不過使用時有些小問題要特別注意,如果不注意的話,定時器將無法正確
發表于 02-20 18:41
TIMER2定時器使用異常
定時器使用,參考stareware中的demo TIMER使用,具體實現代碼如下: // 配置 定時器 / 計數器 2 為 64 位模式 TimerConfigure(SOC_TMR_2_REGS
發表于 09-27 08:32
如何去配置STM32的定時器使數碼管循環顯示從0~9的數字呢
怎樣在Keil for ARM V5中去編寫代碼呢?如何去配置STM32的定時器使數碼管循環顯示從0~9的數字呢?
發表于 12-02 06:37
如何利用定時器使L1每秒閃爍
練習:利用定時器使L1每秒閃爍(亮0.5秒滅0.5秒),L8亮五秒滅五秒。關閉蜂鳴器。#include "reg52.h"***it L1 = P0^0;***it L8
發表于 01-12 07:22
介紹一下AT32的定時器使用
**定時器入門指南——第1講**定時器基本上是所有嵌入式芯片都會具有的一個功能,不同的芯片在操作上也是大同小異,今天我們就來介紹一下AT32的定時器使用,以AT32403A為例。首先AT32403A
發表于 01-17 08:56
定時器、PWM、ICP范例(AVR 定時器使用范例)
/*************************************************** AVR 定時器使用范例 
發表于 11-01 01:23
?77次下載
如何利用單片機看門狗定時器使led閃爍
看門狗是為了防止程序跑飛而設定的,但是由于看門狗是一個類似于定時器,因此可以把他當作定時器來使用
示例代碼:用看門狗定時器使一個led閃爍
#include
void main
發表于 02-11 10:00
?3951次閱讀
ESP-32開發踩坑歷程(三)ESP-IDF 定時器使用
ESP-32開發踩坑歷程(三)ESP-IDF 定時器使用前言一、開發基礎二、定時器使用1.官方描述2.讀入數據總結ESP-32開發踩坑歷程(三)ESP-IDF 定時器使用)前言設計ESP32的樂鑫
發表于 12-08 12:06
?13次下載
CKS32F4xx系列產品的定時器使用-基本特征和定時操作
這一課我們將介紹CKS32F4XX系列產品的定時器使用,CKS32F4XX的定時器功能十分強大,包含2個高級控制定時器,8個普通定時器,2個基礎定時
Linux驅動定時器使用示例
定時器使用示例 使用步驟: 1、調用 init_timer 初始化一個定時器,給 struct timer_list 各成員賦值。 2、調用 add_timer 將定時器添加到內核定時器
評論