stm32有很多定时器,每种定时器的功能也不尽相同,今天学习了如何用通用定时器实现1s延时,使LED灯闪烁,现总结如下:- W1 P8 Y8 g6 T# Q5 A7 n
8 x" N2 h2 d/ ]: R. L0 j步骤总结:
* s6 k$ o/ C& v: s7 P使能定时器时钟->配置定时器结构体->清空定时器标志位->开启定时器中断->使能定时器->编写中断服务函数8 A( s% T8 e0 W
' C V* P: m) o5 q* d& V) V
Timer.c:
6 W1 n, @: ~$ [8 V8 I' h- #include "Timer.h", T! ?" Z% T* X0 e+ u
- 9 U" u L% r! X, N ]) f
- void TimerBase_Config(void)/ E2 t8 w1 j* Z! X |3 d
- {
s' w3 Q% F O* d( K - //开时钟
% C8 ]( O6 w6 s( J. I - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
* a+ G) G% q5 l$ A - //定义结构体变量8 a& ]3 E/ i/ l B/ ~( R
- TIM_TimeBaseInitTypeDef TimerBaseInitStructure;2 N1 H: K6 J# e# b
- NVIC_InitTypeDef NVICInitStructure;
2 u/ h/ X2 x$ u7 \) e h. W* ? - //配置定时器结构体
; \6 V" G+ L* s3 V6 D* S( R+ Y; S/ @. h - TimerBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
7 {0 `" u* f4 t1 H$ t- [. u: @ - TimerBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
5 N' m& m$ r" \+ R - TimerBaseInitStructure.TIM_Period = 10000;) \: r+ l6 |! T8 G/ Y
- TimerBaseInitStructure.TIM_Prescaler = 7200;
+ b& M/ p7 s& B) Z! |- L - TIM_TimeBaseInit(TIM2, &TimerBaseInitStructure);
5 [/ F0 e" T& o, O2 T7 p. U - //清空标志位
" g8 ?. h5 S$ U+ Y1 l; T2 V - TIM_ClearFlag(TIM2,TIM_FLAG_Update);
; c/ X# B9 L9 R: W. Z$ r/ b$ ~ - //开启定时器中断
, X3 Z6 a5 O6 e9 [4 d" S- h7 G, ] - TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);/ c; d* f% J+ b9 ^
- //使能定时器1 [, h- V+ A0 t2 e
- TIM_Cmd(TIM2,ENABLE);& A( d8 c4 \. d2 s6 q; p# B
- //配置NVIC结构体( B9 ~) P4 L; o
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);$ R: Y6 Q) F, G! V
- NVICInitStructure.NVIC_IRQChannel = TIM2_IRQn;! N) m7 Q, E/ J8 w7 m
- NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;
" p3 u$ E6 b, @7 A, y# F - NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 1;
$ \2 w* ?. q3 ]% J7 ^0 M - NVICInitStructure.NVIC_IRQChannelSubPriority = 1;
8 { \7 W6 u1 `8 k: x9 i3 u - NVIC_Init(&NVICInitStructure);) {6 x% R) Y# |- W- j! W! E0 k
- }
复制代码 ( S1 Z# N" q& h0 A) x3 i5 q
stm32f103x_it.c:' m& R5 t6 |' F |) Y- u
- void TIM2_IRQHandler(void)! F$ _: ]0 J M6 E
- {/ D8 g5 ]) V+ P& u, u( F/ d
- static uint16_t temp;" E! N# H9 Z& Q/ c/ h' Y; y
-
& K& [, B" H& L; ` - if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)4 u3 [' `4 w7 H# [7 {0 Y
- {" B# G, ^% u/ A; r1 P0 W, P
- if(temp ++ %2 == 1)* w8 [& w2 M5 q- W6 N& T) `
- {
5 k. R+ p; o* N/ u8 e - GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
- {% t% a3 F- e$ { - }9 \4 H Z5 r1 L( v6 D
- else 2 a# f4 t! E' X- U7 R$ x
- {
7 W+ S0 W0 ]/ U5 n - GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);& P, ]5 _( [* a1 K8 _$ g4 f) X
- }
4 o$ ^8 l6 M7 J/ x5 {& B - }
* s j( t4 L4 C" k s - TIM_ClearITPendingBit(TIM2,TIM_IT_Update);! }2 k" T1 Q E3 S# P
- }
复制代码
: l4 P/ s8 W- V4 y7 w& J- ^main.c:
$ ~3 v. H0 ^4 B" G" C- #include "stm32f10x.h"# _) I0 t( U9 N$ X# e: J7 L
- #include "led.h"4 e! g h4 P1 b. w
- #include "Timer.h"
" ?) Q+ N F: Y -
5 T! h% ?" n& m' ^& E. o - int main(void)
" _0 r( x0 m7 P, a1 K h - {
& [+ L1 }# o( t- L/ D4 z- W - TimerBase_Config();
, m5 U9 j {8 y+ q - LED_GPIO_Confing();- }- @" P1 s2 O1 o2 b& C
- GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);8 a }2 o8 b( v) M% U% P5 p
- while(1)) t6 b4 T: K9 U& ^/ o* j+ t# Y
- {
: T8 E# G0 H Q/ M) y8 W- I - ) B1 z% `) s% v4 X
- }
. `/ Z% `) \/ k; `, v( D* ~ - }
复制代码 9 g! z' E% P/ m+ D9 D/ q( U
注意事项:
2 O0 u+ o" M" B( B' C9 d) `9 J一定要记得清空标志位,尤其是中断服务函数里的清空标志位,博主就因为此检查好长时间8 [8 }" K/ R/ g$ G
————————————————
5 J: p+ w6 a# G+ e% u1 @. T版权声明:fake 钢铁侠$ k1 t: @; X0 G$ K( k4 a8 t& h
如有侵权请联系删除
6 M3 P, A6 d; U* n1 c. k% G9 O4 ~: w
6 d; |! F5 q1 E$ H% Y! w' T2 q8 m- m: h7 D
|