ucos-III中,利用stm32内核的一个计时时钟来测量程序运行时间

姓名:刘伟 学号:17103223402

【嵌牛导读】

本文介绍了测量程序运行时间的一种方法

【嵌牛鼻子】程序运行时间的测量

【嵌牛提问】利用该原理还能进行什么工作?

【嵌牛正文】

ucos-iii 源码中,有一个功能是测量关中断时间的功能,使用的是STM32的时间戳,即记录程序运行的某个时刻,如果记录下程序前后的两个时刻点,即可以算出这段程序的运行时间。

ucos 时间戳使用的是 Cortex-M内核中的一个时钟计数器来实现的,内核时钟跳动一次,该计数器就加1,精度非常高,决定于内核的频率是多少,如果是F103系列,内核时钟是72M,那精度就是1/72M = 14ns,而程序的运行时间都是微秒级别的,所以14ns的精度是远远够的。

但是有关内核寄存器的描述的资料非常少,还好在arm的官网找到一个,里面有这些内核寄存器的详细描述,其中时间戳相关的寄存器在第10章和11章有详细的描述。

下面的代码是我从ucos-iii里面抽离出来的ucos 时间戳相关的功能代码,测试完全可用,这部分代码可以用来测量程序的运行时间,也可以用来实现us级别的延时。

这个文件是Cortex-M3内核的技术参考手册,里面有内核寄存器的全部描述。

/*

************************************************************************************************************************

*                                            时间戳相关寄存器定义

************************************************************************************************************************

*/

/*

在Cortex-M3里面有一个外设叫DWT(Data Watchpoint and Trace),该外设有一个32位的寄存器叫CYCCNT,它是一个向上的

计数器,记录的是内核时钟运行的个数,最长能记录的时间为:60s=2的32次方/72000000(假设内核频率为72M,内核跳一次的时间大概为1/72M=14ns)

当CYCCNT溢出之后,会清0重新开始向上计数。

使能CYCCNT计数的操作步骤:

1、先使能DWT外设,这个由另外内核调试寄存器DEMCR的位24控制,写1使能

2、使能CYCCNT寄存器之前,先清0

3、使能CYCCNT寄存器,这个由DWT_CTRL(代码上宏定义为DWT_CR)的位0控制,写1使能

*/

#define  DWT_CR      *(uint32_t *)0xE0001000

#define  DWT_CYCCNT  *(uint32_t *)0xE0001004

#define  DEM_CR      *(uint32_t *)0xE000EDFC

#define  DEM_CR_TRCENA                  (1 << 24)

#define  DWT_CR_CYCCNTENA                (1 <<  0)

/* 初始化时间戳 */

void CPU_TS_TmrInit(void)

{

    /* 使能DWT外设 */

        DEM_CR |= (uint32_t)DEM_CR_TRCENA;               

        /* DWT CYCCNT寄存器计数清0 */

        DWT_CYCCNT = (uint32_t)0u;

       

        /* 使能Cortex-M3 DWT CYCCNT寄存器 */

    DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;

}

uint32_t OS_TS_GET(void)

{       

        return ((uint32_t)DWT_CYCCNT);

}

/* CPU相关初始化 */

void  CPU_Init (void)

{

        /* 初始化时间戳 */

        CPU_TS_TmrInit();

}

 

这里面使用的是Cortex-M 内核里面的一个 内核时钟计数器,跟使用TIM,SysTick这些外设不一样,这个内核时钟计数器精度更高,它存在于内核的DWT这个外设中。

DWT的缩写是:Data Watchpoint and Trace,是不是学了这么久STM32,这个外设根本没有听过?

要想使用DWT里面的CYCCNT,还要再使用一个DEMCR这个内核寄存器,DEM是不是也没听说过?

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 简介 STM32F10x标准外设库是一个完整的包,包含了所有标准外设的设备驱动,适用于STM32价值系列(高、...
    hackvilin阅读 6,840评论 0 13
  • 1 综述 1.1 时钟源 在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL。 HSI...
    hackvilin阅读 3,540评论 0 6
  • ​​​本文主要介绍嵌入式系统的一些基础知识,希望对各位有帮助。 嵌入式系统基础 1、嵌入式系统的定义 (1)定义:...
    OpenJetson阅读 3,352评论 0 13
  • 最近经常在广播中和评论中,听到、看到关于“毁三观或三观不正”这样的描述。多次的引用三观的概念,引发了我的思考,三观...
    志向书院阅读 1,337评论 0 3
  • 我处于最混沌的日子 白天与黑夜不分 午餐和晚餐不分 就这样度过了七月和八月 糟糕的生活 蓬头垢面 陪伴我的只有不眠...
    阿琳琅阅读 138评论 0 0