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

【经验分享】STM32F103通用定时器使用

[复制链接]
STMCU小助手 发布时间:2022-3-19 20:18
STM32F103单片机中定时器分为3种,高级定时器、通用定时器、基本定时器。
0 D* ]8 h: V' L, e5 ~4 C" }2 R/ l# V$ ?9 ]  @" [% D! K
通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。: d& o( R, z4 V1 l$ @% l

+ A/ K% ?) s4 {' ~6 M' g通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括:$ p) G1 S' J; M
* R, j( K. V8 q0 [8 {
16位向上、向下、向上/向下自动装载计数器: y# r! d( p* L" C# k7 _
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值
" k& S& g% w: v2 B. y( w4个独立通道:
. `& \0 m! x( W, n' ?" V      输入捕获( I1 H( V+ v; f' ~; p- P3 e) o  F
      输出比较" w) Y  B2 ]9 s# _, m, T0 g
      PWM生成(边缘或中间对齐模式), K  d, |4 _  i, y5 l( f
      单脉冲模式输出
& v8 x7 J; s  v) y' A( I使用外部信号控制定时器和定时器互连的同步电路
: r' M2 [2 R. T& X如下事件发生时产生中断/DMA:* P' s; m, G( y2 I9 J" g: W3 ~4 t. N, L
      更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)3 C( Q0 o; M5 j
      触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
' a  M2 P; m, r, B% V7 c$ t      输入捕获# H/ e- Q. {3 C
      输出比较
! Q+ Y7 n  h$ q7 Q5 N2 l0 U: }% N支持针对定位的增量(正交)编码器和霍尔传感器电路' \( `1 T. U( i3 ?
触发输入作为外部时钟或者按周期的电流管理2 j* d* J( w0 d/ B
可编程通用定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。计数器、自动装载寄存器和预分频器寄存器可以由软件读写,在计数器运行时仍可以读写。5 i9 m7 i, u- D; `

& g1 h* @& F4 ?( S) F+ g
  1. void TIMER3_Init(u16 arr, u16 psc)
    1 e4 x$ J0 N9 H% Z- y3 N
  2. {
    5 }) Y0 `& e% v6 R7 `+ x2 K6 i0 u% K
  3.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    9 g# b- }3 p9 d! `
  4.     NVIC_InitTypeDef NVIC_InitStructure;. Y5 V% P; I' C- ^' T
  5.         
    + l( h; h; x3 o
  6.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    # a) X* i7 {7 g& @4 R' V$ E
  7. ( d* @+ e' w$ j# M& K
  8.     TIM_TimeBaseStructure.TIM_Period = arr;
    % `; ?5 a0 C3 m; i
  9.     TIM_TimeBaseStructure.TIM_Prescaler = psc;0 x7 V  A# ^* e+ V
  10.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    1 Z* H8 m+ v3 m+ @# g4 A
  11.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    & @- \7 @+ \4 J4 C# s
  12.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    ' d, j$ L: s7 N% C" j
  13.         3 r& v5 `$ X9 j$ S% s8 F
  14.     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);        //允许更新中断
    * N& P3 n6 H) t# b; C0 l
  15.         ' S. G% D% v7 Z0 o% s) u8 d( V
  16.     NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
    " @  R2 T2 v  _
  17.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;' i6 S+ T& T) H( w! V
  18.     NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
    0 U1 Z( I) t1 n) c7 m( Y
  19.     NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;0 n$ h/ x' `1 I# U- S
  20.     NVIC_Init(&NVIC_InitStructure);3 T8 v4 Z3 `8 k# ~9 q
  21.         
    # X6 P( r1 x9 l
  22.     TIM_Cmd(TIM3,ENABLE);
    + ]% x$ T5 S  w4 h9 ~0 H
  23. }
    7 @0 Z1 ^: J* C* H
  24. void TIM3_IRQHandler(void)" q3 Q3 }- \, H0 v
  25. {$ e; q( a7 a4 D; F2 d( t( \) D8 h
  26.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)& w+ m# p3 }3 @& k0 a: B* |6 q
  27.         {
    ) e+ j$ O5 `- J: t
  28.                 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    $ B: G# M3 P; p3 g
  29.                 LED0=!LED0;' \7 w, O; v" d
  30.         }
    4 e) H, E5 a+ z3 V+ x/ c( j0 G
  31. }
    8 F& I2 V$ e" S+ v3 M: U
复制代码

9 O, |. e: D& v1 X) t这里使用的是定时器3,在初始化时传递了两个参数,其中arr用来设置定时器的周期,PSC设置时钟的分频系数。默认定时器的时钟频率为72MHz,所以带入这两个参数后,定时器的周期计算公式为:( Y0 P3 o5 O8 c6 D! T; y, _* p* Y- @
(arr+1)*(psc+1)/72MHz,设置定时器的计数模式为向上计数。这里开启了定时器的中断功能,所以还需要设置NVIC寄存器,也就是设置定时器的中断优先级。定时器初始化完成之后,还需要提供一个定时器的中断函数,当定时器定时时间到了以后,就会自动跳转到定时器中断函数中。
0 i4 P- R( Z& a; H2 v
2 P6 z- v: v' l
  1. int main(void)- K, {& _" e$ L+ z
  2. {0 u4 \3 s2 v8 G/ z/ g
  3.     u8 key = 0;# Y7 i+ G: l& O: t2 w3 J' w+ w
  4.     delay_init();       //延时函数初始化- J! N* d4 W6 J
  5.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  g8 d: n  z: H4 f
  6.     LED_Init();
    & x" m1 P8 L( b
  7.     KEY_Init();  % \( E/ D9 z. f$ R% X% U" |/ s
  8.     TIMER3_Init(9,71);                 //50Khz  10us   
    * z/ L: ~2 L% W4 r* ^* q
  9.     while(1)
    & t' U& _5 |+ h" `# u
  10.     {      ' L% n$ G! U2 E% F2 Q6 x; L' Z
  11.     }2 S) ]% x8 O. L5 Q9 F* W
  12. }
复制代码

% Z' ?, l. F$ j" v6 d: U/ r  在主函数中初始化定时器,设置定时器分频数为71,默认的晶振频率为72MHz,进行71+1分频后的频率值为1Mhz,然后设置定时器的周期值为9+1,所以定时器的定时频率为1Mhz/(9+1)=100KHz,定时周期为10us。通过示波器观察LED管脚的电平,就可以看到LED管脚的电平每10us就会翻转一次。: q; `# ?" z) x2 V/ m6 c

5 J) w0 }8 ?0 a, |5 x3 s& n
+ Y# L8 m6 U  P8 b# c/ X$ s1 c- Q& V2 N9 f$ f* `& h4 f
赞 收藏 评论0 发布时间:2022-3-19 20:18

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版