0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

定時(shí)器使用小技巧

CHANBAEK ? 來源:硬件工程師技術(shù)干貨 ? 作者:硬件工程師技術(shù)干 ? 2023-05-25 17:19 ? 次閱讀

介紹一個(gè)定時(shí)器的使用小技巧,今天寫代碼需要用到一個(gè)功能,實(shí)時(shí)測量程序運(yùn)行時(shí)間,要求測量時(shí)間精度要高。

精度高就想到了硬件定時(shí)器,但是整個(gè)系統(tǒng)比較復(fù)雜,硬件定時(shí)器都被占用了,想了想只能和某項(xiàng)功能共用一個(gè)定時(shí)器了。系統(tǒng)中使用了一個(gè)systick定時(shí)器,systick定時(shí)器是一個(gè)自動裝載遞減定時(shí)器,即,計(jì)數(shù)器從設(shè)定值開始遞減,減到零時(shí)觸發(fā)systick中斷,然后計(jì)數(shù)器自動裝載初值開始下一個(gè)計(jì)數(shù)周期。這里配置為1ms產(chǎn)生一次中斷,中斷內(nèi)有一個(gè)全局變量加1,如果直接用這個(gè)變量計(jì)算時(shí)間,精度±1ms,太差了。于是乎又寫了倆函數(shù),可以實(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)閉定時(shí)器
    g_dwOldTime = SysTick->VAL;                     //記錄當(dāng)前計(jì)數(shù)值
    g_dwStartTimeMs = g_dwSysTickCnt;               //獲取當(dāng)前ms數(shù)
    SysTick->CTRL  |= SysTick_CTRL_ENABLE_Msk;      //使能定時(shí)器
    g_dwReload = SysTick->LOAD;                     //獲取重載值
}

函數(shù)2:測量結(jié)束函數(shù):

DWORD drvMeasureUsStop(void)
{
    DWORD dwNowTime,dwpRunTimeUs;

    SysTick->CTRL  &= ~SysTick_CTRL_ENABLE_Msk;         //關(guān)閉定時(shí)器
    dwNowTime = SysTick->VAL;
    g_dwStartTimeMs = g_dwSysTickCnt - g_dwStartTimeMs; //獲取ms數(shù)差值
    SysTick->CTRL  |= SysTick_CTRL_ENABLE_Msk;          //使能定時(shí)器

    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ù)運(yùn)行時(shí)間
{
    DWORD dwTime;
    ...
    ...
    drvMeasureUsStart();
    usercode();
    dwTime = drvMeasureUsStop();
    ...
    ...
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    889

    瀏覽量

    41220
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3218

    瀏覽量

    113681
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61969
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67767
  • Systick
    +關(guān)注

    關(guān)注

    0

    文章

    62

    瀏覽量

    13009
收藏 人收藏

    評論

    相關(guān)推薦

    每一個(gè)定時(shí)器使用的中斷都不一樣嗎?還是

    每一個(gè)定時(shí)器使用的中斷都不一樣?還是每一個(gè)中斷使用的定時(shí)器不一樣?究竟該怎么理解?
    發(fā)表于 10-18 20:44

    【安富萊】【STemWin教程】第36章 窗口管理器之定時(shí)器使

    `第36章 窗口管理器之定時(shí)器使用 本期教程跟大家講一下STemWin自帶的定時(shí)器使用方法,這個(gè)定時(shí)器使用起來非常簡單,而且很實(shí)用。在需要定時(shí)更新的時(shí)候可以用這個(gè)
    發(fā)表于 04-25 11:09

    CC2640的軟件定時(shí)器使用教程

    本帖最后由 冒汗的心情 于 2016-4-12 09:53 編輯 CC2640的軟件定時(shí)器使用教程轉(zhuǎn)載自:http://blog.csdn.net/haozi0_0/article
    發(fā)表于 04-11 15:53

    第36章 窗口管理器之定時(shí)器使

    轉(zhuǎn)stemwin教程本期教程跟大家講一下STemWin自帶的定時(shí)器使用方法,這個(gè)定時(shí)器使用起來非常簡單,而且很實(shí)用。在需要定時(shí)更新的時(shí)候可以用這個(gè)定時(shí)器。 36. 1
    發(fā)表于 10-16 10:51

    【emWin實(shí)戰(zhàn)教程V2.0】第39章 窗口管理器之定時(shí)器使

    轉(zhuǎn)最新版本教程本期教程為大家講解窗口管理器之定時(shí)器使用方法,這個(gè)定時(shí)器使用起來比較簡單,而且很實(shí)用,以后的項(xiàng)目工程中很多時(shí)候要用到,不過使用時(shí)有些小問題要特別注意,如果不注意的話,定時(shí)器將無法正確
    發(fā)表于 02-20 18:41

    TIMER2定時(shí)器使用異常

    定時(shí)器使用,參考stareware中的demo TIMER使用,具體實(shí)現(xiàn)代碼如下: // 配置 定時(shí)器 / 計(jì)數(shù)器 2 為 64 位模式 TimerConfigure(SOC_TMR_2_REGS
    發(fā)表于 09-27 08:32

    如何去配置STM32的定時(shí)器使數(shù)碼管循環(huán)顯示從0~9的數(shù)字呢

    怎樣在Keil for ARM V5中去編寫代碼呢?如何去配置STM32的定時(shí)器使數(shù)碼管循環(huán)顯示從0~9的數(shù)字呢?
    發(fā)表于 12-02 06:37

    如何利用定時(shí)器使L1每秒閃爍

    練習(xí):利用定時(shí)器使L1每秒閃爍(亮0.5秒滅0.5秒),L8亮五秒滅五秒。關(guān)閉蜂鳴器。#include "reg52.h"***it L1 = P0^0;***it L8
    發(fā)表于 01-12 07:22

    介紹一下AT32的定時(shí)器使

    **定時(shí)器入門指南——第1講**定時(shí)器基本上是所有嵌入式芯片都會具有的一個(gè)功能,不同的芯片在操作上也是大同小異,今天我們就來介紹一下AT32的定時(shí)器使用,以AT32403A為例。首先AT32403A
    發(fā)表于 01-17 08:56

    定時(shí)器、PWM、ICP范例(AVR 定時(shí)器使用范例)

    /***************************************************      AVR 定時(shí)器使用范例 
    發(fā)表于 11-01 01:23 ?77次下載

    如何利用單片機(jī)看門狗定時(shí)器使led閃爍

    看門狗是為了防止程序跑飛而設(shè)定的,但是由于看門狗是一個(gè)類似于定時(shí)器,因此可以把他當(dāng)作定時(shí)器來使用 示例代碼:用看門狗定時(shí)器使一個(gè)led閃爍 #include void main
    發(fā)表于 02-11 10:00 ?3833次閱讀
    如何利用單片機(jī)看門狗<b class='flag-5'>定時(shí)器使</b>led閃爍

    WinCC中定時(shí)器使用方法介紹

    WinCC中定時(shí)器使用方法介紹說明。
    發(fā)表于 04-22 14:50 ?8次下載

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

    ESP-32開發(fā)踩坑歷程(三)ESP-IDF 定時(shí)器使用前言一、開發(fā)基礎(chǔ)二、定時(shí)器使用1.官方描述2.讀入數(shù)據(jù)總結(jié)ESP-32開發(fā)踩坑歷程(三)ESP-IDF 定時(shí)器使用)前言設(shè)計(jì)ESP32的樂鑫
    發(fā)表于 12-08 12:06 ?13次下載
    ESP-32開發(fā)踩坑歷程(三)ESP-IDF <b class='flag-5'>定時(shí)器使</b>用

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

    這一課我們將介紹CKS32F4XX系列產(chǎn)品的定時(shí)器使用,CKS32F4XX的定時(shí)器功能十分強(qiáng)大,包含2個(gè)高級控制定時(shí)器,8個(gè)普通定時(shí)器,2個(gè)基礎(chǔ)定時(shí)
    的頭像 發(fā)表于 05-19 09:18 ?777次閱讀
    CKS32F4xx系列產(chǎn)品的<b class='flag-5'>定時(shí)器使</b>用-基本特征和<b class='flag-5'>定時(shí)</b>操作

    Linux驅(qū)動定時(shí)器使用示例

    定時(shí)器使用示例 使用步驟: 1、調(diào)用 init_timer 初始化一個(gè)定時(shí)器,給 struct timer_list 各成員賦值。 2、調(diào)用 add_timer 將定時(shí)器添加到內(nèi)核定時(shí)器
    的頭像 發(fā)表于 10-04 15:47 ?569次閱讀