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

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

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

) `2 V" c& \! }% S7 Z, ^: M实现原理7 v6 W5 M/ ]" Y6 A" @4 v  s3 g
使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。4 |+ K! Z* J) B( A
, Z1 k. h  q1 y# m& B3 t2 `
微信图片_20231107165542.png

. [, F( M2 c0 G+ l4 e

: ~1 J/ I. `( T" \6 ^  Z假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:
% P$ T& ]/ o* k7 V6 J
" L; I* T9 \5 z" D+ U* g: Q; j主定时器:0x186A0 & 0xFFFF = 0x86A0
: T: F* x. j7 D8 Y
+ W/ l; T. H7 a/ w& U3 L5 a
从定时器:0x186A0 >> 16 = 1) }& q3 [2 f9 e. o; }

9 H; }7 V/ Y/ k4 z9 S! z# ~2 g根据计算演示100000us,从定时器会被触发一次。% {! E4 Y7 n  r* V% z: ^

/ Y- ]$ _1 I8 t( A主从定时器的选择有一定依赖关系,具体可参见下表
; T& c% d3 p4 Z
* ?( I. t9 A4 F; T$ m" |* W" u
微信图片_20231107165535.png
6 [  L' S: Q) K5 }" T) Z( L  g
2 g$ v; G- }5 a# v/ U, f) C
目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR27 }" V# z5 b  u

: p' X* N+ X9 u, q. E& _
微信图片_20231107165529.png
# d+ x1 [6 T1 l9 _9 y( h3 a
- W$ c/ h7 B" [# x
时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us" u1 X" K' c: u, A0 P
3 Z5 C: m4 [$ t. _2 U$ ?8 {
微信图片_20231107165015.png

# y6 p. n' S1 b4 d5 D8 Z0 |  c0 B9 `( l. j# x0 [) V
从定时器配置
# i, s7 M/ \' }% w
# {  P% ?5 L' ~! c( v  T+ ?
微信图片_20231107165010.png

  O1 e6 Z6 `3 k! i+ H5 V# g; z* j
8 V5 r. F* J  h" ]/ V$ bslave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset
3 I  J1 {4 S  ^3 u7 \
, A& x3 j/ f* R2 C) J& C

7 t0 t) M/ p8 ^9 D, |代码实现' W1 A2 |3 v. }
  1. void delay(uint32_t nus);. @8 G; x- |, R+ L5 i
  2. {
      T- N% v- y' _% j
  3.   uint32_t MSB = 0;* J/ y. G" n" d) u& n: p
  4.   uint32_t LSB = 0;* C- h9 n# G% z. d

  5.   X5 v/ J+ f& ]2 `! ^: i' u
  6.   MSB = nus >> 16;! [: F3 ^5 g, e/ u7 v7 S( Q, `
  7.   LSB = nus & 0xFFFF;8 k3 k) R  i2 ^6 Z2 j, B
  8. $ t4 k3 Y, o  U4 B+ t) |
  9.   if (nus > 0xFFFF)  T" a) E& d$ C8 C( [' }; x: [  y
  10.   {
    ) P  u- _: ]3 X5 \: J* d$ |
  11.     __HAL_TIM_SET_COUNTER(&htim4, MSB);
    2 _* B' {0 T1 g
  12.     __HAL_TIM_SET_COUNTER(&htim3, LSB);
    ' a9 {; H; o  ^4 }2 c1 j$ y# n
  13. ' f& z4 o8 [& S6 d2 s2 Y+ ^
  14.     HAL_TIM_Base_Start(&htim3);1 V, |+ t4 s: N( l
  15.     HAL_TIM_Base_Start(&htim4);5 B! v& {6 I0 Y9 ]
  16. ! M3 w1 p2 `8 Y8 u  C$ Y
  17.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)) V, {  w- h6 @5 K0 v
  18.       ;
    % ~  ]1 Q8 q8 b3 X
  19.     HAL_TIM_Base_Stop(&htim4);
      S5 k9 [; s" Z/ v# t

  20. / c/ W# \3 {) c! i
  21.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
    0 ^" Z3 C3 ?4 T/ k& K
  22.       ;
    4 A5 ~0 k* k) t/ @
  23.     HAL_TIM_Base_Stop(&htim3);( X( E1 f( A, D( z) b! B
  24.   }2 g! M7 p- U' v7 j
  25.   else8 n7 I5 y7 J5 P7 f5 K  I
  26.   {
    7 @6 n) o) m3 Z. ]6 a# N+ `7 C
  27.     __HAL_TIM_SET_COUNTER(&htim3, LSB);. p! ?8 f) _# J1 W% ]& @
  28. 9 `1 z, X2 X6 N( e0 w& ]
  29.     HAL_TIM_Base_Start(&htim3);
    " g1 U- ~# h5 E, [2 [

  30. 4 t' h7 {6 C$ `1 l; k7 N' y
  31.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)" v4 R+ u% ^0 C/ }7 f- U$ i
  32.       ;9 B' w. K4 _, {# J
  33.     HAL_TIM_Base_Stop(&htim3);" P* L; S9 d& n4 p8 n6 r' K) O" n
  34.   }4 {9 I6 N! u" `5 e' Y( `! n& D: G
  35. }
复制代码
+ _( x2 i* [6 t1 O9 z/ R9 _' X
转载自:啊哈哈昊啊6 \- I+ w" r- Y7 B# V
如有侵权请联系删除: d/ C0 Z- e* L4 \5 d# q$ G
收藏 评论0 发布时间:2023-11-7 16:56

举报

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