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

基于stm32用两个16位定时器级联成32位定时器经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。% i; @  @0 b% i- F$ S
6 e5 s* T8 z6 k6 M: c  A. T
实现原理
) p4 \. W5 F$ m' l% p使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。9 |( M9 A' d4 Y/ |) F. |

( j0 J6 v: ]4 w6 I- z7 X7 E' ?
微信图片_20231107165542.png
  \4 Y5 b8 [7 I% E8 B& ~4 ?

  C2 q- Z7 s- p% N5 M8 h: o3 F1 J假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:( {& o, J5 o3 o7 l
1 {% m) y8 {  b9 W
主定时器:0x186A0 & 0xFFFF = 0x86A0. s* A6 O; r8 G, e. k% i% O' z
7 z% c, W' S9 u  C
从定时器:0x186A0 >> 16 = 1$ ]$ t. B+ P' j' N; X
- a6 P! `$ y5 o
根据计算演示100000us,从定时器会被触发一次。2 c) b9 Q3 m0 T) l2 S) z
3 m* S; E# W4 F7 q- p
主从定时器的选择有一定依赖关系,具体可参见下表
3 Z7 x& a7 t1 ~5 O( X5 m5 |* R- \3 e) D9 r: Q! B1 e8 M  R$ @
微信图片_20231107165535.png
; d' T8 w$ P! u" b6 u
& Q9 F0 I0 z$ d( v: _
目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR2+ y. C8 M6 {+ b; S7 r+ J
! e+ k+ S2 e% M& h- j
微信图片_20231107165529.png
& v. ^$ U4 Y( z  U* S9 i7 p

0 K' C, C3 `7 Z$ N时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us' R" k3 `2 `9 `  Z

1 H/ @9 P- z  Q: U: i8 ?; K/ l% P
微信图片_20231107165015.png
7 ^" W; \  K& L( n

! C; y5 ?+ p. f+ Q/ N4 V8 T5 O从定时器配置
$ q, T: d) j( Q/ {" N+ G) H5 y; k1 ~" [
微信图片_20231107165010.png
% Q: o6 N# f8 G! I1 Y% o
# h5 w( Z5 g+ S+ {1 P; Z
slave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset
6 y( b. i+ z8 I+ ]0 `. P) c; w+ V' J

! U) m! M; O, H) k/ r7 W代码实现' a0 K; G* S7 ?+ S- J' u  Y
  1. void delay(uint32_t nus);
    9 O1 i8 P7 b! ]( m* {
  2. {$ P+ k5 B, E8 h0 a* r! }
  3.   uint32_t MSB = 0;- c) I2 ~( l% m
  4.   uint32_t LSB = 0;- D2 Z) |6 k8 T7 Y, R1 w3 P
  5.   v8 @2 ]( U9 E% i: K$ n6 k
  6.   MSB = nus >> 16;! D# @* L! g/ y& s9 R1 F
  7.   LSB = nus & 0xFFFF;8 B+ A! s- S- L- h+ g3 |+ r

  8. , K9 c" V( w. b* `/ c
  9.   if (nus > 0xFFFF)0 S" F1 @1 I$ T: c
  10.   {
    7 G/ B0 M: K1 c
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);
    4 R5 g+ T# V; N. }, m& Z1 n% Z
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    ' @6 U! p0 K2 {% k" W7 b9 P

  13.   G5 e) K6 g! L" d3 d5 \9 `2 K# N
  14.     HAL_TIM_Base_Start(&htim3);
    ; R% A" r- P2 v2 {
  15.     HAL_TIM_Base_Start(&htim4);
    4 U  A4 H6 q2 W1 G# b) K9 Z9 C

  16. 3 T+ H' l9 x9 p, w3 p4 j
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)
    # I( o6 E; b7 H$ N$ j: }
  18.       ;
    & w( I/ b  Y# {# z* B4 {: t6 |  x
  19.     HAL_TIM_Base_Stop(&htim4);0 Z% x1 M& K8 X/ x0 t
  20. 5 y$ e4 W' m# r" j! f& U) O
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    $ |- f% z; @; h
  22.       ;' d* S/ M5 x2 W. t, q
  23.     HAL_TIM_Base_Stop(&htim3);# s  h: m7 n  }+ q
  24.   }' N4 E- [) b3 U+ ~
  25.   else1 \; ~' @2 E  H3 l$ R3 y  ]
  26.   {
    ( F" a: S$ f4 G: ~
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    $ x, ?* Q: u; _( M6 M
  28. 6 n/ t- q3 V# B, ~9 f. Q
  29.     HAL_TIM_Base_Start(&htim3);
    5 O+ f8 u# r" {! w4 L

  30. 3 P8 w7 q( c4 t% t9 L+ e- Z& K
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    ) [' U$ e& Q2 f3 D# u' L9 b
  32.       ;, {! U2 Y$ y/ k: t. R9 Z2 x
  33.     HAL_TIM_Base_Stop(&htim3);
    * A& h; P: B: X; k4 d& Y  P8 J
  34.   }
    : l0 s7 _. T) Y% ?
  35. }
复制代码

( m9 t; g  _9 K( \0 d转载自:啊哈哈昊啊
5 e, w3 e8 r, @" v1 [( s! T如有侵权请联系删除% J: v% ]; |( f" f" t
赞 收藏 评论0 发布时间:2023-11-7 16:56

举报

0个回答

所属标签

相似技术帖

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