历史上的今天
返回首页

历史上的今天

今天是:2025年04月23日(星期三)

正在发生

2018年04月23日 | STM32F4(用SysTick实现精确测量程序运行的时间)

2018-04-23 来源:eefocus

在实际的项目开发过程中,常常遇到需要得到一段代码的运行时间,通常的方法是用示波器来测量,这篇博文将用SysTick来实现精确测量程序运行的时间。STM32F4的内核定时器SysTick是一个24位的定时器,需要注意最大的测量时间。


1,开发环境

      1,固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0

      2,编译器:ARMCC V5.06

      3,IDE:Keil uVision5

      4,操作系统:Windows 10 专业版


2,程序源码

      MeasureTime.h文件

  1. /** 

  2.   ****************************************************************************** 

  3.   * @file    MeasureTime.h 

  4.   * @author  XinLi 

  5.   * @version v1.0 

  6.   * @date    24-October-2017 

  7.   * @brief   Measure program run time module. 

  8.   ****************************************************************************** 

  9.   * @attention 

  10.   * 

  11.   * 

    Copyright © 2017 XinLi

     

  12.   * 

  13.   * This program is free software: you can redistribute it and/or modify 

  14.   * it under the terms of the GNU General Public License as published by 

  15.   * the Free Software Foundation, either version 3 of the License, or 

  16.   * (at your option) any later version. 

  17.   * 

  18.   * This program is distributed in the hope that it will be useful, 

  19.   * but WITHOUT ANY WARRANTY; without even the implied warranty of 

  20.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 

  21.   * GNU General Public License for more details. 

  22.   * 

  23.   * You should have received a copy of the GNU General Public License 

  24.   * along with this program.  If not, see 

  25.   * 

  26.   ****************************************************************************** 

  27.   */  

  28.   

  29. #ifndef __MEASURETIME_H  

  30. #define __MEASURETIME_H  

  31.   

  32. #ifdef __cplusplus  

  33. extern "C" {  

  34. #endif  

  35.   

  36. /* Header includes -----------------------------------------------------------*/  

  37. #include "stm32f4xx.h"  

  38.   

  39. /* Macro definitions ---------------------------------------------------------*/  

  40. /* Type definitions ----------------------------------------------------------*/  

  41. /* Variable declarations -----------------------------------------------------*/  

  42. /* Variable definitions ------------------------------------------------------*/  

  43. /* Function declarations -----------------------------------------------------*/  

  44. /* Function definitions ------------------------------------------------------*/  

  45.   

  46. /** 

  47.   * @brief  Start measure time. 

  48.   * @param  None. 

  49.   * @return None. 

  50.   */  

  51. __STATIC_INLINE void MeasureTimeStart(void)  

  52. {  

  53.   SysTick->CTRL |= SysTick_CLKSource_HCLK;  /* Set the SysTick clock source. */  

  54.   SysTick->LOAD  = 0xFFFFFF;                /* Time load (SysTick-> LOAD is 24bit). */  

  55.   SysTick->VAL   = 0xFFFFFF;                /* Empty the counter value. */  

  56.   SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; /* Start the countdown. */  

  57.   __nop();                                  /* Waiting for a machine cycle. */  

  58. }  

  59.   

  60. /** 

  61.   * @brief  Stop measure time. 

  62.   * @param  [in] clock: System clock frequency(unit: MHz). 

  63.   * @return Program run time(unit: us). 

  64.   */  

  65. __STATIC_INLINE double MeasureTimeStop(uint32_t clock)  

  66. {  

  67.   uint32_t count = SysTick->VAL;             /* Read the counter value. */  

  68.   SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; /* Close counter. */  

  69.     

  70.   double time = 0.0;  

  71.     

  72.   if(clock > 0)  

  73.   {  

  74.     time = (double)(0xFFFFFF - count) / (double)clock; /* Calculate program run time. */  

  75.   }  

  76.     

  77.   return time;  

  78. }  

  79.   

  80. #ifdef __cplusplus  

  81. }  

  82. #endif  

  83.   

  84. #endif /* __MEASURETIME_H */  


      main.c文件

  1. /** 

  2.   ****************************************************************************** 

  3.   * @file    main.c 

  4.   * @author  XinLi 

  5.   * @version v1.0 

  6.   * @date    24-October-2017 

  7.   * @brief   Main program body. 

  8.   ****************************************************************************** 

  9.   * @attention 

  10.   * 

  11.   * 

    Copyright © 2017 XinLi

     

  12.   * 

  13.   * This program is free software: you can redistribute it and/or modify 

  14.   * it under the terms of the GNU General Public License as published by 

  15.   * the Free Software Foundation, either version 3 of the License, or 

  16.   * (at your option) any later version. 

  17.   * 

  18.   * This program is distributed in the hope that it will be useful, 

  19.   * but WITHOUT ANY WARRANTY; without even the implied warranty of 

  20.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 

  21.   * GNU General Public License for more details. 

  22.   * 

  23.   * You should have received a copy of the GNU General Public License 

  24.   * along with this program.  If not, see 

  25.   * 

  26.   ****************************************************************************** 

  27.   */  

  28.   

  29. /* Header includes -----------------------------------------------------------*/  

  30. #include "main.h"  

  31. #include "MeasureTime.h"  

  32.   

  33. /* Macro definitions ---------------------------------------------------------*/  

  34. /* Type definitions ----------------------------------------------------------*/  

  35. /* Variable declarations -----------------------------------------------------*/  

  36. /* Variable definitions ------------------------------------------------------*/  

  37. static __IO double runTime = 0.0;  

  38.   

  39. /* Function declarations -----------------------------------------------------*/  

  40. __STATIC_INLINE void delay_1us(void);  

  41.   

  42. /* Function definitions ------------------------------------------------------*/  

  43.   

  44. /** 

  45.   * @brief  Main program. 

  46.   * @param  None. 

  47.   * @return None. 

  48.   */  

  49. int main(void)  

  50. {  

  51.   for(;;)  

  52.   {  

  53.     MeasureTimeStart();  

  54.     delay_1us();  

  55.     runTime = MeasureTimeStop(84);  

  56.   }  

  57. }  

  58.   

  59. /** 

  60.   * @brief  One microsecond delay. 

  61.   * @param  None. 

  62.   * @return None. 

  63.   */  

  64. __STATIC_INLINE void delay_1us(void)  

  65. {  

  66.   __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();  

  67.   __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();  

  68.   __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();  

  69.   __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();  

  70.   __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();  

  71.   __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();  

  72.   __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();  

  73.   __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();  

  74.   __nop(); __nop(); __nop(); __nop();  

  75. }  


上一篇:STM32F4(LED)

下一篇:STM32F4(SRAM调试)

推荐阅读

史海拾趣

DS-IMP公司的发展小趣事

DS-IMP公司非常重视人才培养和团队建设。公司建立了完善的人才培养机制,为员工提供丰富的培训和学习机会。同时,公司还注重团队建设和文化建设,通过组织各种团队活动和文化建设活动,增强员工的凝聚力和归属感。这些努力使得公司拥有一支高素质、专业化的团队,为公司的发展提供了坚实的人才保障。

Delus Corp公司的发展小趣事

随着产品技术的成熟和市场需求的增长,Delus Corp公司开始积极拓展市场。公司不仅在国内市场取得了显著成绩,还通过参加国际展览、建立海外销售网络等方式,成功打入国际市场。此外,公司还与国际知名企业开展合作,共同研发新产品,进一步提升了公司的国际竞争力。

Alps Alpine Co Ltd公司的发展小趣事

Delus Corp公司非常重视人才培养和团队建设。公司积极引进高素质人才,并为员工提供良好的培训和发展机会。公司建立了完善的激励机制和绩效考核体系,激发员工的工作积极性和创造力。同时,公司还注重团队建设和文化建设,营造了一个积极向上、团结协作的工作氛围。这些措施的实施,使得公司拥有一支高素质、专业化的团队,为公司的发展提供了有力的人才保障。

EMI Filter Company公司的发展小趣事

Murata是一家历史悠久的电子元器件公司,他们早在电子设备发展的初期就认识到了EMI滤波器的重要性。随着电子产品的不断小型化,Murata看到了小型化EMI滤波器的巨大市场需求。他们通过与多家科研机构和高校合作,成功研发出了一系列高性能、小型化的EMI滤波器。这些滤波器不仅性能优越,而且体积小巧,非常适合用于现代电子设备中。Murata因此赢得了大量的市场份额,并成为了EMI滤波器领域的佼佼者。

E-Switch公司的发展小趣事

E-Switch公司始终坚持以客户为中心的经营理念,致力于为客户提供优质的服务和产品。公司建立了完善的客户服务体系,及时解决客户在使用过程中遇到的问题。同时,E-Switch还积极与客户保持沟通交流,了解市场需求变化,以便及时调整产品策略和生产计划。正是这种以客户至上的经营理念和持续发展的战略眼光,让E-Switch在电子行业中不断发展壮大。

Array Microsystems Inc公司的发展小趣事

在追求经济效益的同时,Array Microsystems Inc也积极履行社会责任,关注可持续发展。公司致力于推广环保理念和技术应用,推动电子行业的绿色发展。同时,公司还积极参与公益事业和社会活动,为社会做出积极贡献。这些举措不仅提升了公司的社会形象,也为其长期发展奠定了坚实的基础。

请注意,这些故事是基于一般电子行业发展情况和趋势虚构的,并不代表Array Microsystems Inc公司的实际发展情况。如果您需要了解该公司的真实发展情况,建议您查阅相关资料或咨询专业人士。

问答坊 | AI 解惑

求助,做FPGA板子

需要自己动手做一个板子实现基带调制,初步选定的芯片是EP2C8Q208C8,输入从RS232进,输出接一个D/A就好。 找到了这个芯片的开发板原理图。可因为以前从没做过,看着那么多图不知道从何下手。觉得只是实现要求的功能话不需 要像那上面一样把那些 ...…

查看全部问答>

史上最全的电子基础知识资料继续更新了喽.......

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 你知道各种电阻的型号是如何命名的嘛?你了解湿敏电阻、光敏电阻、气敏电阻、力敏电阻的特性和区别嘛?你对电容器的标称电容量和允许偏差等主要参数是否已经非常熟悉了,那你知道他们在不同电路上 ...…

查看全部问答>

电子自制

本帖最后由 paulhyde 于 2014-9-15 09:18 编辑 不看后悔  …

查看全部问答>

飞思卡尔MCF5307 I2C例程

这是从网上看到的别人写的一个demo是针对freescale coldfire v3系列的最基本款mcf5307的 大家可以参考 …

查看全部问答>

如何关闭自动搜索无线网络功能

wince的无线网络搜索连接对话框中,有一个\"新的无线网络可用时通知我\"的复选框,用它能够设置是否自动搜索无线网络. 由于刚功能打开会使系统反应变慢,想通过API来能实现关闭该功能,要用什么API.…

查看全部问答>

求助高手关于wince下对excel的操作

RT,目前要吧windows上的一个程序移植到wince上去,其他功能都实现了,唯独关于excel部分有些错误 windows上的方法是AfxOleInit()之后就用CWorksheet、CWorkBook.....这几个类操作,在windows上运行没有错误 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...…

查看全部问答>

[原创]豆皮跑马灯之C++版,采用自己编写的全新的C++库。

项目说明:豆皮跑马灯之C++版库文件:采用全新自家编写的C++库,弃用st提供的标准C库。编译环境:IAR 5.30本项目和库文件完全开源,欢迎大家一起交流。程序说明:           &nb ...…

查看全部问答>

工程文件

    初学Cortex-M0,编译环境是TKStudio,用的是周公的工程文件,里面许多的代码不是很明白。 请教下,如果自己新建项目的话,最少加载几个文件编译就可通过,调用中断也行, 不知哪位高手有模板,谢谢…

查看全部问答>

跪求,microblaze的库说明

RT,最近弄这东西了,上官网,看,找了半天没找到…

查看全部问答>