0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

定时器使用小技巧

CHANBAEK 来源:硬件工程师技术干货 作者:硬件工程师技术干 2023-05-25 17:19 次阅读

介绍一个定时器的使用小技巧,今天写代码需要用到一个功能,实时测量程序运行时间,要求测量时间精度要高。

精度高就想到了硬件定时器,但是整个系统比较复杂,硬件定时器都被占用了,想了想只能和某项功能共用一个定时器了。系统中使用了一个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

    浏览量

    41480
  • 定时器
    +关注

    关注

    23

    文章

    3247

    浏览量

    114747
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62583
  • 代码
    +关注

    关注

    30

    文章

    4782

    浏览量

    68546
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    13079
收藏 人收藏

    评论

    相关推荐

    每一个定时器使用的中断都不一样吗?还是

    每一个定时器使用的中断都不一样?还是每一个中断使用的定时器不一样?究竟该怎么理解?
    发表于 10-18 20:44

    【安富莱】【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 3962次阅读
    如何利用单片机看门狗<b class='flag-5'>定时器使</b>led闪烁

    WinCC中定时器使用方法介绍

    WinCC中定时器使用方法介绍说明。
    发表于 04-22 14:50 8次下载

    ESP-32开发踩坑历程(三)ESP-IDF 定时器使

    ESP-32开发踩坑历程(三)ESP-IDF 定时器使用前言一、开发基础二、定时器使用1.官方描述2.读入数据总结ESP-32开发踩坑历程(三)ESP-IDF 定时器使用)前言设计ESP32的乐鑫
    发表于 12-08 12:06 13次下载
    ESP-32开发踩坑历程(三)ESP-IDF <b class='flag-5'>定时器使</b>用

    CKS32F4xx系列产品的定时器使用-基本特征和定时操作

    这一课我们将介绍CKS32F4XX系列产品的定时器使用,CKS32F4XX的定时器功能十分强大,包含2个高级控制定时器,8个普通定时器,2个基础定时
    的头像 发表于 05-19 09:18 900次阅读
    CKS32F4xx系列产品的<b class='flag-5'>定时器使</b>用-基本特征和<b class='flag-5'>定时</b>操作

    Linux驱动定时器使用示例

    定时器使用示例 使用步骤: 1、调用 init_timer 初始化一个定时器,给 struct timer_list 各成员赋值。 2、调用 add_timer 将定时器添加到内核定时器
    的头像 发表于 10-04 15:47 678次阅读