首先,总结全文,用STM32f103c8点亮LED的大概步骤为:. @7 C* H) I5 @" k& p, z
1.定义GPIO口结构体9 s8 y. k: S% ~8 v- P( A
2.使能相关gpio口的时钟
6 z9 ^ J: \/ P3.如果GPIO口有其他重映射功能,先失能其重映射。
$ ^# A7 A! T/ U* h4.操纵相应GPIO口,实现LED灯的亮灭。
1 P& ~, a8 e; N& {- a* Q3 w6 K下面详细解释具体步骤:
5 x" C- o x. p( `
& |8 ~* A* K( p" z5 d% j6 Q1,定义GPIO口: ]1 T5 s# v2 X% S8 `+ I3 x
库函数中GPIO结构体:* [4 \( Z. l3 H; b
- typedef struct
8 f; a. v* k: l7 u - {4 G, z; x5 |, d' z
- uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
" K' t3 e# q2 l# k) d7 Q - This parameter can be any value of @ref GPIO_pins_define */
4 j, o. ?" W6 } -
) z/ R8 \! s2 Y$ [ - GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.! i- p+ H3 u- A. E0 v( R6 m
- This parameter can be a value of @ref GPIOSpeed_TypeDef */
2 d2 h8 F# Z2 y& n1 ] - , Z9 i. z5 C# u' x( {! e. j" P
- GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.- R+ f% I, y8 k" y% M6 z M
- This parameter can be a value of @ref GPIOMode_TypeDef */
h2 r1 i' d6 |" f/ `6 b2 w - }GPIO_InitTypeDef;
复制代码 ! P% s/ y' |2 _# C; r! j+ H
根据库函数,博主是这样定义的:6 O1 F7 Q: f+ X
# [+ K# `* [: e( O9 z
0 P) z I" W) [2 R/ Y" @/ y6 d6 c" g
根据此结构体就可以明确使用GPIOx口的某个引脚,引脚的最大速率以及引脚的使用模式。. ~1 Z2 |! [; q, Y+ {
) [9 R! ?0 C! T: w
模式分别有:模拟输入模式,浮空输入模式(复位口的状态)、上拉/下拉输入模式、通用推挽输出模式、通用开漏输出模式、复用功能推挽输出模式、复用功能开漏输出模式。 d7 b1 S8 |; w: y9 r
& L: o `3 d3 r/ S
速率可根据相应要求,设置为10Mhz、2Mhz、50Mhz。# ]8 R! O9 q. u$ L
: O) U& z+ W4 l, k) q( K7 E2 [
接下来给GPIO口赋值:
9 u9 R ^4 |' l3 @. ^; }+ X8 d
* n5 p& b, ~5 Z% d, q0 ~$ ]7 b) v! H- B_IO.GPIO_Pin = GPIO_Pin_3;
5 c8 \( {5 S% f$ a8 u# x9 s3 l2 u - B_IO.GPIO_Speed = GPIO_Speed_50MHz;3 A, `+ {9 j& W) q4 y
- B_IO.GPIO_Mode = GPIO_Mode_Out_PP;//此为推挽输出
$ y/ w1 F+ m- X- r/ T - GPIO_Init(GPIOB,&B_IO);//通过GPIO_Init()函数初始化GPIO口。
复制代码
/ K+ A b) C8 C2.使能相关gpio口的时钟
& U. s, @0 G0 i8 m h3 ]9 V6 `5 i" e. S
函数库中相关的函数为:: _7 a: P) }7 k& E8 B0 J+ k, c4 ]
: i7 @9 v3 v2 `4 a0 l9 Z
- void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
复制代码
6 s/ _5 P D% a% A/ C, s7 B. M详细内容请自查。
$ i1 v C/ N$ f7 {7 t+ _$ d5 I* Z0 \" u/ u; {0 V
博主用的STM32板子上GPIOB的第3引脚连接了LED灯,但是根据STM32中文手册,这个引脚重映射了,所以要关闭其重映射,才可以用GPIOB_Pin_3引脚。8 b% Z& [8 Z5 y# W. i. }: A
9 |: X! f/ q1 Y+ g! E
$ |, J8 @2 f- f2 P
& p }( D' W# D1 J4 A7 @5 M# [
调整引脚映射需要用到这个库函数:4 C: L" v- t8 `( Y) D0 j+ [
$ J& B' e( d4 A/ Z, ^' S5 @' Y
- void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
复制代码
' |3 ]- x0 ?5 ~另外,对寄存器AFIO_MAPR,AFIO_EXTICRX和AFIO_EVCR进行读写操作前,应当首先打开AFIO时钟。5 z" [& H4 v# |2 |$ G( T8 }
AFIO_MAPR:配置复用功能重映射
- ~# S) n5 X) L! c
6 Z4 p& G& B2 @5 a; L+ z1 b P MAFIO_EXTICRX:配置外部中断线映射
* @5 w0 R' h- T* _# L( |3 D' R
$ ]) S2 e2 }& \" f) v$ o# XAFIO_EVCR: 配置EVENTOUT事件输出
; s; ]/ I1 \4 N( J* _% c, T* X: p8 p6 P
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
2 I0 |& B( B& ]( ~ - GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
& p- e. m6 A9 b3 m- j - GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
复制代码 & a; o9 U {/ p1 R1 Q! v' R
4.控制引脚信号,实现LED灯的亮灭( F0 S; D9 a2 z& O( S
定义了GPIO口变量,又使能了时钟,这样相关引脚就可以直接控制了。9 d9 v* S+ \9 y/ y. G& Y
5 G. J9 ?. L `7 n- delay(1000);
# f9 ~( _( c. a - GPIOB->BSRR = GPIO_Pin_3;//Pin_3置1
( m4 _) r) m- u Y' o - delay(1000);
) `* \+ n2 W( X/ j+ E+ q - GPIOB->BRR = GPIO_Pin_3;//置0
( x7 W) J, }8 j- M - delay(1000);
: ?, G$ G8 g% D9 ^ - GPIOB->BSRR = GPIO_Pin_3;
复制代码 ) P1 g' F2 c2 z
可以通过GPIO寄存器BRR、BSRR来设置相关引脚的信号。) U; P8 E6 P' J9 E! r$ j
+ Q) c+ x, c+ U+ d
简单地说:7 D c, h3 Z* G* h- U0 t
S, [8 Q" O2 O6 s# p$ a8 i/ \' @. m
对于低16位而言,BRR是用来置0的,BSRR是用来置1的。) @5 J D8 Y4 h3 r0 D
" ~. p1 h% D1 m0 }$ y @对于高16位而言,BRR的高16位保留,BSRR的高16位是用来置0的。
) H' [. O n6 k `8 `- a! o! k: O5 V$ j( [& Y
具体的请自查STM32中文手册115页。" [6 D* m7 `) I1 R0 z& _
# p9 Y- M9 k0 ^" }/ |; O! v2 ]( M, \. I因为PB3引脚接着一个电源,故PB3为低电平时灯亮,高电平时灯灭。: p* H! c' E, Z8 N2 c$ D
3 F2 Z5 i$ P' x& r- c' @; ~
详细代码如下:
) |9 v, O. [: D/ q z* K- #include<stm32f10x.h>6 O( T# B. d- d: [% j, F" P L
- #define uint unsigned int
. j8 l! M4 V. ^ - #define uchar unsigned char3 J0 t$ ]4 a: D4 S6 `
- void delay(uint n)
4 }: x% O( e L/ q - {
+ ^8 z9 r8 S0 g3 w" W4 ` - int i,j;6 m+ R# M6 D. n9 a9 f, @
- for(i=0;i<n;i++)" _* D" j+ `6 ~3 ~4 v" x4 l w: N
- for(j=0;j<8500 ; j++);5 g' Q4 x& O, B( d# c" \
- }) a4 o- t3 P7 L) V4 F7 `3 [" p
- int main(void)' m8 h% o5 W' ~' n% L
- {
: V' q6 G5 |$ c - GPIO_InitTypeDef B_IO;" ~4 f4 f/ j: I7 y4 ? @
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
: {- V. [$ d8 N+ f; m( e8 f - RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
: s5 l; W+ ]1 ~6 r -
" ~- h( I# r. H+ G i& K - GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
. U$ A6 X! L* c: l8 N6 R - GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
# L3 f( T/ M! ^$ }! D; p - 5 B0 d/ a0 j3 h5 J2 I
-
3 o) l2 r* b- r) C+ E - B_IO.GPIO_Pin = GPIO_Pin_3;
( `3 V- Y5 y( H9 N - B_IO.GPIO_Speed = GPIO_Speed_50MHz;7 P+ Y7 K& L" _6 \
- B_IO.GPIO_Mode = GPIO_Mode_Out_PP;
1 e& {% D7 J2 S. d r/ Y3 O+ L# \ - GPIO_Init(GPIOB,&B_IO);
' `; @/ H: b- N% o6 Z2 I1 l - 7 y" b* T" B: A8 t
- GPIOB->BRR=GPIO_Pin_3;
5 A! w; L- x7 U2 u - while(1)
8 J4 W$ p& j6 N! S4 h+ u6 a - {( A; Y$ t. A9 p( T# x# ]8 e
- delay(1000);
, r% W) W) o, Y- C6 O - GPIOB->BSRR = GPIO_Pin_3;4 M+ r" _- P4 h$ `) V
- delay(1000);2 U4 C1 `/ n5 ~" Q
- GPIOB->BRR = GPIO_Pin_3;6 S, J: ~ |; J5 p* ]' ]& T
- delay(1000);
8 B- M" M6 v4 u) _! E - GPIOB->BSRR = GPIO_Pin_3;
+ `+ Q( o; F: P5 m) g0 |) i) y; c$ `3 u - }% |8 y4 q' m' Q% [ x5 ?- h
- }
复制代码
! d7 U9 Q) z% J: |————————————————/ s5 J2 T' A2 ^( W5 r) L
版权声明:家安, @* `1 ^0 A0 j& z; L% [
+ T. Z# U% c. a2 @# j
3 K- F/ F, e B F
|