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

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

[复制链接]
STMCU小助手 发布时间:2022-3-18 22:24
  STM32F103单片机中定时器分为3种,高级定时器、通用定时器、基本定时器。
2 y2 U; l, |* h6 ^% D, q: v0 T
# g* M+ J! P; Q/ @  基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源。( Y' x+ Y4 o; c. l" m0 J  X8 i
! A/ `0 Q: ^) c/ K+ l4 ^% e
TIM6和TIM7定时器的主要功能包括:
; ?# z! I( s/ E2 C3 N
5 I7 U8 m* `) Q- ?1 e16位自动重装载累加计数器" g& l5 P- I8 q- Q) z9 l; c; q. E# m
16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值分频4 r2 s* Z  G5 ?$ M( o- r
触发DAC的同步电路4 g+ {6 h3 Z6 L& L3 X3 E4 }4 w
在更新事件(计数器溢出)时产生中断/DMA请求
4 f; s; E0 t' `, E; m# o  这个可编程定时器的主要部分是一个带有自动重装载的16位累加计数器,计数器的时钟通过一个预分频器得到。软件可以读写计数器、自动重装载寄存器和预分频寄存器,即使计数器运行时也可以操作。+ V$ o* i& B7 L4 [8 p

9 s- ~' T0 f. O' M9 l" y4 b: C  通过上面的介绍可以看出,基本定时器的功能很简单,就只是提供一个简单的定时功能。下面通过代码演示基本定时器的定时功能:
  1. // 中断优先级配置
    * Z0 A. Z8 v# S* ?
  2. static void TIM6_NVIC_Config(void), i) t, z! J7 D2 m( T' W, B
  3. {
    5 D( ?# w5 ~, R$ A
  4.     NVIC_InitTypeDef NVIC_InitStructure;
    + P9 G0 T# t4 I  r  z( c
  5. 5 @0 p/ E( ?/ L1 {
  6.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                          // 设置中断组为0                9 s5 ^: P1 g  m+ _3 b3 ]
  7.     NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn ;                // 设置中断来源                , ^1 y$ [7 Y0 }5 A- y2 s
  8.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;         // 设置主优先级为 0          ) b" F4 q% f7 \2 A% V) f
  9.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                // 设置抢占优先级为3. t5 \6 A! e- V$ s' w- @
  10.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;- @+ |& K/ o; R5 ^4 x$ b
  11.     NVIC_Init(&NVIC_InitStructure);* V6 Y. \- C/ I& W
  12. }
    " |3 y9 @# y6 r! L% h  G2 ~' N
  13. /*$ q, X: G8 P+ x' u% m
  14. * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
    1 u$ {  u: g& a& V
  15. * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,$ s; U2 ]! }' L  |. }5 q
  16. * 另外三个成员是通用定时器和高级定时器才有.7 H3 ~6 o) l$ Z3 C9 ?0 M
  17. *-----------------------------------------------------------------------------
    % B, ]- J! x5 `2 I: V
  18. *typedef struct; z' o, a& V) e2 K8 Q) [! ^
  19. *{ TIM_Prescaler            都有" M. E9 ^' U3 g9 f& M- p
  20. *        TIM_CounterMode                             TIMx,x[6,7]没有,其他都有
    ) D5 \# G. x& x1 ]
  21. *  TIM_Period               都有
    , Q' h; e8 R" _' J1 \  r
  22. *  TIM_ClockDivision        TIMx,x[6,7]没有,其他都有
    8 E- B% n1 D( \& j% s, b
  23. *  TIM_RepetitionCounter    TIMx,x[1,8,15,16,17]才有" _. d# G9 f7 [# Z$ ^$ @
  24. *}TIM_TimeBaseInitTypeDef;
    ; [( l: P! t6 `5 V! S, i' y
  25. *-----------------------------------------------------------------------------  v, k( N! Q' X$ @1 }% N" N
  26. */- J0 v" |9 u8 S5 S; p% r
  27. static void TIM6_Mode_Config(u16 arr, u16 psc)' K1 l; c  X( F* k' g8 J  H
  28. {
    3 }: V3 P1 P6 z
  29.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;# q2 q2 u+ [/ F$ g0 T8 p2 j0 k
  30. % V8 [# f3 Z4 f: }4 h8 a
  31.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); // 开启定时器时钟,即内部时钟CK_INT=72M               
    4 j$ X! K7 O3 I0 D6 f
  32.     TIM_TimeBaseStructure.TIM_Period = arr;        // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断          ' `, ^5 x8 X7 k
  33.     TIM_TimeBaseStructure.TIM_Prescaler= psc;   // 时钟预分频数为                + x- e  J% F1 Y. x- {  l- T5 C/ j
  34.       //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                // 时钟分频因子 ,基本定时器没有,不用管                " D, e: y. y( o; D6 b+ z5 C. g  B
  35.       //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;         // 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置               
      P+ f% A* v: J" |# m/ r( M4 z" r
  36.      //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;        // 重复计数器的值,基本定时器没有,不用管         
    % j+ m. K: V" K$ W8 ~* C
  37.     TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);        // 初始化定时器                7 w! V% k+ h& ?* H6 K1 E
  38.     TIM_ClearFlag(TIM6, TIM_FLAG_Update);                // 清除计数器中断标志位                : y' P4 v/ N7 k4 v- p4 g
  39.     TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);     // 开启计数器中断               
    ; D8 r4 T. y( q& @
  40.     TIM_Cmd(TIM6, ENABLE);                                       // 使能计数器( ~# |* d4 R( V6 M+ p: ?- ]) w
  41. }
    " [0 Q% L7 _1 D4 F. G
  42. 8 F2 s( x/ `- }' u! b
  43. void TIM6_Init(void)9 t% J) s5 j8 R; c% I
  44. {) \+ B1 T6 L5 B# x' n. i
  45.         TIM6_NVIC_Config();% Q. J+ m1 f: g3 w
  46.         TIM6_Mode_Config(10-1,72-1);$ m( {- p5 V; h  @3 Y9 h7 L; K
  47. }
    & `' N+ n: ?1 g1 D, f
  48. ' W- _' f5 b. m1 m. |& y
  49. void  TIM6_IRQHandler ( void )& Q' `% a# Y! ^; ~7 t2 _9 }
  50. {
    4 v8 W& p; p9 {* M
  51.     if ( TIM_GetITStatus( TIM6, TIM_IT_Update ) != RESET )# b: `0 h# G2 A
  52.     {) D0 z" `  ~5 ?( d
  53.         LED0=!LED0;% e& F& N8 |$ Y
  54.         TIM_ClearITPendingBit( TIM6, TIM_FLAG_Update );
      {% [  q- M, K$ F$ M
  55.     }
    # e& w  M) s$ o3 U+ }. ^
  56. }# H' L3 Y! [& R; c9 m5 L
复制代码

0 `; \( V1 F0 ^, s! W) T: T  基本定时器的初始化高级定时器和通用定时器简单很多,只需要设置定时器的周期值和时钟分频系数就可以了。如果要使用中断功能时,需要设置NVIC寄存器,这个寄存器主要是用来设置中断优先级。1 F+ t/ O( n- ~# B, B$ m

% B6 T  [! a8 S
  1. int main(void)# \6 h# v: s& T6 W; `
  2. {
    9 g) d1 z$ D# l8 z" G- N
  3.     u8 key = 0;
    5 O7 q, ?6 H: v. H
  4.     delay_init();       //延时函数初始化$ j/ b# K; ]7 _5 Z- o$ y1 f0 K* M/ i
  5.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);; |  x. s" a# D9 t- s
  6.     LED_Init();! O; y( e% b3 W
  7.     KEY_Init();  
    & L' j( c! G" T9 e
  8.     TIM6_Init();                   + J9 n+ J; S0 z8 Z/ |5 k+ d
  9.     while(1)
    + |' F! F0 b2 c& J+ i6 K6 ~
  10.     {      
    # b3 a# [0 l& ~) @* n) T& Z
  11.     }
    - D, j1 t3 G0 B" |
  12. }# w1 \) x* ?' T2 a
复制代码
  H, }4 \2 I5 b0 [5 Z
  在主函数中调用定时器初始化函数后,定时器就开始工作了。定时器时间计算公式为(arr+1)*(psc+1)/72MHz,将参数9、71带入公式后,计算出定时器的定时周期值为10us。* X; m- O5 k' \3 A; ~9 P8 `
; e  Z  M5 J9 Q5 J5 K

, H7 r6 [  u5 l3 U3 `) L0 y
( G* L6 p* g( c" i) K+ U  o
收藏 评论0 发布时间:2022-3-18 22:24

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版