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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。
" k# P0 Z; n& i1 [) T5 w
/ k5 c  W: a& O5 k3 C8 @/ z7 E/ T/ Y实现原理  ]# ~& L/ N; h: L  J2 J+ N4 {
使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。
$ d' N" n# X: H3 e) d9 q, ]9 j- P5 t1 P% a  v0 ]
微信图片_20231107165542.png
7 B/ A$ y6 h+ }0 g; {, C+ A

3 h  S& h: ~  c假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:0 t6 `- @' @; j" q6 M' W% U9 S' t
7 W( q8 U& _+ ]9 c8 j- g
主定时器:0x186A0 & 0xFFFF = 0x86A0' d" h4 T3 R' C# ]' P: l# k  u- y

5 Z1 l2 p0 R7 {4 I# ^从定时器:0x186A0 >> 16 = 1
9 _! P3 ~# ^. s1 H  W3 D7 y! R: `  l5 c, @, G
根据计算演示100000us,从定时器会被触发一次。( [3 D% o$ O! \5 t

# K* I2 J  W& F  d主从定时器的选择有一定依赖关系,具体可参见下表5 x; K3 d  Q% F$ W! n

9 \% X% k9 T, C4 l1 w: H
微信图片_20231107165535.png

4 b% a$ y6 e4 ?/ }; P- f2 W" k. j
( C  B$ n: x6 `$ |0 l1 P$ b
目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR2. ^4 A2 \, r# U5 v4 s! I
' s0 Q' n1 V; \+ S4 b( I$ s2 T( F
微信图片_20231107165529.png

! T" K1 S, p* d8 c# f4 r  b) a. D3 r
: ]3 F/ J9 `/ e& s! {' g  `# g
时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us
2 A% }- d$ Z# ^4 z5 |! m( ~0 W* t9 R( G4 c
微信图片_20231107165015.png
) j+ `; V1 Y& ^. n
2 @  [# K) {6 ?4 ^  K% P
从定时器配置
# [! C$ E; N. `( U
7 K* Y- ^% S1 L4 n3 K$ t& A
微信图片_20231107165010.png

5 {2 y& C; O6 k6 w" d% \* L# Y& q: l( x3 f1 c7 O/ u! T, I  ^4 w
slave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset
: V" l, j, w& s+ E' }& Y2 f' X; |" {" z  V* n6 i

7 G; _' |, G, T代码实现% Y# y4 P9 Z7 S/ J
  1. void delay(uint32_t nus);
    7 J1 L& V( d. Q# n; i
  2. {
    ) Q0 E0 V+ G5 @9 D
  3.   uint32_t MSB = 0;
    2 |+ U2 l; K* u: J3 d
  4.   uint32_t LSB = 0;
    7 f+ M7 C8 F) ?

  5. + y7 l% |+ F: l+ ?
  6.   MSB = nus >> 16;; @! u7 Y( o, l. m3 s/ M4 E- _3 ^
  7.   LSB = nus & 0xFFFF;- }6 t7 S0 \# T9 Y- N
  8. $ z9 k) I) x# E5 j
  9.   if (nus > 0xFFFF)
    " ^% \& U7 k7 B# E' G- ?
  10.   {
    , D% ~& y. ?6 w- n9 Q9 ^1 \* A4 v
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);
    4 P4 J( u5 z  r6 ~0 w2 V
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);4 ~; ?7 P% \; i& p, N

  13. & b6 D! e1 d$ A+ n' b# f7 y1 d
  14.     HAL_TIM_Base_Start(&htim3);
    : b, V. Z* \8 t  B  Y) z
  15.     HAL_TIM_Base_Start(&htim4);! |6 B' ^8 ^% |1 n

  16.   a# ?1 W0 L' r" d! S" Y; k" Z
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)
    $ b4 e" }% e; @# h6 j
  18.       ;
    ( _' X. t9 B. g* ]) i2 A0 T
  19.     HAL_TIM_Base_Stop(&htim4);
    2 `: G7 L6 `% i% R' t

  20. * L' x) T# O( C: T) m
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    ! _) L1 U- C  D; T4 P, }7 Z, W) {# i. b
  22.       ;6 ?  ?4 V2 m6 t1 [
  23.     HAL_TIM_Base_Stop(&htim3);4 e0 }+ |; N5 Y' [
  24.   }
    % a) `1 V0 @, k: g" d$ W4 ^1 b
  25.   else
    , w3 A. ]( y& T1 B
  26.   {
    1 }- `) }: D9 z: D6 a
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);' V' I2 E3 p7 ^" y* n0 U2 \) A

  28. 6 e. c6 Y5 s0 B% s. |
  29.     HAL_TIM_Base_Start(&htim3);7 N' a; ~/ f# s0 X
  30. * C4 x, }* g, }0 @, r4 I
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)+ Q# L5 _8 ~9 t+ l# M  g
  32.       ;
    % n5 G. l" z6 F. M1 h1 G7 I
  33.     HAL_TIM_Base_Stop(&htim3);+ o$ J/ n0 y. n6 D
  34.   }
    * f/ y: ~) n3 ?( c$ K0 H, i
  35. }
复制代码
) f# S2 C- n! m. T/ ^9 O% w- k3 [) [
转载自:啊哈哈昊啊0 }/ Z/ l6 a# O( P# {
如有侵权请联系删除
! I: ~  Q# q- K7 ]' I. @* L* c
收藏 评论0 发布时间:2023-11-7 16:56

举报

0个回答

所属标签

相似技术帖

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