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
- #include "Timer.h": f7 H) d( |6 c: w' d# R6 r& P
-
9 m, Z9 y8 o/ C# A8 H0 C% L( u3 F - void TimerBase_Config(void)
8 E* C6 M( f, L! K! T6 e3 I. b - {/ d; N: a" b; e9 ?
- //开时钟- ~ `1 k5 b! z- ] I
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
: |' k$ ?8 F1 p! H+ R - //定义结构体变量
% k/ l( m3 b. q: [ I. m+ p' k7 K - TIM_TimeBaseInitTypeDef TimerBaseInitStructure;1 t$ U' u! B6 U' r3 h0 d+ \0 e
- NVIC_InitTypeDef NVICInitStructure;4 z- _. b& `7 v) ^ @
- //配置定时器结构体
" B; ~! U' j+ {- y - TimerBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
9 h" ?0 g9 I, n - TimerBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;: ~- V" H) [; f, }2 ?; G
- TimerBaseInitStructure.TIM_Period = 10000;2 ?% w& |1 q2 s' E; a
- TimerBaseInitStructure.TIM_Prescaler = 7200;
" g; n) p* T j0 T( A1 p) z - TIM_TimeBaseInit(TIM2, &TimerBaseInitStructure);. i2 m, u! E) Q; L
- //清空标志位
% a' ?& ], w7 j' o5 W - TIM_ClearFlag(TIM2,TIM_FLAG_Update);) W: o7 G- J; y" u4 d/ Y; |3 j8 c
- //开启定时器中断
8 b; t. O( ?; |" @; F - TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
* P0 ^6 G3 n2 w4 B! c& z7 Y( Q9 c - //使能定时器
1 u9 k& Y( Q9 }6 u8 ?9 s) T) T - TIM_Cmd(TIM2,ENABLE);
: f2 X$ H" H8 W - //配置NVIC结构体* c5 q. b1 C) P- C
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
o' J! r" M5 S) d3 R- Z; t- i - NVICInitStructure.NVIC_IRQChannel = TIM2_IRQn;: L- Z, s8 m2 d8 \
- NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;+ U. O* r% v( c8 g7 m/ h: I& }
- NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 1;6 r, x* g$ O& j9 Y/ R
- NVICInitStructure.NVIC_IRQChannelSubPriority = 1;( Z( R& m4 s/ M6 I3 J% @8 J
- NVIC_Init(&NVICInitStructure);
+ \- h. e( \% v' }9 z n' y6 U - }
复制代码 / 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* \- void TIM2_IRQHandler(void)8 d3 v& U# l8 G0 I! n2 U
- {+ X7 V1 M/ U s# |4 j
- static uint16_t temp;
! C1 U2 e; A, {( W; B -
8 @7 p% ^* i8 W - if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)( }0 O1 L; S3 G5 y# ?
- {5 R U( W& {) h7 U
- if(temp ++ %2 == 1)1 Z0 E- F2 D. m' j) k( d( W
- {) w4 z7 b' v( T9 k
- GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);& p( w0 e; l/ r! W9 `
- }
+ ^8 q) c* a; i2 x/ R' |# y; C8 L - else
1 @& g f1 b3 U* s9 W# \ - {
5 {% o2 I+ H' H$ n" t1 r' S4 t - GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);& T! n7 `. [& _1 {, u! J4 {( {/ j: z
- }# Q8 G4 g4 B' u0 i+ K P$ g: j F
- } r2 |8 i" P7 {9 I: @/ a. V# k
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update);) d) ~8 c- }' j) h7 ?" B, ~! F
- }
复制代码
, s5 S/ z0 L% j. h! Y+ H" R; tmain.c:
' I; O' w9 T- J, o( b- #include "stm32f10x.h"9 Y' b4 A: F9 \* C& m
- #include "led.h"" Z7 P5 v2 j0 y! e' a6 J
- #include "Timer.h"* H/ N& w+ E) S2 s: @7 [
-
6 \# i/ n P6 Q& r - int main(void)
5 N: a9 S0 B! n - {8 i5 Y& Y# w( t' M/ n* o: m
- TimerBase_Config();
# `+ O9 C3 J, E% b - LED_GPIO_Confing();
h0 v& d( s+ T! y - GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
. p; w) K, \* m' j - while(1)
# E6 z1 u" @* l/ N J: X9 E - {. f! j5 k0 I: N* F/ B2 c" Y% Z
- ( m& m7 t( i1 e( S& i
- }
}4 X+ p4 ]* ~8 ~0 I3 @ - }
复制代码 ' 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- ]
|