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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。: K0 j1 T4 v/ `* Z7 c3 s: X% z7 \# k
, i# n5 E8 {& R$ r
实现原理
6 {( [* b  A2 a# G使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。
+ k. M% D1 j" m0 _  x5 [
! l" G! h, a0 w8 x. h  T
微信图片_20231107165542.png
* Q. `" P  e8 f3 w9 p, M

9 z8 L& v1 V2 Y* g, `+ U' p$ M假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:' m5 E- w& u3 q  Y" t- V7 y

# K" j+ c3 E5 _主定时器:0x186A0 & 0xFFFF = 0x86A0
, P0 N8 U4 |. y, ^; W0 N

# v# {/ ]7 |4 b; s从定时器:0x186A0 >> 16 = 1
7 `7 P9 r6 O* m4 m7 x/ L
6 B8 }2 Q9 L! o. f1 _0 z5 e根据计算演示100000us,从定时器会被触发一次。
. R# H  p- C$ R4 E; ?8 G6 k5 l" t' S  x, M/ l
主从定时器的选择有一定依赖关系,具体可参见下表4 l& B; R; X; `  k" u

; y7 c. v5 V9 m( o" H
微信图片_20231107165535.png

" Q" n4 Q: E4 w) n

0 \8 W# U+ N$ M* h5 u: e目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR2
  }2 u$ q$ @3 m, i, |* a2 H+ I* m$ E0 D- j( H' u2 N0 R
微信图片_20231107165529.png

( `2 m% |2 a! D6 ?

# I7 _. @2 }& O, L8 \- E2 }4 B5 ?时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us
- B* g, r8 J4 N/ M) ?- ?
& \! E) w+ B4 a: p- X" V- ?3 M
微信图片_20231107165015.png
- C% U( c* Z: _: L) D

! k/ T; w+ Z- J. V& Y/ C2 g从定时器配置& C4 ^# ]. I- I* N
! S- R( d3 u7 d) f
微信图片_20231107165010.png
( f* E0 F5 \9 o& Y
7 w" _* E- ?6 B# X, r/ Y
slave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset  ~! x! S$ r0 o) q/ a

8 ~# o0 c0 l7 T% K* |1 @

  U5 p& e$ Z1 _& _代码实现
: V% C( @  G/ Y$ V  ~
  1. void delay(uint32_t nus);( g9 b* {7 x' ~/ m* a: _  a( P# U
  2. {
    . ~: P4 B7 f, p- O+ |
  3.   uint32_t MSB = 0;
    ; c: c3 U+ u2 h) x$ G' j( n* `. B
  4.   uint32_t LSB = 0;
    7 k3 l4 L! A0 g" g- k% D

  5. , U% j& U" G5 O. a2 a1 Z% t
  6.   MSB = nus >> 16;
    * s2 p" s- Y- w/ C
  7.   LSB = nus & 0xFFFF;
    " H( c: J8 `$ _; e8 u) b- w
  8. 8 p; u# ]; r% F  {5 q5 F
  9.   if (nus > 0xFFFF)) m6 E* ^$ J' D* ?" x9 v( ^$ S
  10.   {5 F( y) c5 ]7 w. V
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);
    ; r' M6 S5 ?1 r2 l
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
      q& m/ Q; G8 m3 e
  13. 2 D' V2 ^" i( j* ^" \+ H1 E" c
  14.     HAL_TIM_Base_Start(&htim3);
    2 ^) Y& Y2 m+ _# U% P" n
  15.     HAL_TIM_Base_Start(&htim4);- d  s" m9 x6 y) ?

  16. ) K7 M+ F6 `" [* C
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)
    - {+ S, P. h+ h$ a+ l  C
  18.       ;* q0 d$ f! }6 a3 Q
  19.     HAL_TIM_Base_Stop(&htim4);
    # \% U. d6 i# o, o

  20. & x* d9 F3 |0 f4 n  a
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)- d( ^) E  i" {0 Q
  22.       ;
    ) P% ]( S  M) p$ S8 _5 u
  23.     HAL_TIM_Base_Stop(&htim3);4 C/ ^5 C5 X) [! e' B7 J, {
  24.   }; b  V& u: o9 \( ~
  25.   else: X8 o2 W6 d/ b9 f
  26.   {
    6 Z: ~. O2 ]1 _7 t
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    / {/ u6 u. ~4 d8 R+ j3 ^: k

  28. & [0 A; Y, x( K9 ]. G
  29.     HAL_TIM_Base_Start(&htim3);. |) k: ~% O3 ~4 i  o! A  b

  30. * |, M3 o& s1 d& }
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)& x- z' l, B+ H
  32.       ;' }6 k' l/ [9 a% {: M7 A6 B' d
  33.     HAL_TIM_Base_Stop(&htim3);5 e& I5 j1 J+ L0 H* F1 A7 w
  34.   }
    ( l% k! e& u  @
  35. }
复制代码

/ t4 l* g* g2 Y/ E0 N1 R转载自:啊哈哈昊啊
7 F4 A  M9 I+ P1 t( r. G, |如有侵权请联系删除
  `) C' m% Y+ v: _# m
收藏 评论0 发布时间:2023-11-7 16:56

举报

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