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

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

[复制链接]
STMCU小助手 发布时间:2022-3-18 22:24
  STM32F103单片机中定时器分为3种,高级定时器、通用定时器、基本定时器。6 B9 }; [3 k) C0 \" f( M9 G5 q: C

5 U9 X9 c' W/ B  ^  基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源。
+ w9 |9 k5 Q7 M+ k
& d0 d  M. u2 DTIM6和TIM7定时器的主要功能包括:8 R* m+ e$ D) t9 O1 g  _1 t
) A+ ^& f( q9 B1 M, [4 [. V. \  g) z
16位自动重装载累加计数器: H# V; o. b" \- H- C' x9 w2 j1 D
16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值分频* m" y, f# z9 y$ R$ q, E* w2 w9 l$ {
触发DAC的同步电路5 `. L1 o( d. p+ e1 C; m
在更新事件(计数器溢出)时产生中断/DMA请求
' }( ]% w3 }; i6 b  这个可编程定时器的主要部分是一个带有自动重装载的16位累加计数器,计数器的时钟通过一个预分频器得到。软件可以读写计数器、自动重装载寄存器和预分频寄存器,即使计数器运行时也可以操作。! K+ F. J' v. M$ g- u. O# V

. W( `; T% r, c2 e/ r4 T8 V  通过上面的介绍可以看出,基本定时器的功能很简单,就只是提供一个简单的定时功能。下面通过代码演示基本定时器的定时功能:
  1. // 中断优先级配置% c0 H3 c, i# ~( d9 I) \5 _! E) B
  2. static void TIM6_NVIC_Config(void)
    2 K3 {) q% _5 K1 O* R9 G! |& ?
  3. {
    " A9 D6 X( m, q& r0 Z$ m# K
  4.     NVIC_InitTypeDef NVIC_InitStructure;
    5 a0 Q6 S& G0 `4 }
  5. & [3 e% [' v% P& W' J9 Q# z
  6.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                          // 设置中断组为0               
    $ g+ j2 P9 ^! s5 f! G8 Y
  7.     NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn ;                // 设置中断来源                * O1 I1 p& _# @( o' F- K/ L
  8.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;         // 设置主优先级为 0         
    - n, g/ L$ P9 x5 I5 e' G
  9.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                // 设置抢占优先级为3
    9 Y1 ]6 U( s2 q- N: W
  10.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    8 P# r1 a6 {/ {/ D, }( a
  11.     NVIC_Init(&NVIC_InitStructure);
    * K6 j! N  X4 U7 _; ?
  12. }8 x8 d0 d, Y6 S( r8 |( u
  13. /*7 Y5 ?2 s+ ~2 t* f- D
  14. * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
    " A- S4 l2 k0 \
  15. * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
    3 G+ K' X* h5 U+ H1 D
  16. * 另外三个成员是通用定时器和高级定时器才有.) Q1 ?5 d2 l) Q4 c) j
  17. *-----------------------------------------------------------------------------3 u) N4 |1 [  O' ?6 h/ `6 ~
  18. *typedef struct
    4 ]* j! F* y. _4 i, C/ ?# J3 h
  19. *{ TIM_Prescaler            都有" i7 c* ?$ T& r8 D/ ]
  20. *        TIM_CounterMode                             TIMx,x[6,7]没有,其他都有; K. s9 q! f$ K8 ?  Q: M4 D
  21. *  TIM_Period               都有% B% y, _' Z3 O, z  l, d
  22. *  TIM_ClockDivision        TIMx,x[6,7]没有,其他都有' a+ q0 z  W4 {! S# k; a: `
  23. *  TIM_RepetitionCounter    TIMx,x[1,8,15,16,17]才有
    + J) }' z5 b- \6 Y9 P" ]
  24. *}TIM_TimeBaseInitTypeDef; 9 o' I; K5 N2 O9 O
  25. *-----------------------------------------------------------------------------( L1 c% a/ P, ~
  26. */8 _3 ]2 U9 }) @2 Y8 V" m$ x" V
  27. static void TIM6_Mode_Config(u16 arr, u16 psc)( }9 V: ]% @. i
  28. {; ~' V$ A! j! \! W
  29.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    8 V" v/ Y2 z. D! ^9 T
  30. 8 N) C1 Y) Z* t/ Y3 G! A& ^! h$ N
  31.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); // 开启定时器时钟,即内部时钟CK_INT=72M               
    ( D0 `$ p7 r8 x4 K2 V8 k" J
  32.     TIM_TimeBaseStructure.TIM_Period = arr;        // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断         
    1 |* m4 h. j* N9 Z8 }& M  Q
  33.     TIM_TimeBaseStructure.TIM_Prescaler= psc;   // 时钟预分频数为               
    ! y; [5 p; ?  B" |
  34.       //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                // 时钟分频因子 ,基本定时器没有,不用管                $ K, L! p! M# f: A* {
  35.       //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;         // 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置                1 s' T0 f5 l/ }# F" _8 f1 G
  36.      //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;        // 重复计数器的值,基本定时器没有,不用管          - \) A& ~6 ]" L! R( L& E4 w9 U0 i
  37.     TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);        // 初始化定时器               
    4 |0 h2 j' h  `8 K
  38.     TIM_ClearFlag(TIM6, TIM_FLAG_Update);                // 清除计数器中断标志位               
    $ I' r. Q6 v* O) W
  39.     TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);     // 开启计数器中断                4 ?7 v* X9 T8 @
  40.     TIM_Cmd(TIM6, ENABLE);                                       // 使能计数器
    5 m5 R& x" B/ J4 I0 \
  41. }
    ' ]/ `7 G8 W% N. M
  42. % S9 o% W3 w. g' X7 H
  43. void TIM6_Init(void)8 U( v0 E, o- V. f
  44. {/ X+ E+ w8 N, G
  45.         TIM6_NVIC_Config();
    ' m/ k0 @1 ]3 Y1 [! Y2 H
  46.         TIM6_Mode_Config(10-1,72-1);
    7 o, d+ w+ [4 M2 K  e1 W% x
  47. }
    , d9 w7 C5 o6 C9 e% x

  48. 8 R. \2 X' P. O) F+ q4 k
  49. void  TIM6_IRQHandler ( void )
    1 z$ l0 \0 B! @( M! D$ P
  50. {
    8 @5 t& f, k- J  g
  51.     if ( TIM_GetITStatus( TIM6, TIM_IT_Update ) != RESET )* j9 ?; |1 ^) C, E6 u
  52.     {
    ) x+ e# P+ [3 ~
  53.         LED0=!LED0;4 z( Q$ B" X1 ~% C+ k1 q/ O
  54.         TIM_ClearITPendingBit( TIM6, TIM_FLAG_Update );) p2 {- Q* K5 z: p7 r  X
  55.     }
    , L) F& r2 [* d- }
  56. }7 B+ i  U2 c; u& g1 C' \* i
复制代码
& z( c7 @. a& [* d  ]/ y
  基本定时器的初始化高级定时器和通用定时器简单很多,只需要设置定时器的周期值和时钟分频系数就可以了。如果要使用中断功能时,需要设置NVIC寄存器,这个寄存器主要是用来设置中断优先级。& P; g( j- q0 X1 w7 M

# u3 W0 ^1 U5 [/ `5 B7 n7 a
  1. int main(void)
    1 o4 A+ K! ?: M3 r! W+ s1 k: J
  2. {% R) n7 X( _4 ^0 d
  3.     u8 key = 0;
    $ Q% p; U3 S' r6 O' A% C
  4.     delay_init();       //延时函数初始化
    8 N5 I  s+ P% P$ I
  5.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);2 G* J3 t- P$ M8 h- k' C
  6.     LED_Init();
    3 r3 y0 m' x( V. N# I7 S, t. q7 e
  7.     KEY_Init();  
    ; B% G$ q! W: {$ U/ r
  8.     TIM6_Init();                   ' J8 Y6 B$ |' c$ s( U$ }% H
  9.     while(1)9 @' b4 L, B. B1 w' ^0 `
  10.     {      
    / r9 E$ o0 ?2 E- ?9 r) p- \- \% p- K
  11.     }1 M% W  _6 W8 A  K# @; ~
  12. }
    8 p) [& U3 U. Y
复制代码

0 _* M- l2 i5 X! D* S: a0 V% _  在主函数中调用定时器初始化函数后,定时器就开始工作了。定时器时间计算公式为(arr+1)*(psc+1)/72MHz,将参数9、71带入公式后,计算出定时器的定时周期值为10us。: j" |( \9 q8 ^. f  Y

4 X' p: w" H/ ]" D3 w. f; ^* ^
  [1 k* F2 G  V4 Y! {) L0 A( f, }8 A, @' P8 h
赞 收藏 评论0 发布时间:2022-3-18 22:24

举报

0个回答

所属标签

相似技术帖

官网相关资源

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