stm32有很多定时器,每种定时器的功能也不尽相同,今天学习了如何用通用定时器实现1s延时,使LED灯闪烁,现总结如下:
5 T" B* L7 j2 E5 b3 R. J8 |( d
* s S$ d, T$ H. R X步骤总结:
) l+ X) ?( E: x5 n使能定时器时钟->配置定时器结构体->清空定时器标志位->开启定时器中断->使能定时器->编写中断服务函数; J: Z" L, I) o' \
( q+ T, ]. w( v/ M$ k5 LTimer.c:
O7 c2 S& e9 d* `2 z- #include "Timer.h"
/ V; H' v" l& T& D9 {; o$ i) T. i/ o -
9 }/ S, E6 t+ o4 F. @ - void TimerBase_Config(void)
' D* s3 A( R1 t$ k! s; A$ V - {
# C* r% A0 b0 e2 B) p& G - //开时钟
( Y Y" I1 { F" r* [ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);) G9 C. a0 D4 c/ O
- //定义结构体变量
- {: O- @. D2 N! ^1 t: R - TIM_TimeBaseInitTypeDef TimerBaseInitStructure;
1 [' S9 g4 e; w9 [& P! c8 S - NVIC_InitTypeDef NVICInitStructure;
8 n5 G w+ [7 U: G7 V+ f1 O" q. v - //配置定时器结构体
3 v3 j, r+ l2 u+ @5 G8 C - TimerBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
" C+ k' j9 H3 v6 {4 h% R4 O8 n - TimerBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;( F+ v7 p" g7 ?1 K% d/ N& L
- TimerBaseInitStructure.TIM_Period = 10000;
}4 a3 c7 {! s* f7 ]: W3 ^, o - TimerBaseInitStructure.TIM_Prescaler = 7200;' o" y* I& Q6 f! L
- TIM_TimeBaseInit(TIM2, &TimerBaseInitStructure);" x: x' X; m2 u: Q
- //清空标志位# l& Q) _" m5 o% P+ r
- TIM_ClearFlag(TIM2,TIM_FLAG_Update);9 N }. B5 L/ x3 T) z! D; b" _
- //开启定时器中断
7 R$ H: m7 X/ N- H - TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);. R0 y) X1 q! J- e2 _4 Y
- //使能定时器 ]- |1 Y' j+ m) t# j
- TIM_Cmd(TIM2,ENABLE);
, X# D% a, L% l2 c/ P$ K! A - //配置NVIC结构体
( b, {& s; B* H S$ [2 `' R( E, h( z - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);- ?7 y9 K! e4 P' F) S7 c2 P/ f
- NVICInitStructure.NVIC_IRQChannel = TIM2_IRQn;
2 ]$ e4 l' r9 q; h/ T' L$ J - NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;
2 s0 O- ?1 D! H: | - NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 1;; T+ |* F- M" }3 R
- NVICInitStructure.NVIC_IRQChannelSubPriority = 1;/ S# ?2 N: O* t6 X( R
- NVIC_Init(&NVICInitStructure);. }$ F b1 a' B4 s$ U
- }
复制代码
6 ]0 T6 V. g6 E5 e/ U+ c4 v, Nstm32f103x_it.c:
, d5 t& [7 q/ \+ F) x- void TIM2_IRQHandler(void)
7 L# c* h) e& w; ? W } - {
. z* Y5 _. P5 b2 P, l0 ]+ R - static uint16_t temp;! v5 a7 D4 K4 G8 u* O
- , T3 B* g! y; G, G6 u' z0 @* R2 @
- if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
7 F0 ]1 g) t8 Q: ? ^ - {
) a; x2 N1 ]1 c9 i* ^- I" {+ b - if(temp ++ %2 == 1)# w; r& V0 V2 U; F l
- {
* h: \, A" ]# h2 m - GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
# W9 P }$ p+ L0 G3 c8 ~ - }
! d3 N& t* G& k4 w! K0 c6 F% P - else 6 J2 ]' z/ K1 @ G5 m
- {2 ?! [; ^3 f6 s1 \
- GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
4 `. ^7 B2 ^$ R" t2 u - }9 k$ F) \+ o! Q' P( [ ^2 }5 K
- }. m3 N, W j( ? [& U
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
& c) d6 J% @2 y. D5 B" ~! v - }
复制代码 7 Y, i" V# @& w/ S
main.c:- M5 D7 g3 i; b- B0 ?+ k
- #include "stm32f10x.h"
' B- O' _! g' J; L; S - #include "led.h"
- j, g1 L" ~# v. k - #include "Timer.h"9 O Z! D) O/ e! p: t4 L6 A
- 1 v( O" R# H! i6 ^3 g- e" I& b2 [
- int main(void)
3 `7 `* X3 e' a: P# j - {
7 O4 s0 o. d3 B+ j6 K - TimerBase_Config();5 Q3 p6 n" g1 i( F# p n9 \: t( B. S
- LED_GPIO_Confing();6 F' s$ ?% d) Z
- GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);; V, f3 r0 j. T$ E8 f& K% C
- while(1), Y2 {1 a* U' D5 ], c
- {
. R: @3 k. M; ~0 a/ w3 ^; }3 H - , f _8 n5 x, H( M2 \4 X. w
- }8 h! c, Q6 z* i' M# J! K; f
- }
复制代码
6 T5 q8 u! S' {9 x) g注意事项:
l2 B! G1 D w5 n) l) o一定要记得清空标志位,尤其是中断服务函数里的清空标志位,博主就因为此检查好长时间
* m0 u: k. v' k# _ C) l% h, C————————————————. B% }" I4 s) C* Z4 q
版权声明:fake 钢铁侠4 o, s, m5 y/ S3 Y6 B; S
如有侵权请联系删除; y: ^( b) o7 |. ^# m
1 B/ S- d6 u+ N& P; W
' h+ @. e: O" u3 C+ R F' B- T' q: f |