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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。! ~- w7 F) B% g$ W' ^

$ c; S8 C6 g5 q- X实现原理
/ @) s7 D* E" M* w使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。0 a' m. B4 F! S+ m# s

8 I2 Q  X8 n1 i1 X' T7 ]0 L! [
微信图片_20231107165542.png

7 Y1 U" C# ]3 J6 l7 s4 N- G% Z
- @6 _1 V) s1 q' v
假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:' N7 ~, E7 B+ z6 E2 g# F

) o$ P9 K3 ^% [5 m" h主定时器:0x186A0 & 0xFFFF = 0x86A0
3 S! e- ?6 t- f6 [

" C/ @  X, N/ p1 U5 Q# @: B从定时器:0x186A0 >> 16 = 1
- n- B2 H/ x. Q$ X2 q8 `
; r5 V4 t( i  j, Q, [根据计算演示100000us,从定时器会被触发一次。' P( I8 m* ]. C2 N
: y( \* Y* m/ B4 e! D& {
主从定时器的选择有一定依赖关系,具体可参见下表
9 p: x2 e3 x- s, l; b. q% y3 [# i6 o' `! w% q# z
微信图片_20231107165535.png
5 l$ v8 ~& @# L
6 ]" f. z7 u. f, N4 K. Y
目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR2' Z1 J* S$ h2 F4 i8 o1 r3 [* e4 Z
& v+ h' ^1 {7 L1 X7 P
微信图片_20231107165529.png
" H! h3 I1 R7 s$ y5 h4 o/ i8 m
- z- ?0 {+ E; H5 }3 k
时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us
" c# r& d! l8 {& K/ _9 L  \
$ y$ Y- J8 ]/ S% w
微信图片_20231107165015.png

. H% M" q& o+ y- q7 h: z. _, n" W+ ]% P8 h! J
从定时器配置
4 j3 c2 o# g1 _( V) o0 \
+ ?/ p: y, c4 e5 n* W
微信图片_20231107165010.png
4 N9 {2 E. C9 p; |  G

  G, S$ Q9 F5 P# m: w) h" j% O$ }slave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset
  F3 F/ j) Y! B# ^+ Y1 H9 `0 k
/ I6 W; n  `3 E! w( z; W% U' t

& e$ E- v; N, B代码实现
/ U* g9 l% G1 t) Z
  1. void delay(uint32_t nus);
    % v- [- E& l) d" ?- `
  2. {/ F( i; H4 K+ M. J& E+ d
  3.   uint32_t MSB = 0;
    . h0 i  s" n2 _' ^3 A) l5 q% R
  4.   uint32_t LSB = 0;
    6 m, R( |4 d/ r% U& ?* ~
  5. " b, D1 C% i9 g3 d( k4 i1 v
  6.   MSB = nus >> 16;) D1 c8 l% p% _  N
  7.   LSB = nus & 0xFFFF;5 P& g  B+ z" U  C0 ~  x, P( p

  8. # w& S6 A6 X4 S* b
  9.   if (nus > 0xFFFF); f! v1 o6 n2 ]6 r4 Z
  10.   {! l/ i4 E0 r& Y7 B, u  K% O
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);% y8 Y- A3 S2 W
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);1 S9 N# S  ]. E! D* V4 u
  13. ! P7 F, }& ^. I) @) D! J% E
  14.     HAL_TIM_Base_Start(&htim3);
    + z; D: H5 q# a1 D0 t' w# ~& l, |" G
  15.     HAL_TIM_Base_Start(&htim4);' _% U6 R( l! f: G
  16. / h% N8 p. H4 Z# X. |# {* d( y) N: |9 u
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)
    / d! B! e" p# P" W( F
  18.       ;
      |- n) ^# E5 T
  19.     HAL_TIM_Base_Stop(&htim4);% I6 @( v6 h" e" R5 O7 N( M& r* H
  20. , q% e! {' R8 W: O  U. W# z& I
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    ) w8 ~2 ]2 F: r6 j; ]* y% |
  22.       ;- j7 v9 D: ^5 O5 z, f" B
  23.     HAL_TIM_Base_Stop(&htim3);# Z+ }- m# V4 K/ L! Q7 S
  24.   }# T& @0 V; v: P4 @
  25.   else5 w) l& n* N$ m. X
  26.   {1 ^" k( w6 }! E% K: T2 `& T
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
      y9 X6 v) t" W* j  e- t

  28. ' X' d  Z5 q2 R7 H& k9 ?
  29.     HAL_TIM_Base_Start(&htim3);
    ' b$ B! j! `6 V4 K
  30. # ]: D3 G5 p8 w# [" P: O0 F
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)' O1 a% |  p! d" m. q2 z
  32.       ;- h- F; c6 |0 _4 ]5 t/ ]
  33.     HAL_TIM_Base_Stop(&htim3);1 ^6 N$ ], |& ~  m# {2 X* y
  34.   }
    8 `" L- t& \8 d; r  Q, Q
  35. }
复制代码

+ S$ u( ?, t0 w0 [2 x* i转载自:啊哈哈昊啊
; V! W2 C, g4 J, J, u如有侵权请联系删除
/ Z; s: O5 Z. B% R! B, [- N8 e
收藏 评论0 发布时间:2023-11-7 16:56

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版