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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。
3 T( Q8 A6 {; ]8 L0 ~0 l+ l) t7 V5 O
实现原理& U( {& h' G& P" {
使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。9 P- l- L7 r) D& a' K( g5 G# k

0 f* z  X  u0 t0 E( Q
微信图片_20231107165542.png

* M4 g. K0 _' P9 o2 S9 f% y* g
7 N0 [; c, Z: X
假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:
" y" N2 ]8 l/ c) U6 R
/ Z2 T5 V/ E; l- r5 Z4 L; B主定时器:0x186A0 & 0xFFFF = 0x86A0
1 D1 }2 J; O, N. {

& t- u. t7 e9 L9 n# g$ l从定时器:0x186A0 >> 16 = 1. J. m: C7 F7 w& c! }
3 ]% F* N# M2 A
根据计算演示100000us,从定时器会被触发一次。
5 [* Z8 k& N( U+ ^5 @2 B$ D6 J, ?( m0 F, B" G
主从定时器的选择有一定依赖关系,具体可参见下表
/ {: `6 B7 H% s
0 R( f1 H3 ]  {  Z# `
微信图片_20231107165535.png
6 Q- _! t! j4 [% s0 Y' {

: x3 h) z( m: O$ T6 k) u目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR2& Q% o6 V! }# B; P
% Y5 C+ G- }9 j; I2 p( R" x
微信图片_20231107165529.png

4 ]! j, g8 v! ]+ c$ H  Q0 ?1 `, N' x

6 u. b8 F. h0 V时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us( [- U" E* t+ K/ R+ l) I
7 P. g" B  L* D
微信图片_20231107165015.png
5 G6 h& V8 r1 r/ M

9 K3 f: j1 M5 G$ N( ?从定时器配置
1 X2 W; y2 a8 p+ z0 {' U4 U. \4 H. x; k; j
微信图片_20231107165010.png
: y' L* R) Q0 u* A; E
9 C/ [: S' E( @" k6 b6 u
slave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset) G$ @) N6 s7 k) i1 j2 R* p4 Z$ C

% ~: m1 V# @; `7 A8 o# J

" Y! D& x. i' Q9 V( q" X代码实现0 k7 A# u  _# T( |- n+ @; e3 E
  1. void delay(uint32_t nus);
    6 n" [) r7 i9 M+ t1 G& I
  2. {+ b* a4 s# U- s$ S5 g3 z
  3.   uint32_t MSB = 0;
    # p* w* {& t2 s6 Q/ V# ?" ^
  4.   uint32_t LSB = 0;
    7 a9 @4 h  X, H- N& U
  5. * B7 F& \: c5 }0 ?! E8 U/ D
  6.   MSB = nus >> 16;
    . F; {1 t; \( ?# J5 J5 S7 i
  7.   LSB = nus & 0xFFFF;
    " |6 i' {8 h' @# n& ^  m

  8. 4 T- \( b& Y* j" M8 N
  9.   if (nus > 0xFFFF)  a$ W: |( e! ]5 i$ |* ]
  10.   {7 m+ F* v6 \1 v0 {8 O% ^
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);
    & {# @* u# o# R7 m9 A+ H
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    8 E) [( Q8 {$ J3 w; C  h- e

  13. * ]$ t, q6 I; f. B2 x* b2 h4 Z
  14.     HAL_TIM_Base_Start(&htim3);3 N7 W! v4 O* |! L5 h1 P
  15.     HAL_TIM_Base_Start(&htim4);
    - g. C  y" H( k+ h8 Q

  16. * m- g4 |8 P( E8 s1 W
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)& Z& o- T- Z& B; Y2 f1 b( N4 z
  18.       ;
    * }% N3 F. _" \) X; t. d
  19.     HAL_TIM_Base_Stop(&htim4);
    5 o) E+ N+ `7 Z; ^" P( E) b5 k9 N

  20. 9 J6 n1 b9 D7 |, y; \1 T% J
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    8 M5 ]) @! a9 N% o% S
  22.       ;
    / T7 U- V. w' }' l- x% N
  23.     HAL_TIM_Base_Stop(&htim3);5 l1 U. \( u* _( H, y( t
  24.   }% G; L( J  v- o( X
  25.   else
    . ?0 W. ]# I4 M0 n6 M+ M
  26.   {3 C) ^1 R1 i5 N+ X
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);/ [9 r5 V" L4 F

  28. 4 B3 B6 p  E9 {9 Q' r+ Z" R5 G
  29.     HAL_TIM_Base_Start(&htim3);! D) @1 G3 |  A# l, h

  30. 2 t) _9 s& u6 K. q+ f7 U
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    $ a7 O7 \: Y. A/ P
  32.       ;# ]8 x; Y$ S: u1 l, k
  33.     HAL_TIM_Base_Stop(&htim3);
    9 b  }4 r+ C2 v1 A. [- \( Q1 b% b
  34.   }" N; x/ A# ?1 c+ M8 @+ b8 p6 T( z: z) @
  35. }
复制代码

1 [* X9 q6 s& A% o转载自:啊哈哈昊啊
6 l& n+ k3 C+ d$ C如有侵权请联系删除3 G, O1 F2 U: [8 `7 }
赞 收藏 评论0 发布时间:2023-11-7 16:56

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版