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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。
  W- D$ `: z' ~% H5 h5 ?
4 [: X$ N7 }; x. F. g实现原理
* G% n2 S1 s( n7 i2 }使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。
5 }! W+ @4 w+ c( ]+ \9 {! w, ~1 r% X, Z8 ]% \) R# V1 z5 |
微信图片_20231107165542.png
0 o, l) u. f& u" C: w  x* L: K

9 A( C; ]$ Z" D  ?1 y假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:
  e: y% J7 ~) a! C$ i, V, \0 w4 a8 ^$ J5 X. {$ x
主定时器:0x186A0 & 0xFFFF = 0x86A0" l; N( x0 y9 ]1 C
: l8 e$ r" F& p1 q
从定时器:0x186A0 >> 16 = 1
/ `5 X5 j" B  |. R! a/ r1 y0 E& Q( A7 C  M$ D
根据计算演示100000us,从定时器会被触发一次。( d. W* o$ m' D+ w" Z6 f2 N5 A

/ G9 G; e( G# o: S7 m主从定时器的选择有一定依赖关系,具体可参见下表8 o. B+ N" F3 i" g8 \
( k1 \' e$ Y: D# _
微信图片_20231107165535.png
, x- ]! Q/ f+ O4 ^* m' N

+ Y8 R* B: T( q目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR2
5 N" e: U/ H4 ]2 i( ?7 i" ~  P! u% U; V! N4 c
微信图片_20231107165529.png

2 \, b4 m; M/ {6 z. e3 e2 K3 H4 f

  a% r0 v$ ~8 T3 p! ^! u时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us; Q, k5 r2 T7 G+ G

( T" h% s0 ~9 m
微信图片_20231107165015.png
- r. L% @) v$ e+ z/ j
5 [/ v4 |% J/ r: A
从定时器配置( i5 L* _" h) u, Q  L+ V( L' U
5 o# O6 o: ?7 J; _+ c
微信图片_20231107165010.png
4 C6 g& e: i7 f7 f& K, l! z4 B% z: b

& L! v, [; e8 g& @" m# f( L  Eslave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset
" ]4 v. v6 c1 s# H
% S' ^- W' m1 d) d

, h: s3 `6 g' M( |7 c9 [代码实现
) X5 H- x4 _2 {; L3 i/ s4 P
  1. void delay(uint32_t nus);  a; C# s8 I, L7 }  u) t5 l
  2. {) M, @! p4 e6 i# n5 p1 Y
  3.   uint32_t MSB = 0;& |$ @& X8 T  h- J) B0 ?
  4.   uint32_t LSB = 0;* ^: V( m; C  v' P

  5. ; z- ]: r+ V; E9 Q3 n, ^- A9 r
  6.   MSB = nus >> 16;  t- |( }* l" R: o
  7.   LSB = nus & 0xFFFF;% t8 H. l3 m0 R

  8. . D" S( z) I0 r# |! i* y) `
  9.   if (nus > 0xFFFF)
    : E1 w$ d  T: e. P
  10.   {
    ' |' E8 |" M  u1 S7 t# p, ~
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);* D4 v: s4 m, F3 i: z
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    % ~6 [2 V" D0 i% m( y) X& V7 g

  13. / `2 ?2 {+ y0 i: U  n
  14.     HAL_TIM_Base_Start(&htim3);
    ( @, I* |7 |1 }( g7 s9 Q& b
  15.     HAL_TIM_Base_Start(&htim4);+ D' Q( Q  Q5 q, e* I5 w

  16. & m) f  J9 y) u# R: D+ X
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)
    5 r5 @7 D4 O9 r$ p1 U7 R* F+ h
  18.       ;: F% L2 C1 m# J: t# p# a' H8 d
  19.     HAL_TIM_Base_Stop(&htim4);, N1 v& y+ Z9 Y* i4 K- T9 z# Y
  20. ' y) y5 j7 \8 j/ t! t
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    * h, L3 A/ C0 x4 A$ T; ^4 d
  22.       ;2 V; S; z: @3 V
  23.     HAL_TIM_Base_Stop(&htim3);
    5 I+ m! \7 s! {
  24.   }
    ' ~4 n& g1 f& `) n# X/ Q
  25.   else
    . L8 l3 v; N; e0 _( T8 Q  K
  26.   {# |6 o, P$ {3 U- m* E
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    $ e% f/ |( }9 O' Q% X" c9 B

  28. 7 d) C! I! C' U
  29.     HAL_TIM_Base_Start(&htim3);
    2 t9 l* w9 I, L0 j
  30. ; {" v5 T3 _7 |4 `4 l4 `
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    . l( O: f# G# A- ^# ?+ u
  32.       ;
    " o" I9 V1 f/ U7 ^2 v9 n
  33.     HAL_TIM_Base_Stop(&htim3);( g- p) V$ E8 r  ]
  34.   }1 L+ ^. F: X& }. B3 b9 U- d
  35. }
复制代码

$ `, N4 v8 u8 e- _8 z$ m5 t( }转载自:啊哈哈昊啊
) A3 m2 S& _7 w* y5 o# g9 s如有侵权请联系删除
5 z; C. x3 m! }* f4 W: V: O2 r; k$ I9 G
收藏 评论0 发布时间:2023-11-7 16:56

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版