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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。
: S4 {% |% W- X4 p
$ p9 X& F  a0 H0 e' Q实现原理
+ W' k9 P( q+ i# }使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。
* B& d  o) X! T7 ~+ r) y
2 j4 R  e" j7 P* ~
微信图片_20231107165542.png

+ L' i* R& H7 z- M( Q" R2 W$ c0 `
7 D- n! t0 {1 \9 f
假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:3 e, d: L9 t, A4 u
1 P/ Z0 s  K& T( `
主定时器:0x186A0 & 0xFFFF = 0x86A0$ U: e: p' Z4 C# a4 _8 N
, C3 n  t6 X  p. C3 A$ k. l
从定时器:0x186A0 >> 16 = 1
# E* x8 P0 \4 P. g, W5 [5 F) k
$ q6 [: D# E, p' l# s7 F" t根据计算演示100000us,从定时器会被触发一次。
0 J% Z7 @; A" w: @% r# \( c
) G7 \3 R" {  K( p2 W主从定时器的选择有一定依赖关系,具体可参见下表7 ]; ]2 c$ O  D! @2 m

+ I+ U4 y; E0 ~: A8 ^! d- ~
微信图片_20231107165535.png

3 G9 v+ Z9 J+ r. Y7 S: U2 d/ c
& i; L7 ^3 |8 E9 Q6 f, C0 J
目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR2
( A  r$ z- @7 D$ z9 U6 y1 {2 i( E; X
微信图片_20231107165529.png

; V* M& z) {( n$ `  N7 L4 c- P& T1 A
( J' U8 e# G# y& a5 `
时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us9 k; e4 F; |5 }* ^7 D: E/ N* W" ]3 K
# P5 I- z, t. p0 R
微信图片_20231107165015.png

- J6 W# Q0 i5 v+ _0 ^, h& R& W6 ~  W  E
从定时器配置( h* h5 m8 {' B- h
- q* }1 x, _; ]# z- T
微信图片_20231107165010.png
* `% v% X9 A+ w, [' w. g  w

2 a0 \: F$ V5 x& k7 i! G% Hslave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset
5 W" l! o" F: N. M  s0 _; m6 H
- |+ P8 i% n% X- ?7 ]

% J0 E( V) r  L代码实现) l- R) F5 ?9 _; G# U0 ]
  1. void delay(uint32_t nus);" s9 `8 p- |* k8 a1 T: i/ O9 C  R
  2. {5 T/ U' N' y  O# Q9 t
  3.   uint32_t MSB = 0;
    1 u  j/ f6 y& C' i, ]8 c/ _
  4.   uint32_t LSB = 0;& M' t1 U# S6 Z/ [' W- S( O7 J
  5. + r9 v+ I( Q/ P9 q- `6 J+ d- A
  6.   MSB = nus >> 16;2 S- w( q9 N; K5 W" a& J
  7.   LSB = nus & 0xFFFF;
    5 t0 y" P, a3 F  r* D- [9 \/ v
  8. 5 {/ ^$ z& R9 }) {# }6 ?9 B
  9.   if (nus > 0xFFFF)! i. }/ N6 t  ^6 h2 \- t
  10.   {
    3 @: x! d; B7 S
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);5 X  C6 `2 O. r1 K
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);4 C. n; D" ^, D) R/ A7 T9 c" @1 X) j
  13. , M3 _( I; O. @7 u
  14.     HAL_TIM_Base_Start(&htim3);
    1 L5 O. n  f1 u" X* N. e; {' @  X6 l
  15.     HAL_TIM_Base_Start(&htim4);
    ( A) r% d% a8 H+ M5 K5 t
  16. ( F$ p- @. S; d
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)- v; Q) d" w% T3 O/ ?8 n
  18.       ;
    1 [! w" s+ g( S7 O7 ?0 W0 _
  19.     HAL_TIM_Base_Stop(&htim4);
    , N' @7 h2 k3 a3 w( k1 ~

  20. 2 q8 o, O9 Z& E& ~' J* b, s+ Q
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    ) d) K0 d, Q& ^8 B( p+ I$ L
  22.       ;
    7 t, j, E! m( M) s
  23.     HAL_TIM_Base_Stop(&htim3);9 c; _5 I7 o$ f) I% T  n) W
  24.   }
    ( B3 |: m' d6 g7 T
  25.   else
    + w; Z9 g- U4 u  j7 X
  26.   {
    0 O- B0 @: V" T
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    ; `. s9 }4 @6 p% ]  ?% [+ X

  28. * ?5 x, `  F1 t' i
  29.     HAL_TIM_Base_Start(&htim3);
    ; J  k) t0 \8 i2 D

  30. 5 y2 k0 m( ^! @1 i6 _  r
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    . _( B: S2 |* S, u: ?6 ?
  32.       ;3 ?9 A( e, V2 t/ u) ^
  33.     HAL_TIM_Base_Stop(&htim3);
    / `' H" V4 v0 a. Y5 z9 c: j& N7 t
  34.   }
    $ J* w. I. j$ n9 Y; s
  35. }
复制代码

* s) v7 e" A2 o. `+ o9 U转载自:啊哈哈昊啊
0 i3 [( r6 _, y4 q/ z如有侵权请联系删除$ X8 A+ e! J+ r' M) P  m5 A
收藏 评论0 发布时间:2023-11-7 16:56

举报

0个回答

所属标签

相似技术帖

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