知识点 H* s, T; J$ E. p6 a
GPIO 寄存器- typedef struct
$ G; v m6 C O* r. \' y - {
) [- z' ]* K5 G" @9 B - __IO uint32_t CRL;
4 y7 F* Q v% `' t3 `+ E$ f2 @& q$ v# H - __IO uint32_t CRH;
2 o3 x8 k+ j# `5 j6 s) }, ` - __IO uint32_t IDR;
4 J2 C% b) F5 \9 k/ r) V) q( i - __IO uint32_t ODR;
; Y& m1 z- B M1 E2 ^& j1 y - __IO uint32_t BSRR;% d0 F7 \+ _* }) w* K: Y
- __IO uint32_t BRR;9 ]- x5 G% q+ ?; [% Y
- __IO uint32_t LCKR;6 a, k3 Y: `# v0 F5 O
- } GPIO_TypeDef;6 e" m5 e0 e2 x3 f' |6 t
- typedef struct- h6 g" x2 i" J
- {
% R6 a( s" p0 J* C - vu32 EVCR;
: [8 D6 L% M" Q% I: R2 _* w5 q# z - vu32 MAPR;- L: U9 W' Z1 g7 h; l" _& O
- vu32 EXTICR[4];
+ E& T* r4 b3 o- n$ a$ p - } AFIO_TypeDef;
! E9 ?8 I s6 v5 b0 }/ _; N
复制代码
6 t' V) S `; t& p& z基地址 - #define PERIPH_BASE ((u32)0x40000000)' V- Q6 `; c5 n5 ?9 K5 d& D9 D: R
- #define APB1PERIPH_BASE PERIPH_BASE
& |, E+ }/ w/ f1 u' R( D - #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
% I5 G c$ A) k - #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
7 d- l1 g2 h( ?% U; L: y% M$ j1 r/ B* _ - - s2 l* J5 O+ d8 a- R
- #define AFIO_BASE (APB2PERIPH_BASE + 0x0000)% A9 G% h( @4 j+ a) c
- #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)8 x" x- s6 ^% V/ D
- #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)+ G% _' v ^3 p0 `3 N# Y H
- #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)- E) t+ v- V8 e" n3 b% U
- #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)) O& K4 z6 g: A
- #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
复制代码 ) t" {4 K4 M: m, z K
外设 - #define TIM2 ((TIM_TypeDef *) TIM2_BASE)( K) M- h4 q% [2 g& K# N
- #define TIM3 ((TIM_TypeDef *) TIM3_BASE)
2 v- C" y" ^, s - #define TIM4 ((TIM_TypeDef *) TIM4_BASE)
; R( N9 t. ?7 ?% S - #define TIM5 ((TIM_TypeDef *) TIM5_BASE)# W4 y( U! D- w+ }$ y0 C
- #define TIM6 ((TIM_TypeDef *) TIM6_BASE)
% s2 z' Q: N& K - #define TIM7 ((TIM_TypeDef *) TIM7_BASE)6 z* b3 _6 \8 @4 R# H+ b
- #define TIM12 ((TIM_TypeDef *) TIM12_BASE)! u& A! x' E) T# v7 u4 w9 J
- #define TIM13 ((TIM_TypeDef *) TIM13_BASE)
" V3 u, C* G5 n8 _9 t4 L o. Q - #define TIM14 ((TIM_TypeDef *) TIM14_BASE)
6 N8 r# b2 L9 L4 G - #define RTC ((RTC_TypeDef *) RTC_BASE)
4 f8 M/ k0 r" ]6 i9 c0 h - #define WWDG ((WWDG_TypeDef *) WWDG_BASE)
! ^4 y0 I' k1 t( X" x - #define IWDG ((IWDG_TypeDef *) IWDG_BASE) \2 Z% \9 L, _3 ?0 z* X
- #define SPI2 ((SPI_TypeDef *) SPI2_BASE)
3 k0 s1 w0 Q1 P C; m! x5 X - #define SPI3 ((SPI_TypeDef *) SPI3_BASE); z1 N( Z: d9 A' ^+ @
- #define USART2 ((USART_TypeDef *) USART2_BASE)
" `7 d K+ }/ q) a* ~# @ - #define USART3 ((USART_TypeDef *) USART3_BASE)
3 V$ Z4 U/ w6 z R5 G4 [( ?3 {3 { f% w - #define UART4 ((USART_TypeDef *) UART4_BASE)
9 e" @- W% q; e7 {! Z8 I) @ - #define UART5 ((USART_TypeDef *) UART5_BASE)
1 h1 m! J- p" w+ Z7 Q+ P - #define I2C1 ((I2C_TypeDef *) I2C1_BASE)
& Z! k1 Z* |1 C - #define I2C2 ((I2C_TypeDef *) I2C2_BASE)2 y# p1 A$ X+ \5 C) |& c
- #define CAN1 ((CAN_TypeDef *) CAN1_BASE)
" y) a9 w& U% H& W Y' R0 U - #define CAN2 ((CAN_TypeDef *) CAN2_BASE)4 q+ ]5 K# e( d8 t; x
- #define BKP ((BKP_TypeDef *) BKP_BASE)7 f$ l# t: p. S( e2 i
- #define PWR ((PWR_TypeDef *) PWR_BASE)
3 I3 r G# q2 Y' _# u - #define DAC ((DAC_TypeDef *) DAC_BASE)$ v0 ~* m/ K/ N, |
- #define CEC ((CEC_TypeDef *) CEC_BASE)
' f' P* j1 Y5 F! z' U7 h - #define AFIO ((AFIO_TypeDef *) AFIO_BASE)
3 G: l3 [! h# Y - #define EXTI ((EXTI_TypeDef *) EXTI_BASE)
( h9 }- j, `. w# J - #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
( q2 v5 B7 `# z, N- K' y9 e( F- | - #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
6 B) O4 r0 s0 u' v; e. G - #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)) a& K5 H7 \3 F3 Q1 V
- #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
* f" }6 R l& f d! S - #define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
3 n! B. b1 P. d# ]; ] - #define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
) _% y8 F( N/ N1 ] - #define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
0 U7 _+ c l$ ]; W - #define ADC1 ((ADC_TypeDef *) ADC1_BASE)2 W# R& R3 ~! ^( Y
- #define ADC2 ((ADC_TypeDef *) ADC2_BASE)
3 l4 _5 F3 N, X! U2 s7 p - #define TIM1 ((TIM_TypeDef *) TIM1_BASE)6 C7 G9 b% g8 I+ e& k, q
- #define SPI1 ((SPI_TypeDef *) SPI1_BASE)
9 P- s ]; j+ | - #define TIM8 ((TIM_TypeDef *) TIM8_BASE), S) b) E: N; e3 `3 `6 }; j
- #define USART1 ((USART_TypeDef *) USART1_BASE)1 l7 w0 f2 Q$ t
- #define ADC3 ((ADC_TypeDef *) ADC3_BASE)
, q! ~8 x# i$ m$ I - #define TIM15 ((TIM_TypeDef *) TIM15_BASE)
$ Q. i! j" }$ e6 S! \3 k. L* p5 Q6 r - #define TIM16 ((TIM_TypeDef *) TIM16_BASE)
8 I @. u U6 q7 v% s8 X* F' K! R - #define TIM17 ((TIM_TypeDef *) TIM17_BASE)4 |$ \) m7 A* ]0 k
- #define TIM9 ((TIM_TypeDef *) TIM9_BASE)" i: X5 D5 b/ @) _
- #define TIM10 ((TIM_TypeDef *) TIM10_BASE)
* D- I* K; |2 O9 X+ r( v) o+ b - #define TIM11 ((TIM_TypeDef *) TIM11_BASE); o' H8 c! I% {! w' X+ Z0 ^
- #define SDIO ((SDIO_TypeDef *) SDIO_BASE)
8 J) h. n, F# Y' t! I( \ - #define DMA1 ((DMA_TypeDef *) DMA1_BASE)
% b1 Y) U9 z% }/ M9 F+ F4 \' { - #define DMA2 ((DMA_TypeDef *) DMA2_BASE)
% F& l F+ I5 }- q - #define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE)' A( P/ b m' I7 ]3 l- X. K6 g0 A
- #define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE)9 S' C: p) o6 @4 x8 }+ I
- #define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE)
% u' ]/ e! K+ ]: K$ g- a - #define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE)5 r/ b8 i3 W4 Y! R8 k5 j! [7 M1 X
- #define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE)
1 f1 H& `) B1 }) I3 E/ R - #define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE)
/ n/ t' B) v& k8 \ - #define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE)
+ C; r9 g% ~* r/ K' x, I - #define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE)
: F. P1 p) H( h7 r' u# Z+ Y - #define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE)0 ~! a7 \/ x3 B4 \2 t
- #define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE)+ d' @1 \% U. ^/ F
- #define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE)9 W1 i& P& E5 Z$ Y, d
- #define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE)0 z9 g0 B3 m8 A7 i3 F I7 j2 p
- #define RCC ((RCC_TypeDef *) RCC_BASE)% E m! J1 q2 e( |
- #define CRC ((CRC_TypeDef *) CRC_BASE)6 X9 o/ r* u" H( C
- #define FLASH ((FLASH_TypeDef *) FLASH_R_BASE)! w: U! C* O3 V* M: u
- #define OB ((OB_TypeDef *) OB_BASE)
% @& `0 G$ y, m3 G4 ] a5 R - #define ETH ((ETH_TypeDef *) ETH_BASE)
" H7 }7 z2 P( l; n' O - #define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE)3 r0 P) w0 W0 D' m6 \6 _
- #define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE)
- ^& R7 d- w H9 @2 C - #define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE): N5 J, E& q1 ^3 P# S2 f2 J+ Q& A
- #define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE)5 E, z& X4 C, ^3 ~4 j( Z
- #define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE)) P3 @1 C4 P6 }6 _5 u, p, x
- #define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE)
复制代码 2 q$ E9 A7 s/ ?; W
这里就已经把GPIOx的类型变为结构体GPIO_TypeDef,地址变为GPIOx_BASE;
' z/ W" W! A7 F4 ^' x0 g比如使用时可以 用GPIOC->ODR这样。
- ?- K8 `8 x1 H. l" k: k+ b* d- F输入模式(上拉、下拉、浮空、模拟)
' r+ i9 [6 p0 {3 U6 y. m2 u在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器 GPIOx_IDR读取 I/O 状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候用的是这个模式。模拟输入则用于 ADC 采集。
8 F0 L6 @! d$ I7 k/ U" K输出模式(推挽/开漏)' ^8 Q" W1 U3 l& q5 E! A
在输出模式中,推挽模式时双 MOS 管以轮流方式工作,输出数据寄存器 GPIOx_ODR可控制 I/O 输出高低电平。开漏模式时,只有 N-MOS 管工作,输出数据寄存器可控制 I/O输出高阻态或低电平。输出速度可配置,有2MHz\10MHz\50MHz的选项。此处的输出速度即 I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。在输出模式时施密特触发器是打开的,即输入可用,通过输入数据寄存器 GPIOx_IDR可读取 I/O 的实际状态。
$ n5 g. R7 y0 M7 b复用功能(推挽/开漏)
* n" j( x0 b. o2 P+ ], o* `) a复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器GPIOx_ODR 无效;输入可用,通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。/ d& g/ P, s5 z! O8 y
通过对 GPIO寄存器写入不同的参数,就可以改变 GPIO的工作模式,再强调一下,要了解具体寄存器时一定要查阅《STM32F10X-中文参考手册》中对应外设的寄存器说明。
; k4 f2 I( E* m8 q; \4 X0 l/ |% }在 GPIO外设中,控制端口高低控制寄存器 CRH和 CRL可以配置每个 GPIO 的工作模式和工作的速度,每 4个位控制一个 IO,CRH控制端口的高八位,CRL控制端口的低 8位,具体的看 CRH和 CRL的寄存器描述5 I) z! w+ B/ m6 h% W4 W" r
2 e7 z0 v3 e2 B2 u* ~/ Q $ g. N: H8 ~$ |
1 x+ _) @ K; c+ A& P- typedef enum! l$ c9 L% I0 C. q
- {3 D" y, \# N1 ^6 E5 E
- GPIO_Mode_AIN = 0x0, // 模拟输入
# P7 q2 @) K( y! T* j9 F - GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入9 p- x& t! v, h6 o$ M/ ^3 w
- GPIO_Mode_IPD = 0x28, // 下拉输入
1 v% g+ k% z% Q4 ] - GPIO_Mode_IPU = 0x48, // 上拉输入
% ?2 m6 l' `' ~9 T; F& r# y& Q, f - GPIO_Mode_Out_OD = 0x14, // 开漏输出
' g/ h+ A) }/ p& c" _ - GPIO_Mode_Out_PP = 0x10, // 推挽输出* l# w# a" T- T, R& X
- GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出
% D, D ?% p" ?. b- S; b3 m; R7 A - GPIO_Mode_AF_PP = 0x18 // 复用推挽输出
' U1 T1 A) l0 ? u2 Y5 ~- ] - } GPIOMode_TypeDef;
复制代码- typedef enum4 }# [% x! \$ D
- {
, l4 }0 p6 d2 l - GPIO_Speed_10MHz = 1,
' e: h' w: v" i" ?/ Q0 |9 X* r - GPIO_Speed_2MHz, ) R4 W/ Q( N: s: i8 t: ?2 H$ e
- GPIO_Speed_50MHz: D4 X" u- w- T- u/ o! [* w
- }GPIOSpeed_TypeDef;
1 h' K; X0 U6 w
复制代码
) y: u, m; ~; o! M% g) a1 r5 U6 P
/ e* u: d0 v1 e! b- V. d+ Z& X改变GPIO引脚状态
5 c+ `1 e% W! Y2 G# a" ]0 q2 ]
$ f0 {; D% Z: v' i' g7 R* g) P, I5 C1、高16位和低16位,只能以16位形式操作。4 N$ f9 V T2 Y r5 B. u1 k
2、高16位用于置 0,低16位用于置 1。(高16位用于置0,低16位用于1置1,相应位设1才有效). \. R1 Z; b* i7 E+ Q7 @
3、各个位对 0 操作是免疫的
. I: `4 A) Q$ h x4 n: z6 i比如控制PC13:
p* ]- v4 B# {3 G! L输出高电平 1<<13
( W5 G1 n3 M0 l- _# ^& V* G输出低电平 1<<(13+16)
- e. i3 @ p6 p ) A. Z1 F0 X+ l! U; u
只有低16位有效,在相应位置写 1 时,可以输出一个低电平。 3 B) ~6 O5 K" f
通过这两个寄存器,我们就可以控制一个GPIO引脚输出高低电平,最简单的可以使用BSRR输出高电平,用BRR输出低电平。 * a! Q) ~1 z; j6 T
用函数控制引脚输出高电平 用函数控制输出低电平 * R' R. O# o' [- ^- m1 l
GPIO_Init()函数函数讲解& q* G8 \& p7 n. _& `4 G) a+ a6 p0 a! c
函数讲解) r* S' B! t; \& S, R
作用:根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器。
" k# f9 w$ g; Q* z- a
9 H" `' x" ^7 U! Z% p0 a/ P" |GPIO_Init()函数就是配置引脚的四个位,再将四个位写入到对应引脚的寄存器。 库函数中的此函数代码如下图。 9 g4 ? J: R& v+ n4 L0 B3 P7 h* W
6 T. o! W5 i& W, N5 @! F T5 G函数分析: 确定currentmode 的值。 判断输入还是输出,如果是输出,添加速度值。 配置低八位。 配置高八位。 / K8 P8 c* F4 F1 Q
% [, z# {4 Q2 I1 Y5 M/ ^/ G4 Q 函数使用例子比如设定:PA2推挽输出,输出速度50NHz;
9 }( H* ^+ Q4 W+ A- t用库函数定义的代码和实际赋值如下图:
$ X' }& [2 ~7 c7 ?, g- c . [' ]( [% S, H0 x
0b:32位 6 S3 o |7 k0 ^+ c% `
库函数理解
2 w; d) `1 g6 w8 L, J" |) [; U库函数是控制寄存器操作的语句被封装成函数的函数集合,需要执行相应动作的时候只需要调用函数(并填入参数)即可。
" @( N r# q$ b$ b4 Y实例操作; B! B8 o; p: Y6 ?7 z
工 程在这里分为三个程序。main.c ;LED.h ;LED.c( T6 J: {/ y8 S: u. a W
思路:: o; I- m0 d3 X( D
一:打开引脚对应的时钟。4 t- K+ Q' X) k; O! H
二:配置输出,确定输出模式+ b0 [* l- ^% ^. W
三:输出高电平或者低电平
' \. ^: K- W# Q6 }7 r
LED.h - #ifndef __LED_H//此处是表示当我们没有定义LED这个名字时,一下这个程序才被使用; ]7 v: e: F- _" H' q
- #define __LED_H7 t, V' \' r6 c
- #include "stm32f10x.h"//头文件6 z9 E' C. j7 I. w, I
- #define LED_G_GPIO_PIN GPIO_Pin_0//定义LED灯G的管脚
, s1 p$ L* q9 q ^: ?% e* s% ` - #define LED_B_GPIO_PIN GPIO_Pin_1//定义LED灯B的管脚
8 l# z, b- v: ?3 O$ y - #define LED_R_GPIO_PIN GPIO_Pin_5//定义LED灯R的管脚
3 Z+ }9 a' b3 b - #define LED_GPIO_PORT GPIOB; l# U2 w; t" V) m
- #define LED_GPIO_CLK RCC_APB2Periph_GPIOB
3 c2 T: }7 h5 h% Q9 s+ c - #define ON 1
) r3 a9 v4 v. l2 L' z: ~ - #define OFF 0
/ C5 ]9 e% M# r0 [ - // \表示换行符
8 |! k" B7 C7 z C: {- S1 E - //ResetBits可用于输出低电平" v+ N& y% F, R. [ J! [
- //SetBits 可用于输出高电平: m3 g% W6 W$ u2 w) M# l; N7 [9 o
- #define LED_G(a) if(a) \
+ Y5 u! R. S$ c# Y& E6 z0 ] |/ ? - GPIO_ResetBits(LED_GPIO_PORT, LED_G_GPIO_PIN); \) W, Y5 i& V/ g
- else GPIO_SetBits(LED_GPIO_PORT, LED_G_GPIO_PIN);, _0 x+ a5 u. A
- #define LED_B(a) if(a) \
& _) l8 O; h% w - GPIO_ResetBits(LED_GPIO_PORT, LED_B_GPIO_PIN); \
4 [8 ?6 g' d/ V# F. B8 Y - else GPIO_SetBits(LED_GPIO_PORT, LED_B_GPIO_PIN);
8 ?' z; h8 Z0 u+ k# @ - #define LED_R(a) if(a)\' T2 `) ] `6 }9 c& _3 c
- GPIO_ResetBits(LED_GPIO_PORT, LED_R_GPIO_PIN); \6 P# Q0 V+ F" T
- else GPIO_SetBits(LED_GPIO_PORT, LED_R_GPIO_PIN);' _; q! a* O& k9 J
- void LED_GPIO_Config(void);
' w9 F- k0 Q) U% h4 f: M6 b - #endif /* __LED_H */
复制代码
j( `2 J& ~; }) u2 {3 fLED.c - #include "LED.h"
9 H; N) n0 @- f - void LED_GPIO_Config(void)& m5 F3 D7 i3 b. l/ I$ s
- { D. @- c; D) B* w- {* `& }! `
- /*定义3个GPIO_InitTypeDef 类型的结构体*/
( L( S/ ?- k5 J, L) P8 Q - GPIO_InitTypeDef GPIO_InitStruct1;* W2 [ ]% R2 h: j! A6 S7 B5 S
- GPIO_InitTypeDef GPIO_InitStruct2;* e8 k4 ?5 m1 n- F; i0 n
- GPIO_InitTypeDef GPIO_InitStruct3;
# E$ c0 y- M8 Z' w - /*开启 LED 相关的 GPIO 外设时钟*/0 n7 M, L* g- P8 A
- RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);
8 I* z7 F8 h, M; W) n7 ^7 w. P - GPIO_InitStruct1.GPIO_Pin = LED_G_GPIO_PIN;//赋值为相应管脚的地址$ y; b) k: ` ]8 O
- GPIO_InitStruct2.GPIO_Pin = LED_B_GPIO_PIN;7 ~, C# _8 G2 I1 ]) d+ R% \" J
- GPIO_InitStruct3.GPIO_Pin = LED_R_GPIO_PIN;
) H$ u3 g% ^: t7 @; u3 Y- ?' T - GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_Out_PP;//其实就是赋值为0x10;& s! R% ]% B+ y+ Q" F! J
- GPIO_InitStruct1.GPIO_Speed = GPIO_Speed_50MHz;//赋值为33 h, b( V V6 t. F0 }- e5 |
- GPIO_InitStruct2.GPIO_Mode = GPIO_Mode_Out_PP;3 N! @: ]& |! P2 ?. e
- GPIO_InitStruct2.GPIO_Speed = GPIO_Speed_50MHz;
" G( z7 I) v# z. z+ e9 {1 { - GPIO_InitStruct3.GPIO_Mode = GPIO_Mode_Out_PP;
! m3 g# ^! n% ], R/ L' I/ L - GPIO_InitStruct3.GPIO_Speed = GPIO_Speed_50MHz;
5 r2 G! M7 \. H) u/ K - GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct1); 3 Y( |# W! i& T' P
- GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct2);
" O" x ~% H9 j+ Y7 K+ g. W - GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct3); 4 K' f6 p% ?5 Q& s# }, [
- }
复制代码
2 ~2 T% \. m" m: Ymain.c - #include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>
/ @( s, q( Q. V: ~# e s$ B - #include "LED.h"
" e! Y3 Z7 Z [ - void Delay( uint32_t count )
& C, |1 n% ^6 H% U5 k$ z - {7 \/ F, [5 o n- c5 ~* Y
- for(; count!=0; count--);
/ n8 y- v. a" E' o \ - }
$ h: g$ {! h: Z- B - int main(void)8 D* H: v7 u9 T! J6 n9 P6 Y( c
- {
9 b: h! K* q) o/ m - LED_GPIO_Config();+ ?, ]; K" B U
- while(1). m/ X j/ G: z Q
- {
7 w' ], J- F, J5 L" F# ` - LED_G(OFF);
$ D0 \1 x, m3 } - LED_B(OFF);) ?9 S0 w5 u* n F1 `
- LED_R(OFF);
1 U9 T& y) a& q( [- [1 G( V - Delay(0xFFFFF); & T: h7 _$ Y4 J! V! Y) a& a, T
- LED_G(ON);. i* t5 z* o' _6 m
- Delay(0xFFFFF);; Y1 _0 t S$ Y* |7 o7 ^: N
- LED_G(OFF);' G. ]. U! T- i+ g, y
- Delay(0xFFFFF);
6 V& f6 c( L! r2 y$ Q - LED_B(ON);
$ S/ e9 ?$ ]0 f3 U; q - Delay(0xFFFFF);* G; K/ |/ ?0 W& [) ~ J7 H+ Y
- LED_B(OFF);
% b2 r7 Q, R9 K5 z - Delay(0xFFFFF);
+ s% z# M0 |: u0 a; \' i+ z" Y7 b5 S - LED_R(ON);
" {4 q' b+ t6 H9 b/ I; O7 N( c! b3 j - Delay(0xFFFFF);
; M9 E7 P) m* z) ~: t - LED_R(OFF); ; t4 y. A) ~# R8 j# _+ n5 P
- }
3 D% X( m! t4 z0 e$ e - }
复制代码 2 n3 z$ E- N# Q B3 b
仿真图
7 A$ k# k0 f3 }6 A5 u U3 [
# o1 W8 k- K. w+ j0 m
. m! }! f, m6 i- Y; Z% P |