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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。; E$ K' Q7 y. Q$ P+ H

8 D* N( _0 V$ H" \9 Y实现原理
# X0 }: m8 `( f+ P- @使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。
9 f% P1 ?8 B% W6 q0 ~2 ~
! g1 R& }# }+ l& q9 F1 _
微信图片_20231107165542.png

6 l  @' _" n( c* W) d  t8 e7 m, m
$ W4 M6 j2 q/ F4 H& ]
假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:0 I6 w$ P# l9 I/ @: L' I% v4 G9 }

% k% w2 Q3 p% C5 Q& U& z主定时器:0x186A0 & 0xFFFF = 0x86A01 |0 ]5 O* b( C0 Q7 j% I5 u/ V
8 G1 u. v2 b' X" f9 }
从定时器:0x186A0 >> 16 = 1
" D. t7 j3 i6 C
# ~! ^) D& B1 I- `根据计算演示100000us,从定时器会被触发一次。- Z5 a+ f* _, K& _  |' P; h, u2 Q# k
* I0 B2 H9 T7 v
主从定时器的选择有一定依赖关系,具体可参见下表( p! i( O' Q% x" S

1 c' u' q0 W% s0 \  o9 z/ C
微信图片_20231107165535.png

: N2 K$ q! r8 f1 g5 h; C

4 P! ^/ u  V  C目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR28 K' u) D3 u5 |
! a- B& P5 y! L2 g& D5 l
微信图片_20231107165529.png

+ S" X/ c# }4 {  A: d; N8 \

9 h" L+ i7 n) n$ G# `# p0 h8 ?时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us
8 n2 a& u3 w1 U  g* w2 N7 A: H- m! T
微信图片_20231107165015.png

" i/ [- R: f! @9 d  V5 u& m" a6 f& ?
从定时器配置' Y  J4 f" l. J% ~5 L- X  `3 K

/ F; x6 K/ }2 H" ]7 W
微信图片_20231107165010.png

( @- O9 ^4 M2 ]% \& I
* z3 B0 C% `- t" L% ]slave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset
2 e9 d8 X: o- X# [0 ]1 n& q$ Q( n9 G4 X

' e6 ]8 T/ E; H" C+ \: ?代码实现
9 c* k  X! @6 N# ~- C! U2 R. ]
  1. void delay(uint32_t nus);. v( K2 w8 p' n3 m" U
  2. {3 }) `" K  D4 b6 V" i' {
  3.   uint32_t MSB = 0;3 g# ~  X1 `% }+ B* P7 I5 z
  4.   uint32_t LSB = 0;+ g+ D( G# ]5 }! `! J* V/ t

  5. 9 i  q$ a5 d! E" D9 |+ _
  6.   MSB = nus >> 16;7 b! }3 Q! o; G& X& s
  7.   LSB = nus & 0xFFFF;" r% y3 w, O0 N# l
  8.   ?5 i8 \0 O+ K' d+ N! i& e
  9.   if (nus > 0xFFFF)& F- \/ B- c$ N* s$ W7 E* m5 J+ g% y6 n
  10.   {
    6 M$ b& o# B4 A& U3 b3 w8 a  t% l
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);
    ( }) M) Q! \, e  J5 ?
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    ( }& y9 V4 X, J
  13.   v/ T& i8 y" u2 ?
  14.     HAL_TIM_Base_Start(&htim3);
    / @/ Y; v% \: U
  15.     HAL_TIM_Base_Start(&htim4);
    ' f7 m$ }2 ^3 `, V. M
  16. 3 L+ r5 h3 _! _. s* t+ e
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)
    : p; g' ^  `+ C# Y4 }' V' F# Y- o( W
  18.       ;
    8 [/ R7 z$ `) @- K# n3 L9 I! M3 n
  19.     HAL_TIM_Base_Stop(&htim4);3 D" I# k5 X7 Q9 p& D) B1 ?" y
  20. ' O% V2 |0 t5 V, Y& u" V
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)% ~# I% @* G" N0 ~
  22.       ;/ }! n) _: O' c# S+ {0 _$ X$ }
  23.     HAL_TIM_Base_Stop(&htim3);
    4 f0 T/ k1 D' U/ P, s3 u" h
  24.   }
    ! {0 D7 z% }6 O, C. [
  25.   else
    - N) m4 [) q4 E9 s& m
  26.   {, h) u% X1 }% p5 Z
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);0 b  J& f- w: w5 \: f/ @- n

  28. 4 r9 ?0 t) W) W1 a
  29.     HAL_TIM_Base_Start(&htim3);) u2 y, w: u9 G, D$ y3 V

  30. ! R/ f6 S& T8 W
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)$ L- @! `* s' T( I( q$ b4 [
  32.       ;
    % {# g4 y! E2 P
  33.     HAL_TIM_Base_Stop(&htim3);6 X! P. x% B. l+ Q, b4 z! c3 E; |
  34.   }4 d2 x( a& W  ]! ~* K0 K- S) c
  35. }
复制代码

( q/ N$ u9 K3 Y6 L! _* N转载自:啊哈哈昊啊
! |9 E* I8 M: e! E4 P* ?如有侵权请联系删除6 R% t* _3 r+ a8 \, c7 ?; h' W
收藏 评论0 发布时间:2023-11-7 16:56

举报

0个回答

所属标签

相似技术帖

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