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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。" j, G3 e6 K. v( u4 l. s

! u; ]& Y& a* @实现原理$ T1 \" N. P6 H% U& `
使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。
0 |3 Q' \) B% X) `: x" z: J8 Y9 Q
1 `; x! ^) c" u8 [$ k, I* @
微信图片_20231107165542.png
; B1 x) L3 \7 G/ |: E: C
' z% y( E2 y5 @8 o
假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:; _: g! }& h; }# R+ X! B( L

4 h+ u% u4 n- Q4 X, w! e主定时器:0x186A0 & 0xFFFF = 0x86A0
& h" B' c1 S5 G

  m6 N) @$ S9 q: A3 w7 F! L从定时器:0x186A0 >> 16 = 1" g; d7 b) \$ }$ m/ K  C. w

9 F: ~2 q) Q) y4 D3 B根据计算演示100000us,从定时器会被触发一次。2 ^, ~- M/ I/ t" f# F1 {  r& p
  k/ r4 y  [0 `3 s" u% L6 n# b  m/ E
主从定时器的选择有一定依赖关系,具体可参见下表1 W& a' H, s" j# v2 p/ v
( d9 }9 {) u$ s. h. _
微信图片_20231107165535.png

( N' B0 {& X# H7 d5 S& a

5 V- ?8 W. B7 P5 e目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR2
- f+ x0 A- O9 I
" G8 F: P* d; O, @
微信图片_20231107165529.png

  w" u) X6 F" a4 K8 F

0 R' p. k- k* s6 f' f( H- q) O时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us
7 v' }; X5 V. f- B% m7 F- Y1 m; k0 o" g
微信图片_20231107165015.png

7 L& G; F5 a3 Z# R) s' W6 n# F& K/ G2 d: a3 v$ [% P  P
从定时器配置1 f0 k& R+ s0 s, Y( Q: _/ z

' T' r! _/ \4 A6 u
微信图片_20231107165010.png

- J1 e0 Y) C" t; b; N, |# p& ?! H3 @1 z5 z. K
slave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset7 i0 T3 `! N) @* e/ D+ m6 b7 ~

) l) t, j. a+ n, S0 W: n

/ k" n1 L3 U* Z+ ^代码实现$ \; v# F$ U9 p$ |' I
  1. void delay(uint32_t nus);
    ; N& T( y% Z3 v; b/ [3 H8 ~
  2. {
    ) |2 d! D5 B8 Y/ t
  3.   uint32_t MSB = 0;
    ) A/ p6 z* t$ Q
  4.   uint32_t LSB = 0;! F; d- E, s8 k+ M4 N$ X: f& Z
  5. ) W- @" S4 M1 ^' n" B2 N# ?
  6.   MSB = nus >> 16;9 T# h5 y) G/ W( t/ a. H' T
  7.   LSB = nus & 0xFFFF;' K0 D; f4 h4 V8 o  E0 G
  8. ! d# v* u; X  l; f; }
  9.   if (nus > 0xFFFF)
    ( z( f& I! f0 ~" d
  10.   {
      `) g" Q) c3 v3 D8 S* r8 s9 l
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);
      B) c: f0 N$ o0 F' z# e& L" T6 B9 }
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    8 r8 J( Y* `9 X: U/ K9 c9 f
  13. & n( k2 _' Y3 ~- q' r
  14.     HAL_TIM_Base_Start(&htim3);
    ' h( T' v9 E+ M7 Q% F0 C+ k/ Z
  15.     HAL_TIM_Base_Start(&htim4);
    ; z; j( Q4 A# I: o" s8 P* ^7 i  I4 B
  16. 6 ?9 G7 S1 `# o% _9 h3 E# E
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)) C( ?- o4 A' P4 R
  18.       ;: [7 I! z+ l+ n+ `9 n# U* ^
  19.     HAL_TIM_Base_Stop(&htim4);
    7 C- J2 `2 E& y/ Y
  20. : r5 Y* L0 [6 q. b! E$ Y0 H
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    9 c1 H, o) ?! x/ m8 p0 z
  22.       ;3 ^$ g- _: l) f) {  B8 o4 q8 M4 U
  23.     HAL_TIM_Base_Stop(&htim3);6 B2 }9 @, o1 f: C
  24.   }. D. ^3 j  b- S4 C
  25.   else
    . I) U2 z9 t5 W# M+ D
  26.   {
    $ g; M& E( P- E. R1 }& a$ |- |
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    4 r. U# a' e) ]; O& d
  28. % Y1 K/ p- j" L) p
  29.     HAL_TIM_Base_Start(&htim3);
    8 t& U& h; L+ \* F
  30. 2 D2 d8 a4 O: o5 D" R, ?0 I% [
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    " B4 n; q) ?+ V3 f
  32.       ;) U6 Y+ \* W  R: B5 |" w, w1 N8 `
  33.     HAL_TIM_Base_Stop(&htim3);- T! L% h) y3 v, y' E+ ~& U  ]9 S
  34.   }1 W$ c6 U8 M( `
  35. }
复制代码

, B/ J' |$ _2 n( [转载自:啊哈哈昊啊0 ]$ C0 H3 W) s! R# }9 s( n7 B
如有侵权请联系删除1 J& u& ~4 R0 K7 \- d
收藏 评论0 发布时间:2023-11-7 16:56

举报

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