stm32有很多定时器,每种定时器的功能也不尽相同,今天学习了如何用通用定时器实现1s延时,使LED灯闪烁,现总结如下:
4 y- Z# G1 X, {+ Q
' o" ]- r' Y/ X) P* e; K步骤总结:
" e$ E2 h }- R' B3 n" Y使能定时器时钟->配置定时器结构体->清空定时器标志位->开启定时器中断->使能定时器->编写中断服务函数$ p3 y9 d' {" m. r3 `" b
1 [2 D" X' S- G; q7 ]
Timer.c:1 i, @: \/ H1 G( n
- #include "Timer.h"# F) d- ^/ h& K! c8 Y' S
-
) Y G( @; I" M1 f0 R. g/ y - void TimerBase_Config(void)
5 ?# c* T& C9 }/ U - {8 E! v0 _( [0 @3 u
- //开时钟
: _: p' O& O: @+ D& S: L1 \ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);; `5 i+ r5 R* ?
- //定义结构体变量
( Y2 l0 d1 R% z- Z) `8 V - TIM_TimeBaseInitTypeDef TimerBaseInitStructure;, a( \- q8 K% r7 z
- NVIC_InitTypeDef NVICInitStructure;
. [4 E) O; r" u; {& U# w - //配置定时器结构体
% @$ E) s3 o% K" {1 o' z' S& N! Q - TimerBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
5 }2 p5 h8 I" u" I - TimerBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
2 x" \6 S' q5 @ - TimerBaseInitStructure.TIM_Period = 10000;3 K) ]" n) @) \1 X; J# {, M
- TimerBaseInitStructure.TIM_Prescaler = 7200;% z0 \1 l4 f- k& G0 p# j
- TIM_TimeBaseInit(TIM2, &TimerBaseInitStructure);2 m( ?- w1 p; t2 X2 n$ A
- //清空标志位( `) d# }2 r: {' z
- TIM_ClearFlag(TIM2,TIM_FLAG_Update);9 H4 d3 \) P6 r- K+ d& ~
- //开启定时器中断
9 t9 u: |8 K3 X! X) n - TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);; K- w( `3 x6 c9 M3 t w
- //使能定时器: B. k9 U P7 r/ y
- TIM_Cmd(TIM2,ENABLE);
0 _2 B( w5 M: o; U$ t - //配置NVIC结构体
( r6 v ^$ x4 | - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
, `8 X9 q1 ?8 o: _& _ - NVICInitStructure.NVIC_IRQChannel = TIM2_IRQn;
: j$ L4 K; g4 ?! U' N - NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;6 a% c. h# E3 p' m( R$ H& t
- NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 1;; O$ E5 J& o. S
- NVICInitStructure.NVIC_IRQChannelSubPriority = 1;2 v6 e, m9 o& x4 a, [2 K3 n+ R8 W
- NVIC_Init(&NVICInitStructure);
7 r- D: b8 x( _! L7 }2 R$ J3 J* Y - }
复制代码
, f3 a$ T3 \* I% Zstm32f103x_it.c:
& j9 f; Q# E& o: W* a B2 ^) d3 \* M- void TIM2_IRQHandler(void)% F; F* W2 t! a: C
- {
n# D ]. d, S3 F. p9 P - static uint16_t temp;
, o0 Z3 P) k+ V: o* b -
2 M( z. e/ y7 r. i" B - if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET). Z; B2 B( ^; j
- {
0 [' |7 q/ M }% o, f - if(temp ++ %2 == 1): R( ]$ _6 T5 s, Z( o% n
- {: l& j* H! D% Z3 A$ j
- GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
5 I- ?4 o7 T9 e4 ^( l: j# Q7 k - }, j, U" ?8 B" G2 [
- else ; b: B0 {& h4 n
- {
5 K# n/ C' E& b1 n - GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
, h, `7 ^; m5 i0 U; H `- `9 } - }
3 k" }$ _, E/ F( v* g - }- V& J1 a9 F' e* b! L/ [
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
) S4 T" O/ Z t3 _/ }* F) E8 D - }
复制代码
7 ?. M; g2 o$ ]/ F' Dmain.c:! n' @$ M7 @, F$ d
- #include "stm32f10x.h"* z8 r" ^- Y l" P2 h& ? |2 d, P
- #include "led.h"# c n4 g* k% b, f) X+ b) a( ]- A
- #include "Timer.h"
: }8 r. X6 {8 O3 p* L' z -
$ u i. w$ \+ o* X* b - int main(void)
, C a$ p6 x Q. i - {
3 U: Y7 \6 ?- S6 [+ ^* P - TimerBase_Config();+ H6 j: q- g) }+ u0 I Z
- LED_GPIO_Confing();5 M- H+ J2 y. U2 q8 K
- GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
, {4 H/ } A) X1 t5 q( Z& q - while(1)5 N, ^8 a5 Q+ H% s: p4 L, X9 k
- {
9 M# R4 j" Q1 V; k& ]; o3 {+ H6 T3 I -
2 I" {0 ^# M5 a+ Q+ h% K - }" `2 h x& r7 @, j
- }
复制代码 ) V3 J5 h3 B8 D
注意事项:
: m# C! ^0 T4 g% O [( u一定要记得清空标志位,尤其是中断服务函数里的清空标志位,博主就因为此检查好长时间
, o; ^4 z/ e/ O: n$ Y————————————————
. h. m. p7 b- j- w* S& p) j版权声明:fake 钢铁侠) W5 T+ X# z9 `/ E; v* t9 m4 x
如有侵权请联系删除
& k1 o7 p( Q! s
1 H" s5 \4 N& c" I' t5 E* G# K0 F' i7 `
|