stm32有很多定时器,每种定时器的功能也不尽相同,今天学习了如何用通用定时器实现1s延时,使LED灯闪烁,现总结如下:" @. O u" Y0 N0 M* Z, O' B, W" n% N
) s8 b9 \! @" [
步骤总结:
) w; o1 o/ ^6 K5 ^# D使能定时器时钟->配置定时器结构体->清空定时器标志位->开启定时器中断->使能定时器->编写中断服务函数
5 \; A) r; l; R2 A- ~$ o' l) E1 W0 R5 t* }% x. R
Timer.c:
# r; S3 F" A3 \/ w' q0 n- #include "Timer.h"
; E- s8 F2 D; \" }0 B* { -
: u/ }- K6 }$ G - void TimerBase_Config(void)
( D, T1 O% h2 O - {- Q5 n; G; o. O+ H3 s
- //开时钟; d5 n# {* ?5 f% X
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);9 ~* n: i# q" f% U2 x
- //定义结构体变量
6 f; H& I; w( z - TIM_TimeBaseInitTypeDef TimerBaseInitStructure;& W' ]; J: d8 V0 I
- NVIC_InitTypeDef NVICInitStructure;
; ^' w, E3 ]( |- P: d2 f S* t - //配置定时器结构体- z9 P, E$ n' B0 \- h' H
- TimerBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
4 @- n7 u& D3 y$ `- _& ^) Y9 ` - TimerBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;9 w4 Z( H! I0 }1 E4 ~* C+ q
- TimerBaseInitStructure.TIM_Period = 10000;
+ j' Z9 V$ `/ v1 E( b' ? - TimerBaseInitStructure.TIM_Prescaler = 7200;
7 x/ g9 L/ R" g+ q3 [7 a2 M - TIM_TimeBaseInit(TIM2, &TimerBaseInitStructure);: ^, j8 Y% J9 v8 I: W
- //清空标志位3 v9 C5 r* b* Z1 L; x
- TIM_ClearFlag(TIM2,TIM_FLAG_Update);
: D' W/ y |1 I. H - //开启定时器中断/ e& Y: R2 ?: t. h+ Z" I9 w+ G
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
; }, h) X% k! F% \/ M. t5 v* x - //使能定时器
% b# Q5 p) {9 F2 _ - TIM_Cmd(TIM2,ENABLE);2 C$ W: @+ V0 c: ?/ V! k& S
- //配置NVIC结构体
! x/ L1 ^ `, o9 R5 G! W Y2 q - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
9 G6 |# |6 e- g4 \ - NVICInitStructure.NVIC_IRQChannel = TIM2_IRQn; R$ w0 {+ \( w7 Q* e1 {
- NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;* d" X! ^+ t& ? ]+ k- S, q3 T* c6 s: M8 i
- NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 1;
5 J `3 X" |5 D5 K - NVICInitStructure.NVIC_IRQChannelSubPriority = 1;' n5 @2 R" z7 p, T
- NVIC_Init(&NVICInitStructure);# G: l& ]( p* N! u- }8 Z
- }
复制代码 " R! r4 E. d/ \
stm32f103x_it.c:! z7 `2 z9 I' ?9 E7 X5 v4 A
- void TIM2_IRQHandler(void)9 N F" @& v% P% N/ o
- {
/ W2 W3 Y C$ q, O9 R1 i - static uint16_t temp;# J2 _/ G% O& G5 t' K. `1 c
-
$ M' E/ v/ @9 W+ v - if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
; J( t+ \, ]: {! j* M& _8 C/ A- G - {
0 J1 ]( @7 m% f. Y& @- o. T1 A" I - if(temp ++ %2 == 1)) v1 u0 G9 D3 A# `* Q* p K1 O
- {
! a0 W$ W" J6 n) z% _; n - GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
6 O4 J( ?* S2 Z- L) G M, N/ g8 M - }
: y0 w6 `5 X- G3 \ - else
3 e: V1 w% F5 X - {9 x0 |; z! k! V* {9 N1 K( `, H8 I% f/ Q
- GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
' G9 M) V/ o8 n: g9 L4 p - }3 o. o$ e; L. Q' w& a
- }% z. a8 f6 O0 ^% _! ~2 a+ ^
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
0 Z: N6 z" Q8 b - }
复制代码
- L# O; o- r1 C' k$ Q0 \" kmain.c: ~8 U) j. \( }, y* b" f+ }4 v: U; Q- I
- #include "stm32f10x.h": d6 e. G D |) }. R3 m( Y
- #include "led.h"+ d+ u( Z9 I) ^! ]
- #include "Timer.h"( A% w% G. L" `# U
- + p( M" `* c2 D* J u6 F
- int main(void)
* ^# Z' n6 |# |6 J1 b; O2 \4 v - {
# E* G# b4 u1 t2 u2 L - TimerBase_Config();5 n; Z/ K5 T' R m/ l" T
- LED_GPIO_Confing();" d' h( u" h+ e* C- G* f2 y
- GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
4 c6 F# U2 G/ V p& k: a- D9 P) c' b - while(1)1 j7 D- p' |% m' V f
- {- ?# w* S6 E0 F/ Q# i0 {8 D
- ! R% z# r9 e2 X; E! D
- }6 n1 o8 I; z, N$ D1 H" P! G
- }
复制代码
7 n+ V, l$ K6 O! B注意事项:
6 H+ I% `$ W# r* ]: e, u1 ?% Z& V& ]一定要记得清空标志位,尤其是中断服务函数里的清空标志位,博主就因为此检查好长时间' z' B; V2 |3 O
————————————————" i1 W* m+ ]7 J# ~! y% H
版权声明:fake 钢铁侠
! \/ m# J; D$ A( B: l$ O7 X如有侵权请联系删除$ ]6 t; H5 H% \% q
: o5 Z7 L% h) f5 M g+ k' D
. m- R6 ] k/ `* L$ R" _2 _/ ^" g
|