介绍一个定时器的使用小技巧,今天写代码需要用到一个功能,实时测量程序运行时间,要求测量时间精度要高。
精度高就想到了硬件定时器,但是整个系统比较复杂,硬件定时器都被占用了,想了想只能和某项功能共用一个定时器了。系统中使用了一个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浏览量
41503 -
定时器
+关注
关注
23文章
3248浏览量
114826 -
函数
+关注
关注
3文章
4331浏览量
62622 -
代码
+关注
关注
30文章
4788浏览量
68619 -
Systick
+关注
关注
0文章
62浏览量
13095
发布评论请先 登录
相关推荐
【安富莱】【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
•3975次阅读
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 将定时器添加到内核定时器
评论