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

STM32F4在RT-Thread中执行时间计算

[复制链接]
STMCU小助手 发布时间:2023-3-10 18:15
在嵌入式应用时,往往需要对代码执行时间进行计算,RT-Thread的系统时钟通常以1ms为单位,无法精确计算1ms以下的操作耗时,可以使用自带的硬件定时器进行操作。

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

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

20210505145950368.png
20210505145933656.png

不同定时器的时钟频率是不一样的,结合CubeMX配置的时钟,可以获知定时器的输入时钟。


20210505150232952.png

假如我们使用的是定时器3,其挂载在APB1下,APB1的的外设频率是42MHz,而定时器自带二倍频,所以其时钟输入为84MHz。

那么一个测试程序如下:
  1. int time_test()
  2. {
  3.     RCC->APB1ENR |= 1 << RCC_APB1ENR_TIM3EN;
  4.     TIM3->CNT = 0;
  5.     TIM3->ARR = 65535;
  6.     TIM3->PSC = 8400;

  7.     TIM3->CR1 |= TIM_CR1_CEN;

  8.     rt_thread_mdelay(500);

  9.     TIM3->CR1 &= ~TIM_CR1_CEN;

  10.     rt_kprintf("500ms time=>%6d\n", TIM3->CNT);
  11. }
  12. 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.打印计数值;

多次
执行看看效果:

20210505152154521.png

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

上述操作可以很方便的在代码中使用,前提是使用的定时器未在工程中使用。
————————————————
版权声明:小盼你最萌哒
如有侵权请联系删除
收藏 评论0 发布时间:2023-3-10 18:15

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版