打印
[MM32软件]

【MM32 eMiniBoard测评报告】+ 用TIM对程序运行时间测量

[复制链接]
376|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 纪国圣 于 2020-5-24 15:32 编辑

在keil中有一个很实用的软件EventRecorder,可用于程序运行时间的测量。可是由于使用MM32LINK时,Debud->Setting内没有Trace选项卡,所以不能对EventRecorder进行参数设置,时间测量也就没有了意义。

因此退而求其次,可以使用TIM进行时间的测量。
主要思路是在需要测量的程序之前开启定时器,在测量结束处停止定时器。计算定时器的CNT值便可得到时间值。为了防止定时器溢出,开启定时器中断,当定时器溢出时,计数值加一。在测量结束后将溢出次数也考虑在计算之内。
本程序是在官方例程的基础上修改而来。使用TIM2作为测量定时器。
根据文档《UM_MM32L0xx_n_V1.11_SC》介绍,TIM2具有32 位向上、向下、向上/向下自动装载计数器,可在实际的库函数中,为了统一编程,将TIM2的ARR限制为16位。


将有关TIM2的例程移植过来,并新建Time_Measure.c和Time_Measure.h文件。



Time_Measure.h文件中定义了结构体TimeMeasure,用于记录base_time(基准时间)、over_flow_count(定时器溢出次数)和tick(定时器CNT值)。宏定义定义了 基准时间类型。之说以这样定义,是方便在初始化时赋值。
Time_Measure.c文件定义了void Time_Measure_Start(unsigned short base_time,TimeMeasure *t);void Time_Measure_Stop(TimeMeasure *t);unsigned int Time_Measure(TimeMeasure *t);三个函数。在void Time_Measure_Start(unsigned short base_time,TimeMeasure *t)中,Tim2_UPCount_test((SystemCoreClock/1000000)*base_time - 1,0xFFFF);基本分频值是1MHz,根据选定的基准进一步分频。在unsigned int Time_Measure(TimeMeasure *t)中,(t->over_flow_count*0xFFFF + t->tick + t->over_flow_count + 1)*t->base_time;需要特别注意。因为当定时器溢出时,CNT由0xFFFF变为0,再从0开始计数,因此少了一次,需要再加上t->over_flow_count。加1因为可能测量结束时定时器未能到CNT递增一次的时候,所以加1作为补偿。

测试结果如下:

结果还是比较准确的。
MM32L073 时间测量.zip (296.07 KB)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

401

帖子

5

粉丝