stm32有很多定时器,每种定时器的功能也不尽相同,今天学习了如何用通用定时器实现1s延时,使LED灯闪烁,现总结如下:
5 h- ?- k. w5 f0 ~1 T. c/ u, }3 J: e/ Y
步骤总结:% D S4 e4 z$ V# e
使能定时器时钟->配置定时器结构体->清空定时器标志位->开启定时器中断->使能定时器->编写中断服务函数4 U. j1 P9 @: Y$ F5 J4 b
! C$ Q |" J* D: N6 CTimer.c:) J2 ~* p* Y; Y4 l' k1 I
- #include "Timer.h": U: k# \) ~, K r
- ' W4 F0 O+ i/ V) t0 J- a
- void TimerBase_Config(void)
7 D( `& _1 _4 W* |% I - {5 D2 `! k2 \' Z% e1 m
- //开时钟
% E" h$ n- _/ O - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
3 ]: E% r/ R7 {- x$ @; G - //定义结构体变量! |! G. |! W8 ]
- TIM_TimeBaseInitTypeDef TimerBaseInitStructure;
7 j, a2 T! i1 \2 |0 _9 C - NVIC_InitTypeDef NVICInitStructure;
, \" I4 H/ L2 r - //配置定时器结构体
9 y L$ E5 a, `* x$ x8 i. P7 ^+ I - TimerBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;6 W4 ?8 u$ z5 v5 m: j! W
- TimerBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
) a: E+ _! O- y5 a [ - TimerBaseInitStructure.TIM_Period = 10000;
- ]1 r0 ?8 |/ ~4 v' M. _0 e - TimerBaseInitStructure.TIM_Prescaler = 7200;/ t0 Y9 Q C' n. L2 n$ c7 m
- TIM_TimeBaseInit(TIM2, &TimerBaseInitStructure);7 H% ~- J! v% Y
- //清空标志位
5 b8 P" j( y7 f6 b- l( l - TIM_ClearFlag(TIM2,TIM_FLAG_Update);
. w2 i1 R, h0 _. g' P8 H7 [ - //开启定时器中断
" O- V/ x5 k, u9 I - TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
8 q/ F) {: P/ R( h8 C - //使能定时器
1 I& i& C ?! F" y8 n - TIM_Cmd(TIM2,ENABLE);) r; b! C0 V8 |6 }6 p
- //配置NVIC结构体
; ~3 y) H- [+ M6 a/ h - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
; X9 i# j2 z* s) m& Z3 g - NVICInitStructure.NVIC_IRQChannel = TIM2_IRQn;
4 {9 K4 G) y5 a9 [. \. Z: c7 g6 {+ Y& R - NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;
+ h9 Z- y' U7 b - NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 1;9 v" R- t9 p( ]# ~ O
- NVICInitStructure.NVIC_IRQChannelSubPriority = 1;# j; r6 N( q: h/ h# s2 K; j
- NVIC_Init(&NVICInitStructure);7 |8 Q3 ? v2 B8 t0 c
- }
复制代码
" `3 v% J5 A' Estm32f103x_it.c:& D( a+ P8 }, a4 f
- void TIM2_IRQHandler(void)4 j4 _* S. I7 h- O1 `; @
- {/ ^4 H3 n4 s/ ]. @
- static uint16_t temp;5 |5 \" W+ N$ t
- # |8 P$ _' |5 g5 @$ v( I
- if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)& {& k g8 U0 C: s2 z% [
- {* H' H' o. o6 H5 I" `7 O
- if(temp ++ %2 == 1)
, V, e4 a+ ]8 ^; U7 {1 m - {: a; s/ I: K0 [, b4 Q
- GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);' ^& ^) R( p4 U9 @
- }
; w7 {4 ^, G6 S8 \7 S) f) k - else
1 E5 v: d n& Z8 L, r" k - {
3 V" }' z5 z9 N/ E/ b - GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
) ?' b. W n1 e1 @( w. z2 V - }
) [# W7 |# I3 \/ n* r0 q - }* U3 d4 u, O* q+ H$ C
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update);0 C1 l. N4 @8 E
- }
复制代码
2 @* ~8 U- }' M& M5 `; Lmain.c:6 k# e$ |6 V) }; W
- #include "stm32f10x.h"1 E) ]) L2 V- b; t
- #include "led.h"
, D0 e- r! a% g. ?1 ]" _) H V - #include "Timer.h"% e7 o0 J0 ^8 w* h) [
-
3 e) ^# }4 k* h9 [5 ~ - int main(void)& L& c3 a% C% L( `
- {6 O4 m5 D- L" J
- TimerBase_Config();( q/ b! W# w) {2 x. O" r* T2 e
- LED_GPIO_Confing();% S* W ?3 h: M% `3 _
- GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);4 @: L+ ~- T9 F
- while(1)1 X: X1 V2 W6 {2 l, j
- {
/ x, Y$ h* [ E$ ^! [8 O8 \7 u* k - * y8 A7 `0 {# R- c7 A
- }
8 w w% X/ h$ r' w9 n: o# D - }
复制代码
# J! A8 O7 }# g; I4 {2 r注意事项:5 l- ^& i8 j7 f; ?7 }+ G
一定要记得清空标志位,尤其是中断服务函数里的清空标志位,博主就因为此检查好长时间) b/ @+ ~5 k$ {6 v
————————————————
: p3 b! M8 ^/ E" g: T8 B/ A版权声明:fake 钢铁侠" v' V' U2 \8 e$ ?( ^
如有侵权请联系删除
: }- m9 O& g+ O+ ]2 E2 R! k
* A$ H* X/ j G/ @
# o m3 L6 m+ @8 Q) F( u |