RT-Thread中STM32F4代码执行时间计算

在嵌入式应用时,往往需要对代码执行时间进行计算,RT-Thread的系统时钟通常以1ms为单位,无法精确计算1ms以下的操作耗时,可以使用自带的硬件定时器进行操作。

RT-Thread自带定时器外设,但操作相对较复杂,在仅用技术的情况下,可以通过操作寄存器来实现。

由《STM32F4xx中文参考手册.pdf》可知,定时器1-14均挂载在APB1和APB2下,启用定时器之前需要开启对应的时钟。
在这里插入图片描述

在这里插入图片描述
不同定时器的时钟频率是不一样的,结合CubeMX配置的时钟,可以获知定时器的输入时钟。
在这里插入图片描述
假如我们使用的是定时器3,其挂载在APB1下,APB1的的外设频率是42MHz,而定时器自带二倍频,所以其时钟输入为84MHz。

那么一个测试程序如下:

int time_test()
{
    RCC->APB1ENR |= 1 << RCC_APB1ENR_TIM3EN;
    TIM3->CNT = 0;
    TIM3->ARR = 65535;
    TIM3->PSC = 8400;

    TIM3->CR1 |= TIM_CR1_CEN;

    rt_thread_mdelay(500);

    TIM3->CR1 &= ~TIM_CR1_CEN;

    rt_kprintf("500ms time=>%6d\n", TIM3->CNT);
}
MSH_CMD_EXPORT(time_test, time_test);
  1. 开启定时器3的时钟使能;
  2. 设置计数值为0,也就是从0开始计数;
  3. 设置自动重装载值为65535,因为定时器默认是向上计数的,即记到65535后会变成0;
  4. 设置预分频为8400,因为输入信号为84MHz,经过预分频后,定时器的计数频率为84000000/8400=10000Hz=10kHz,也就是每过100us会加1;
  5. 启用定时器,开始计数;
  6. 模拟一个500ms的操作;
  7. 关闭定时器,结束计数;
  8. 打印计数值;

多次执行看看效果:
在这里插入图片描述
可以看出上述结果在499ms到500ms之间。
由于RT-Thread自带的延时操作是基于滴答定时器的,当执行该内容不是因为时间片到期,而是因为上一个线程转入挂起状态导致的,就会出现这种计数值差1ms以内的情况。

上述操作可以很方便的在代码中使用,前提是使用的定时器未在工程中使用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值