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

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

[复制链接]
STMCU小助手 发布时间:2023-3-10 18:15
在嵌入式应用时,往往需要对代码执行时间进行计算,RT-Thread的系统时钟通常以1ms为单位,无法精确计算1ms以下的操作耗时,可以使用自带的硬件定时器进行操作。# o  ]9 \% f. P0 c; B+ f$ K
- D4 u- \# v$ V3 K3 N' N0 F
RT-Thread自带定时器外设,但操作相对较复杂,在仅用技术的情况下,可以通过操作寄存器来实现。4 ]" R  X5 V3 W
( x( O( R! O7 g% z5 ~
由《STM32F4xx中文参考手册.pdf》可知,定时器1-14均挂载在APB1和APB2下,启用定时器之前需要开启对应的时钟。
1 z/ H7 q7 b' d% }. ^  h' b0 H* T5 u; L
20210505145950368.png
% o3 j* c& p# z 20210505145933656.png ; q8 R& k6 Z  g  Z( z: l
* A# @! t5 P! K8 ~/ T
不同定时器的时钟频率是不一样的,结合CubeMX配置的时钟,可以获知定时器的输入时钟。. n; U, F3 F' p  _
/ A! {1 ?. x4 w4 F

3 i' F1 N$ I' l5 t; X( B 20210505150232952.png
2 h( h: `& B* U5 }2 C8 A& X
' C0 W  s0 ], D6 o, ^: z7 E
假如我们使用的是定时器3,其挂载在APB1下,APB1的的外设频率是42MHz,而定时器自带二倍频,所以其时钟输入为84MHz。. y: E" E# Y/ G2 l& _6 r, o

2 \0 D- u! d, i2 R. m那么一个测试程序如下:9 ?3 m2 L# Q0 h
  1. int time_test()
    * x3 ]9 d  E5 {
  2. {0 c; _9 ?" ~' E2 M& f
  3.     RCC->APB1ENR |= 1 << RCC_APB1ENR_TIM3EN;
    * R' l! F% j$ E6 j) e7 P; |. y" ]( ]
  4.     TIM3->CNT = 0;
    3 C% a2 T8 `. U' [: _: {6 U
  5.     TIM3->ARR = 65535;
    0 g# {- [' r6 P; X5 t' c) t
  6.     TIM3->PSC = 8400;
    % ^+ ?& e/ r6 ^2 v  P$ m

  7. / S+ E2 u/ |7 t& i: j
  8.     TIM3->CR1 |= TIM_CR1_CEN;
    ! |% R7 l0 J- P+ W2 x3 c$ |3 m& _
  9. * T; [' m5 L, v0 G0 F
  10.     rt_thread_mdelay(500);, s( ]4 O" ~( x8 i8 ^! v& J

  11. " i; C7 \- t' D
  12.     TIM3->CR1 &= ~TIM_CR1_CEN;
    $ A5 x2 r" @( }; }0 ~$ k, U

  13. 1 q  n: ^. X2 O$ G$ W. e
  14.     rt_kprintf("500ms time=>%6d\n", TIM3->CNT);+ m6 q9 P( I' K4 T5 h/ Y: N1 K
  15. }( [) u" c7 I5 L( A
  16. MSH_CMD_EXPORT(time_test, time_test);
    ; G! N# [" X- c, M9 ~2 X
复制代码
' R0 f1 C) N- _. e# P* c4 Y
1.开启定时器3的时钟使能;: N& ]5 Y0 D! l+ B* M
2.设置计数值为0,也就是从0开始计数;
% H4 n, S9 q& p) L8 f( ~3.设置自动重装载值为65535,因为定时器默认是向上计数的,即记到65535后会变成0;3 R/ C! b, d- s, K* M& y; r/ z
4.设置预分频为8400,因为输入信号为84MHz,经过预分频后,定时器的计数频率为84000000/8400=10000Hz=10kHz,也就是每过100us会加1;
8 A+ O7 M3 y. ~! s' E5.启用定时器,开始计数;
: L8 }; F; G2 w. N$ i* W2 t1 s6.模拟一个500ms的操作;
7 o3 `5 |8 C2 f# |2 L7.关闭定时器,结束计数;9 R' k' `6 i# _1 m  {
8.打印计数值;
  U9 E9 T; C' Z: [* F; ?' l! h0 o$ N; c/ O8 ]
多次
执行看看效果:
$ K1 @# Y0 l5 e/ Z" u
2 X, `  E' O3 l2 n+ j( Z9 r  c 20210505152154521.png 1 ?  m! f) Q, ]. H2 ~  P) U
% k9 M7 W9 {3 K" [. @, j
可以看出上述结果在499ms到500ms之间。
, y" j2 C3 G. L/ R由于RT-Thread自带的延时操作是基于滴答定时器的,当执行该内容不是因为时间片到期,而是因为上一个线程转入挂起状态导致的,就会出现这种计数值差1ms以内的情况。2 u4 d' u6 I" n/ Y  f2 w" q
. f* Z3 L5 J9 o2 G2 @. _
上述操作可以很方便的在代码中使用,前提是使用的定时器未在工程中使用。3 i- j  Q1 F$ ~$ C3 N8 u0 R* h1 t
————————————————
% i+ L, G' t& u7 e; E( L* Y9 W版权声明:小盼你最萌哒' q; X6 v+ C1 N9 V1 l6 P$ H4 K
如有侵权请联系删除( E; E+ ~4 `6 E# b9 |" p
赞 收藏 评论0 发布时间:2023-3-10 18:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版