stm32有很多定时器,每种定时器的功能也不尽相同,今天学习了如何用通用定时器实现1s延时,使LED灯闪烁,现总结如下:6 v( l% e( i5 `2 ~
2 D, _6 R" s/ o1 `步骤总结:
, V/ g" p" V& t4 `; ~/ X3 e使能定时器时钟->配置定时器结构体->清空定时器标志位->开启定时器中断->使能定时器->编写中断服务函数0 |, v; |: q* f) J6 o5 _' b! M
* R, ]9 T8 |" K7 ^* a. \: P {Timer.c:
" N, R% T; r" U2 }3 C- #include "Timer.h"
( r$ `! I+ U; @- J( J* t4 A, F - . B1 V: b8 ?3 s# w* M2 F/ X
- void TimerBase_Config(void)
* q0 }. s% L% y4 n" Y, [! j$ u - {( v. P n) k% F7 r0 Q% _
- //开时钟2 l6 w5 }# U$ v5 d
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);8 m% M7 m+ f6 [& b, \
- //定义结构体变量2 ^& s+ M/ D+ ?7 p4 B ~
- TIM_TimeBaseInitTypeDef TimerBaseInitStructure;( J5 X" O/ p+ v9 m
- NVIC_InitTypeDef NVICInitStructure;5 E K4 S# L1 M% ^* T
- //配置定时器结构体. _! O0 M' V: E5 c4 i
- TimerBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;5 G4 X; |: p# Z
- TimerBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;& M# A5 B0 S0 q
- TimerBaseInitStructure.TIM_Period = 10000;
9 l C5 B. |9 O# Z3 ?: Z0 Q - TimerBaseInitStructure.TIM_Prescaler = 7200;2 A! ?5 f2 N1 _8 F$ h8 L0 |
- TIM_TimeBaseInit(TIM2, &TimerBaseInitStructure);
# ^5 ? l9 a) G7 R8 n - //清空标志位
) W" v! X* f; _# o; w3 N, e9 \7 g, v( z - TIM_ClearFlag(TIM2,TIM_FLAG_Update);
9 B# T5 @% K( B4 c/ b3 V( R# C/ d - //开启定时器中断
+ A8 W- \, g* s! E - TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);7 ]& a q, J5 Z- f
- //使能定时器
0 j( m* j8 D {( Z0 _ - TIM_Cmd(TIM2,ENABLE);( \5 I" C; k/ |% u
- //配置NVIC结构体( d. L" j' w9 f% ~0 N
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/ h5 v* D& O3 q( G1 {! Z7 H4 E - NVICInitStructure.NVIC_IRQChannel = TIM2_IRQn;
1 Q5 ] i3 s. @0 [ - NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;( D( \& W% {! u0 z% I8 C" U# k. `
- NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- Q! o, C* e& s8 g" j4 G& j+ V - NVICInitStructure.NVIC_IRQChannelSubPriority = 1;. F$ }% U! d" D- Y$ H3 t/ Q
- NVIC_Init(&NVICInitStructure);% {( W5 c$ j+ N2 j3 o" }" L7 z0 r
- }
复制代码 . ]0 `0 M* q, r5 G" A+ A3 M
stm32f103x_it.c: {9 v l: }. \% ^
- void TIM2_IRQHandler(void)3 \" g, j$ k5 c/ R( A6 v
- {/ @( }& B% C3 m
- static uint16_t temp;
" A5 d6 `! [6 o -
* W" ~" Y3 j, Z( q - if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)2 }1 Z7 `9 \' D+ H7 g
- {: N q/ { p* Z' S0 b& X, P; i
- if(temp ++ %2 == 1)
. p' A( w- Y1 O! ?9 P - {
5 d: Y& _& o3 c% b - GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);) O7 M* J1 L( q: v0 G
- }+ {2 v4 z+ ^) n( s v& r( K
- else " \6 j) {+ f, V6 ~# E7 Y
- {
* q4 D9 k( @$ C1 b h. g S0 U' N - GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
' H- _7 R( \$ }' W1 M) m: \8 ~ - }( J5 c5 ]) O( A) Y |( R
- }
. S7 q, [; Q, T3 n, l* L - TIM_ClearITPendingBit(TIM2,TIM_IT_Update);6 n1 f4 A( l% m0 `0 s0 J) E( E
- }
复制代码 4 ~( l' t! ?% l7 W. C
main.c:
' K3 e: j5 |+ [! K. @2 F) `- #include "stm32f10x.h"
* a. W; e: f# G( q - #include "led.h"
" S: V# ^" ^! F9 | - #include "Timer.h"; K: ?. G3 f9 t7 U
-
5 M6 ^8 ], G2 [* K8 o; x9 r - int main(void)
$ a0 U/ B3 B. _9 o- _7 \ - { N: u r( O* P) }% N5 Y* L0 [
- TimerBase_Config();, o: m# T7 S6 {
- LED_GPIO_Confing();
5 i9 }# i" k' j' r - GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);; g3 F9 r7 L* c; ]
- while(1)+ s) u* N+ |- n- h4 [; b
- {
) e4 W. o- D, `9 {* |. z! v- o5 n -
X1 S$ H$ d- j5 W6 H - }/ _. D0 t3 ?; k5 k
- }
复制代码
+ a b* Z/ E, Q) P& c& n: P/ {注意事项:
+ U0 b* \, W3 ]) u" O5 j一定要记得清空标志位,尤其是中断服务函数里的清空标志位,博主就因为此检查好长时间
0 x, U4 v- |4 |& `————————————————
$ J- H( A+ }. N1 K- V版权声明:fake 钢铁侠( v- o5 A7 T- ^1 D
如有侵权请联系删除
2 x# H) N. g8 o2 o/ S: a& {7 F; R1 ]: V
. M! c, {, L% ?2 O; D- g, m# c0 @: E; J6 e0 M8 H+ W& x" b
|