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

基于stm32通用定时器延时实现LED闪烁经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 17:26
stm32有很多定时器,每种定时器的功能也不尽相同,今天学习了如何用通用定时器实现1s延时,使LED灯闪烁,现总结如下:
. ?& c6 w. w* g0 h. p) a
% Y; K  V  v! o" e( N
步骤总结:
# i9 V3 m( O  G, G使能定时器时钟->配置定时器结构体->清空定时器标志位->开启定时器中断->使能定时器->编写中断服务函数: y6 n) j+ j: R; R: v1 j  u; Q- Z( G

) U+ B" M4 f; T) R" r3 pTimer.c:$ ?" A( _3 a+ U( V
  1. #include "Timer.h": f7 H) d( |6 c: w' d# R6 r& P

  2. 9 m, Z9 y8 o/ C# A8 H0 C% L( u3 F
  3. void TimerBase_Config(void)
    8 E* C6 M( f, L! K! T6 e3 I. b
  4. {/ d; N: a" b; e9 ?
  5.         //开时钟- ~  `1 k5 b! z- ]  I
  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    : |' k$ ?8 F1 p! H+ R
  7.         //定义结构体变量
    % k/ l( m3 b. q: [  I. m+ p' k7 K
  8.         TIM_TimeBaseInitTypeDef TimerBaseInitStructure;1 t$ U' u! B6 U' r3 h0 d+ \0 e
  9.         NVIC_InitTypeDef NVICInitStructure;4 z- _. b& `7 v) ^  @
  10.         //配置定时器结构体
    " B; ~! U' j+ {- y
  11.         TimerBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    9 h" ?0 g9 I, n
  12.         TimerBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;: ~- V" H) [; f, }2 ?; G
  13.         TimerBaseInitStructure.TIM_Period = 10000;2 ?% w& |1 q2 s' E; a
  14.         TimerBaseInitStructure.TIM_Prescaler = 7200;
    " g; n) p* T  j0 T( A1 p) z
  15.         TIM_TimeBaseInit(TIM2, &TimerBaseInitStructure);. i2 m, u! E) Q; L
  16.         //清空标志位
    % a' ?& ], w7 j' o5 W
  17.         TIM_ClearFlag(TIM2,TIM_FLAG_Update);) W: o7 G- J; y" u4 d/ Y; |3 j8 c
  18.         //开启定时器中断
    8 b; t. O( ?; |" @; F
  19.         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
    * P0 ^6 G3 n2 w4 B! c& z7 Y( Q9 c
  20.         //使能定时器
    1 u9 k& Y( Q9 }6 u8 ?9 s) T) T
  21.         TIM_Cmd(TIM2,ENABLE);
    : f2 X$ H" H8 W
  22.         //配置NVIC结构体* c5 q. b1 C) P- C
  23.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
      o' J! r" M5 S) d3 R- Z; t- i
  24.         NVICInitStructure.NVIC_IRQChannel = TIM2_IRQn;: L- Z, s8 m2 d8 \
  25.         NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;+ U. O* r% v( c8 g7 m/ h: I& }
  26.         NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 1;6 r, x* g$ O& j9 Y/ R
  27.         NVICInitStructure.NVIC_IRQChannelSubPriority = 1;( Z( R& m4 s/ M6 I3 J% @8 J
  28.         NVIC_Init(&NVICInitStructure);
    + \- h. e( \% v' }9 z  n' y6 U
  29. }
复制代码
/ f9 m% [1 a/ i: W& I. M
# N5 \9 A! d1 u& Z- `/ p
stm32f103x_it.c:
* Y3 g# |  E) G) M4 U, a* \
  1. void TIM2_IRQHandler(void)8 d3 v& U# l8 G0 I! n2 U
  2. {+ X7 V1 M/ U  s# |4 j
  3.         static uint16_t temp;
    ! C1 U2 e; A, {( W; B
  4.        
    8 @7 p% ^* i8 W
  5.         if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)( }0 O1 L; S3 G5 y# ?
  6.         {5 R  U( W& {) h7 U
  7.                 if(temp ++ %2 == 1)1 Z0 E- F2 D. m' j) k( d( W
  8.                 {) w4 z7 b' v( T9 k
  9.                         GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);& p( w0 e; l/ r! W9 `
  10.                 }
    + ^8 q) c* a; i2 x/ R' |# y; C8 L
  11.                 else
    1 @& g  f1 b3 U* s9 W# \
  12.                 {
    5 {% o2 I+ H' H$ n" t1 r' S4 t
  13.                         GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);& T! n7 `. [& _1 {, u! J4 {( {/ j: z
  14.                 }# Q8 G4 g4 B' u0 i+ K  P$ g: j  F
  15.         }  r2 |8 i" P7 {9 I: @/ a. V# k
  16.         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);) d) ~8 c- }' j) h7 ?" B, ~! F
  17. }
复制代码

, s5 S/ z0 L% j. h! Y+ H" R; tmain.c:
' I; O' w9 T- J, o( b
  1. #include "stm32f10x.h"9 Y' b4 A: F9 \* C& m
  2. #include "led.h"" Z7 P5 v2 j0 y! e' a6 J
  3. #include "Timer.h"* H/ N& w+ E) S2 s: @7 [

  4. 6 \# i/ n  P6 Q& r
  5. int main(void)
    5 N: a9 S0 B! n
  6. {8 i5 Y& Y# w( t' M/ n* o: m
  7.         TimerBase_Config();
    # `+ O9 C3 J, E% b
  8.         LED_GPIO_Confing();
      h0 v& d( s+ T! y
  9.         GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
    . p; w) K, \* m' j
  10.         while(1)
    # E6 z1 u" @* l/ N  J: X9 E
  11.         {. f! j5 k0 I: N* F/ B2 c" Y% Z
  12.         ( m& m7 t( i1 e( S& i
  13.         }
      }4 X+ p4 ]* ~8 ~0 I3 @
  14. }
复制代码
' k, R$ g" I. [9 k2 [3 g
注意事项:. R' A# y! @2 b8 J* z
一定要记得清空标志位,尤其是中断服务函数里的清空标志位,博主就因为此检查好长时间" b- V4 K; P& y4 `+ \
————————————————- |. k: E1 y- J' j' l3 N. M
版权声明:fake 钢铁侠; V  Z% q& u" v2 ]9 {' A
如有侵权请联系删除! X/ ], x8 e- u* V% \0 b
" `$ k+ C- l4 c% O( K
7 }0 I* {3 ?6 d- ]
赞 收藏 评论0 发布时间:2023-5-1 17:26

举报

0个回答

所属标签

相似技术帖

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