stm32有很多定时器,每种定时器的功能也不尽相同,今天学习了如何用通用定时器实现1s延时,使LED灯闪烁,现总结如下:
; e4 j# g; j" z0 n0 ~$ R
: e5 S3 d# p9 K: O2 i步骤总结:
$ n4 {9 ?: n8 R2 S( X, v使能定时器时钟->配置定时器结构体->清空定时器标志位->开启定时器中断->使能定时器->编写中断服务函数+ N. m6 ^8 R {1 j, |0 T2 p$ s
K: K" q \% X3 C d
Timer.c:$ g' T' c0 d, Y! U' Z9 m
- #include "Timer.h"
5 j- }6 ^9 {; s2 N8 d5 T - 1 w1 ^/ P- U. V2 U1 l
- void TimerBase_Config(void)
3 P h# c1 I7 \) V8 F6 P - {
! @# a" o0 w2 J, r2 l - //开时钟
1 ?9 V0 O+ ~- g ?0 ^ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
1 d4 `9 y) K; \0 z - //定义结构体变量
$ C G& `7 w3 c& c - TIM_TimeBaseInitTypeDef TimerBaseInitStructure;
( Q. b" j' ]. |& C - NVIC_InitTypeDef NVICInitStructure;3 o4 f9 x9 n8 j9 B9 n
- //配置定时器结构体
7 ~7 z* S \# _' C4 m - TimerBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
0 c/ H8 ]. v2 Z1 C) | - TimerBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;2 E- b- ~ h+ X4 g. o) C9 H
- TimerBaseInitStructure.TIM_Period = 10000;. J' @0 n0 k1 C0 x
- TimerBaseInitStructure.TIM_Prescaler = 7200;! }' u- N$ z2 ]9 h4 R3 p
- TIM_TimeBaseInit(TIM2, &TimerBaseInitStructure);9 {$ p4 J2 o. [- @: z# `& h
- //清空标志位7 j6 d6 T% c+ r7 j' @5 s6 p. R
- TIM_ClearFlag(TIM2,TIM_FLAG_Update);
1 A* s5 x* L, k* X& W! e. f - //开启定时器中断: h# V& W" ]; H. C; d/ i8 z
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
# W6 s e1 x' g5 L$ w5 S* m - //使能定时器
, o H+ `' Q( t9 x) E: h. C2 ^ - TIM_Cmd(TIM2,ENABLE);
& F' C1 D& {. V" |& z - //配置NVIC结构体3 V% h0 ~/ i2 z1 f4 W# e3 ~7 K
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);, D% k% V' k! }# h8 s7 T
- NVICInitStructure.NVIC_IRQChannel = TIM2_IRQn;
Y* k% `: c( `+ T% A - NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;) j5 b$ Z% }9 l( f1 A) j5 `6 S2 t
- NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 1;( J5 A8 w9 T a. i% A6 K- Z
- NVICInitStructure.NVIC_IRQChannelSubPriority = 1;' m" n# @# x/ n3 d
- NVIC_Init(&NVICInitStructure);
- d% N1 h/ E$ {# j, o3 K - }
复制代码
( x% R: w0 @) W# r, f: l9 c9 ~
, S& M, ?3 l3 h. hstm32f103x_it.c:& q/ Y# ~! X: r( S
- void TIM2_IRQHandler(void)
% S$ b. q& K7 d0 y m - {- s7 |) r( M& Q% `
- static uint16_t temp;: t. `8 V& D0 _& z8 T
- 0 Q& y1 x) W2 ?1 \, r; Z
- if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)8 D6 ~: u7 a4 x$ g3 O
- {
, Y( e( s/ f3 q' A( s; D - if(temp ++ %2 == 1)
. |1 T: ]1 ^# n+ m( W. f' z1 g - {
" F5 d! i+ |% A8 U - GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);9 R! C( h$ l& G) M: L' e
- }
0 h0 G1 ~) z* B, U! W s - else
* W$ b1 b$ I- O$ U2 }2 s - {
, F# T/ Q( u5 X. \ q$ n/ U& } - GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
# \2 L1 j3 y. t+ g; M0 Q - }) E3 S3 g9 ^: C/ }5 N
- }
( o3 T& `. S9 Y/ ~+ K# @# K - TIM_ClearITPendingBit(TIM2,TIM_IT_Update);- t3 q! f! _0 Y! Q
- }
复制代码
5 C" u/ f3 d: a4 N: |main.c:- I5 U" |( I6 j- f
- #include "stm32f10x.h"4 q2 c- u, Q1 Y; q
- #include "led.h"% V p/ n! R1 l6 `1 t
- #include "Timer.h"
- r i% @, a$ R) W- g9 X - ' W% ?1 Z2 Q* `- R; g9 k7 g
- int main(void)
2 { W+ h4 M0 O3 k - {+ z4 g0 ]3 `) O* S- X6 c5 E+ O
- TimerBase_Config();
/ \# K5 Z1 K# ~3 J - LED_GPIO_Confing();
* Y6 |& l l. [5 } v - GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);) v4 o w ^5 E8 U" `/ v& H
- while(1)
4 U2 K. T2 D$ i. N5 k! T - {
; Q4 B& M4 p, S2 n+ I -
+ K# T( R. c+ z$ F8 P - }
3 w; }4 z. }0 i" a - }
复制代码 5 \' ]) G/ ?4 \: z
注意事项:
' H( T0 Z: W9 h* W9 H) z' ?一定要记得清空标志位,尤其是中断服务函数里的清空标志位,博主就因为此检查好长时间8 H" f) s- {; W. d# T9 T9 k5 T, _
————————————————
& b$ T$ X3 S+ k/ I版权声明:fake 钢铁侠
9 ^9 I; G# U; V3 _/ T9 i如有侵权请联系删除. n- o- B, g1 o. Q4 B/ E6 f
% l; M/ y3 f6 H; v2 m8 q0 y( P
# @# K9 G& V9 b) @8 I: x
|