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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。6 w# q# d( p! t+ E) E1 |3 V

9 h, [7 l# O; d0 o9 Z实现原理$ i9 V" q8 y. L' S, `8 |
使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。1 b4 w0 k/ K7 Z* A
, w" ~8 D' y) a9 [
微信图片_20231107165542.png
; s3 ^  A9 |. E) Z' X5 A

: w$ P0 M4 S5 U. {5 I/ p假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:
4 F9 N9 ]5 l; {( A- ^% i" W. }
! J9 R- s/ p# @* k* m$ J# M主定时器:0x186A0 & 0xFFFF = 0x86A0
, I, g% k' g3 {  x5 B1 V8 u
6 m9 x* ^7 W4 t( N3 \0 X3 @
从定时器:0x186A0 >> 16 = 1/ M1 P* a/ l0 E" Q+ v. Y% Y
# Z2 ?- R/ k& g% i% [4 B
根据计算演示100000us,从定时器会被触发一次。2 m3 O( s. U5 U5 H
$ X# V$ |2 \# W) [
主从定时器的选择有一定依赖关系,具体可参见下表
8 n' b" I5 l7 }# W& ?& G' h$ K' j% a* x% T* u+ Q- j( X
微信图片_20231107165535.png
" X& }" e" `/ V0 x7 S/ [

5 {" U3 X2 u; u4 M3 G- o3 C2 u目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR2
* G$ f9 U. ~: o5 Y3 I- [
. {  ~3 ~# l) B$ K; [+ ~; u( h* d
微信图片_20231107165529.png

7 L. E7 Q2 W) y9 H
8 E' ^' n  |- ?- b
时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us7 `% g; ~$ M7 T: r
+ L* s1 O1 f3 F8 I
微信图片_20231107165015.png
4 e. W) E. R4 A: }
% y, [' ?3 x: [+ S* v
从定时器配置
1 D  I, a" s( r% e0 m
  `" g0 ^4 y# T( @0 E
微信图片_20231107165010.png
; u3 B) M# A* t2 K/ q  p
$ {2 p" Y, z, s" P* {$ o
slave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset4 J' K5 A* w+ N! N  g

# p( \# C3 _  U. r7 U' x7 {
; f' ]) o2 I% G2 ]2 b8 c- e0 U
代码实现. ^/ v( L# C3 b( `: d7 |
  1. void delay(uint32_t nus);+ B6 g1 m& s+ \0 l3 A- L% i
  2. {
    2 F  Q% T6 F: r/ ?6 J* R
  3.   uint32_t MSB = 0;% N# e% k  c5 [, p- ^% w
  4.   uint32_t LSB = 0;
    ' @; |4 X9 w8 u

  5. ( s9 \/ n$ n. E/ |  Y7 @/ v
  6.   MSB = nus >> 16;
    9 D5 G2 j) j1 B$ x
  7.   LSB = nus & 0xFFFF;
    ! D( m. Y6 X) ]! G1 j8 U: ~
  8. % q; @' V/ s. ]5 y- m$ \
  9.   if (nus > 0xFFFF)
      v% g# q' r# K7 L- j
  10.   {9 p4 L: q- S+ G, G% b& o0 }# `
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);1 ~9 }0 [8 E( S, `0 `2 }
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);5 p1 q1 a! q) Q; d' H( ~$ N9 R  ?: j

  13. / s- K1 |1 F1 J, w0 B) d2 m) n& O
  14.     HAL_TIM_Base_Start(&htim3);" l$ I) l( M" J* d
  15.     HAL_TIM_Base_Start(&htim4);
    + |3 z5 y. l1 @) x# Q- g
  16. 8 f/ z! O$ B/ ]3 {5 u
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0): g* d5 h. X+ `5 s7 b
  18.       ;
    5 q& o: n) w: q7 v
  19.     HAL_TIM_Base_Stop(&htim4);
    - X! c6 \) D, g( X

  20. 7 X1 C: i1 P7 \. E3 a! B
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)! H, A% U8 X! I. J
  22.       ;
    ' U% g0 I( h0 p0 F) h
  23.     HAL_TIM_Base_Stop(&htim3);
    ) P& P3 {8 H6 p) A+ d
  24.   }; I/ x9 c: k3 l) U& a
  25.   else6 W: d8 o2 l. S  N2 Q* l
  26.   {9 W  I3 K: K$ ~2 i; R8 C: g: T! X
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);! ?5 M3 W& z# [2 r& M
  28. 6 t! x5 X; w. \2 ]9 J: h  R! S
  29.     HAL_TIM_Base_Start(&htim3);
    ' z# D- I" x% M* ]: F% y# |, J

  30. * h' N3 l3 R1 m. n2 Z
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    9 {: S% I2 b# T7 H
  32.       ;" O  a: E- w# k! ?
  33.     HAL_TIM_Base_Stop(&htim3);- z  m5 V9 p8 N0 \7 P7 J! N* P2 Y, j
  34.   }) q  z. X5 `) _) ]; {- Y
  35. }
复制代码

4 l# P( h  F- x+ Q5 @/ S转载自:啊哈哈昊啊) `8 q- m( i# V* y" O. O
如有侵权请联系删除9 y4 {! k" A  P7 o' d
收藏 评论0 发布时间:2023-11-7 16:56

举报

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