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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。/ C: q" B2 P% }3 _& Z

+ J7 G% Z0 c3 _" n4 k6 s实现原理! F& _4 ?1 E2 x3 m1 X4 g+ g
使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。$ d& u' O1 T2 W. d

  n, K2 P- ?9 j* v. J
微信图片_20231107165542.png

$ A( x3 ~" \9 `
: J4 [" X9 m; T2 f" E- @/ R% g
假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:
# W# B: A/ d7 `. w, b. h# V5 s# o2 h/ a# [  N
主定时器:0x186A0 & 0xFFFF = 0x86A0
8 d" T/ S2 o/ @! F1 S
1 Z2 Y% L, b5 }9 q. F0 ?
从定时器:0x186A0 >> 16 = 1  _! [5 m1 ^4 t6 X7 R" y
0 X8 V" n& B3 r2 S
根据计算演示100000us,从定时器会被触发一次。4 T# {3 _8 d, F/ \5 |2 V/ l- t' o

% N* q, W! X% \5 U0 l# P3 J1 P主从定时器的选择有一定依赖关系,具体可参见下表
" W9 j* k" D" T4 s& U, T0 A: n2 C- W: r! l& J/ u
微信图片_20231107165535.png
" C; ]) Q) ~; n- k# ^( ^6 p
: |+ v% D" t" O* t/ M7 B6 j! y) T
目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR2
2 x4 h* y) H2 u8 t: M4 y1 G, ]0 o/ J  v  A
微信图片_20231107165529.png
: g* D! F0 f- [- U( J) @3 E
# c: S+ r+ O- E/ n& z
时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us/ |2 D1 {5 n$ X, q7 m' w

  B  }  U6 P# V9 Z9 L
微信图片_20231107165015.png
! ^$ S! X  x" q, w) _5 z1 B# `

9 B8 g+ r  r+ X  a- ^- R! s从定时器配置
5 i! K: q& _, v4 d; A
! W' k  l' v) Z4 }& `' |6 C
微信图片_20231107165010.png
0 K3 {% t, o1 \3 ]1 K
3 A( ]" L' y- n  K7 B8 B" w  d
slave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset0 {+ G1 z( y+ @! w; {. l
# D6 \) {; K7 f: `4 D8 c9 j
8 \; C7 h- f3 H6 o5 V# M9 \
代码实现! t0 v8 t1 g: F. J, p
  1. void delay(uint32_t nus);
    7 `0 W2 \. z$ B" Z6 r
  2. {' T1 }) Z8 H! l8 q) `/ ]
  3.   uint32_t MSB = 0;
    ' Z$ [  @, C; b2 D; ~' h2 r
  4.   uint32_t LSB = 0;
    % S2 e' v7 O" D# g8 P3 f" s2 F

  5. : G! ?- y6 @' P& q1 A/ L
  6.   MSB = nus >> 16;
    2 w4 G* N( p0 N
  7.   LSB = nus & 0xFFFF;) e& ]8 U( l1 I1 ?

  8. ; i8 U0 m6 e; k: p- a
  9.   if (nus > 0xFFFF)" Y. T( Q" j8 v
  10.   {
    ' k! f( m3 O' A: S+ T  |. _* u
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);
    0 A- H& o, |& d& g0 {/ |
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    $ u3 s' S) x% O7 e

  13. 3 d+ @  \/ N9 ~% O
  14.     HAL_TIM_Base_Start(&htim3);
    9 G+ V4 O' s3 p+ k# k7 v
  15.     HAL_TIM_Base_Start(&htim4);: C6 N1 g1 [& @3 q) y. g7 Q

  16. ! y$ A8 B6 o% R) ?5 e/ M4 [
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)
    6 ?, o, f3 P" V9 S" @
  18.       ;7 _7 H. M( l2 O# [
  19.     HAL_TIM_Base_Stop(&htim4);
    0 x; Q4 ?; h1 E  L* j( h

  20. 1 P; d3 W/ F( G& v6 }
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)( l/ W) S# w/ P
  22.       ;
    ( R, s7 Y2 ]$ R+ W0 P2 ^
  23.     HAL_TIM_Base_Stop(&htim3);7 a1 W" t- f! k/ Q& G/ l# O
  24.   }# c. s% [2 U; }
  25.   else1 K9 I( b* |9 x$ g6 A1 Z) u0 S
  26.   {  D. {' V* _7 d2 E8 P& T! ?5 o
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    1 B! B% i: A0 Z

  28. 2 X# Z; W- e- p8 D! i- e6 W
  29.     HAL_TIM_Base_Start(&htim3);: X$ B% Q* n, E. ^* T

  30. 9 X: l% t* h3 @/ y1 |. r
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    6 @2 J0 m/ Y6 Y4 I1 t2 q" v6 w
  32.       ;
    4 [1 s0 ]* d7 a- ?
  33.     HAL_TIM_Base_Stop(&htim3);
    4 r* v: G3 n9 x9 j8 h( B' I
  34.   }% H* n( E- F6 G/ [+ S
  35. }
复制代码
- a8 z* ^# d4 b" w; y* y
转载自:啊哈哈昊啊" J  k5 t0 X0 _+ `$ M
如有侵权请联系删除
2 u% w) V6 R1 R+ q5 U
收藏 评论0 发布时间:2023-11-7 16:56

举报

0个回答

所属标签

相似技术帖

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