你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeH7 里面有没有 测量运行时间的 例程?

[复制链接]
walker2012 提问时间:2019-6-17 10:20 /
测量某段代码的运行时间,感觉比较有用,特别对那些需要极度压榨硬件性能的应用。   STM32CubeH7 有没有这种例程?
收藏 评论5 发布时间:2019-6-17 10:20

举报

5个回答
maxtch 回答时间:2019-6-17 18:35:33
这个需要你自己开发了。你可以考虑用一个硬件定时器来干这个活(可以是 SysTick 也可以是外设定时器)。另外 CPU 有一个执行过多少条指令的计数器,这个也可以用。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

hua543 回答时间:2019-6-18 08:26:14
来学习学习

评分

参与人数 1ST金币 -1 收起 理由
STMCU -1 不要在求助帖下回复无关话题

查看全部评分

慎微 回答时间:2019-6-18 09:12:33
MDK 工具就有这功能啊,右下角 有个 记时器 t1,可以看代码运行时间,不过,须要在option设置 debug为 trace enable及设置正确的 core clock.

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

byronsong 回答时间:2019-6-18 09:20:55
参照这个按H7属性的改改。
dwtdelay.zip (1.14 KB, 下载次数: 3)

评分

参与人数 1蝴蝶豆 +4 收起 理由
STMCU + 4

查看全部评分

byronsong 回答时间:2019-6-18 09:25:18
一段测试代码
  1. #include "DWTDelay.h"
  2. //#include "SEGGER_RTT.h"
  3. // 0xE000EDFC DEMCR RW Debug Exception and Monitor Control Register.
  4. #define DEMCR           ( *(unsigned int *)0xE000EDFC )
  5. #define TRCENA          ( 0x01 << 24) // DEMCR的DWT使能位

  6. // 0xE0001000 DWT_CTRL RW The Debug Watchpoint and Trace (DWT) unit
  7. #define DWT_CTRL        ( *(unsigned int *)0xE0001000 )
  8. #define CYCCNTENA       ( 0x01 << 0 ) // DWT的SYCCNT使能位
  9. // 0xE0001004 DWT_CYCCNT RW Cycle Count register,
  10. #define DWT_CYCCNT      ( *(unsigned int *)0xE0001004) // 显示或设置处理器的周期计数值

  11. //#define DWT_DELAY_mS(mSec)    DWT_DELAY_uS(mSec*1000)

  12. static int SYSCLK = 0;

  13. void DWT_INIT(int sys_clk)
  14. {
  15.   DEMCR |= TRCENA;
  16.   DWT_CTRL |= CYCCNTENA;
  17.   
  18.   SYSCLK = sys_clk; // 保存当前系统的时钟周期,eg. 72,000,000(72MHz).
  19. }

  20. // 微秒延时
  21. void DWT_DELAY_uS(int uSec)
  22. {
  23.   int ticks_start, ticks_end, ticks_delay;
  24.   
  25.   ticks_start = DWT_CYCCNT;
  26.   
  27.   if ( !SYSCLK )
  28.     DWT_INIT( MY_MCU_SYSCLK );
  29.   
  30.   ticks_delay = ( uSec * ( MY_MCU_SYSCLK / (1000*1000) ) ); // 将微秒数换算成滴答数         
  31.   
  32.   ticks_end = ticks_start + ticks_delay;
  33.   
  34.   if ( ticks_end > ticks_start )
  35.   {
  36.     while( DWT_CYCCNT < ticks_end );
  37.   }
  38.   else // 计数溢出,翻转
  39.   {
  40.     while( DWT_CYCCNT >= ticks_end ); // 翻转后的值不会比ticks_end小
  41.     while( DWT_CYCCNT < ticks_end );
  42.   }
  43. }
  44. void DWT_TIME_ES1(int start_or_stop,int* es)
  45. {
  46.   static int ticks_start;
  47.   if ( !SYSCLK )
  48.     DWT_INIT( MY_MCU_SYSCLK );
  49.   if(!start_or_stop)
  50.   {
  51.     ticks_start = DWT_CYCCNT;
  52.   }
  53.   else
  54.   {
  55.     int ticks_stop = DWT_CYCCNT;
  56.     *es = ((ticks_stop - ticks_start)*1000)/(MY_MCU_SYSCLK/1000/1000);
  57. //    PRINTF_DEBUG("es1 [%d.%dus]\r\n",*es/1000,*es%1000);
  58.   }
  59. }
  60. int DWT_TIME_ES2(int start_or_stop)
  61. {
  62.   static int ticks_start;
  63.   if ( !SYSCLK )
  64.     DWT_INIT( MY_MCU_SYSCLK );
  65.   if(!start_or_stop)
  66.   {
  67.     ticks_start = DWT_CYCCNT;
  68.     return ticks_start;
  69.   }
  70.   else
  71.   {
  72.     int ticks_stop = DWT_CYCCNT;
  73.     return ((ticks_stop - ticks_start)*1000)/(MY_MCU_SYSCLK/1000/1000);
  74. //    PRINTF_DEBUG("es1 [%d.%dus]\r\n",*es/1000,*es%1000);
  75.   }
  76. }
复制代码

  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3.   if(htim->Instance == TIM5)
  4.   {
  5.     int usetime;
  6.     DWT_TIME_ES1(0,0);
  7.     PRINTF_DEBUG("HAL_TIM_PeriodElapsedCallback TIM5 TICK[%8d]\r\n",HAL_GetTick());
  8.     DWT_TIME_ES1(1,&usetime);
  9.     DWT_TIME_ES2(0);
  10.     PRINTF_DEBUG("es1 [%d.%dus]\r\n",usetime/1000,usetime%1000);
  11.     usetime=DWT_TIME_ES2(1);
  12.     PRINTF_DEBUG("es2 [%d.%dus]\r\n",usetime/1000,usetime%1000);
  13.   }
  14. }
复制代码





所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版