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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。
# [  v  C' l" I4 }/ E9 I  s+ M
实现原理# P6 d" `2 ~1 a3 H
使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。$ c) r% ~% x  P6 t% G/ r

4 Z9 I% G4 B# f0 W2 j
微信图片_20231107165542.png
# U; ?( m( h# I4 F' A! r! P

7 Y. f! t. y3 U* I, `假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:
$ N1 j; o. w( t0 K; ~7 S
8 |1 c  ~" {$ t2 T6 X. t4 h主定时器:0x186A0 & 0xFFFF = 0x86A0
; U- Q+ h! x) Z2 ]- P
) {! I9 l  i; U9 m: ?% s$ y
从定时器:0x186A0 >> 16 = 1
4 Z6 H+ n' P2 s6 n$ A. X! S" F8 O4 ]7 G/ O
根据计算演示100000us,从定时器会被触发一次。' u" L% L  N' e( a. j, F

3 S: a; _8 h" Q3 z* M" z4 d4 X- j主从定时器的选择有一定依赖关系,具体可参见下表; r( w6 G& F) ]
0 T4 c- t. s0 Y: R
微信图片_20231107165535.png

4 ^1 B/ m4 B* M; X. Z5 E  O# ~
0 t' R/ W" p. C* h' i& M0 M
目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR2* b7 H0 c+ x4 t  m
0 q, E1 @; y5 {: N
微信图片_20231107165529.png

, ^( m: R( D6 }+ r, H, k5 ?, n% [

1 _* @5 m$ K9 p6 G8 ]: v时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us! l( `8 }7 o! I9 w% h! b7 a5 U" b4 s
7 q5 @. d  Y+ ?- G
微信图片_20231107165015.png
1 j/ u4 s6 ]1 m/ f7 s# W
6 P  F7 C3 \% d3 D# D5 K# k
从定时器配置" g* h' `8 X3 H, e) R( w+ ^! ]6 {* ?6 j$ d

0 Q$ _$ N' z$ L+ C0 j
微信图片_20231107165010.png
4 L5 T9 O! v; B& n
* l8 o% G8 @' M+ a1 Y) j
slave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset
- a6 k! s  U1 S- a! x7 A
! p% I8 `9 B8 b  _0 x2 X, b: h

. X  b% [& t5 @9 H6 ~代码实现$ c" O/ C( ^8 \9 u4 r8 C
  1. void delay(uint32_t nus);0 F# |$ W& a1 i( z  Z
  2. {
    ! d$ S  w- \- u! |1 y
  3.   uint32_t MSB = 0;' }3 M% l$ o% h# M7 C
  4.   uint32_t LSB = 0;$ S4 v) V+ S5 b3 n  N2 |% D
  5. / u% z. X! f: \
  6.   MSB = nus >> 16;- G! D1 g+ r2 B
  7.   LSB = nus & 0xFFFF;+ Z3 n) r# R9 y- B
  8. 2 d, w" C/ i5 S% F3 K, x
  9.   if (nus > 0xFFFF)$ ]; d! x) A3 [3 z
  10.   {5 f6 p) Y7 K9 v! V. }( E) y
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);
    # T/ x: O: ]& |$ Z& ]! u, k5 n
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    / S  Q) Z* N9 f, c+ ~) a" d) ]

  13. : G! Q2 J! s$ Z/ D
  14.     HAL_TIM_Base_Start(&htim3);
    , ]) [* x0 L/ X
  15.     HAL_TIM_Base_Start(&htim4);" [" H& N3 L6 `; A' W

  16. 9 Q0 n; G! ]1 A/ b  `. S3 h
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)( \# z) h  ?3 z* @+ H5 H0 Z
  18.       ;4 y; l9 C+ Z9 W" C9 [: N
  19.     HAL_TIM_Base_Stop(&htim4);
    ; ]9 f6 K0 Y6 H# U& ]
  20. % F0 }! P+ N+ B( a7 A1 _
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    # ]+ v# z# |" ]
  22.       ;2 w* l% S  j: n( _: i+ p
  23.     HAL_TIM_Base_Stop(&htim3);' ~  N2 m9 H7 E
  24.   }
    " R1 \5 j* T0 Y8 N0 O5 P% ]: n( e2 B
  25.   else. q* g; I% W- b! ^
  26.   {0 s: c0 ]9 t) S/ r. d/ s1 R5 Z
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    " d0 ]  S% Z2 w

  28. . i1 V  E& E2 z
  29.     HAL_TIM_Base_Start(&htim3);
    1 X) W8 {+ q' f0 |& c7 i
  30. - E3 k, Q  g9 O4 C8 l1 y& x9 y' Q) P
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)" b& t' ~, U4 N, w. T" |
  32.       ;
    ) i$ G5 F8 ]: i1 E
  33.     HAL_TIM_Base_Stop(&htim3);
    2 J; N. I9 }6 k2 W- b4 l2 _
  34.   }, G2 f. D/ J* u2 {( U/ K
  35. }
复制代码
- g" Z5 P# E3 L  H
转载自:啊哈哈昊啊
  P' t4 r3 v- u1 z% X如有侵权请联系删除
4 g( X2 r# C  c* M
收藏 评论0 发布时间:2023-11-7 16:56

举报

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