知识点; Z% f% y. _3 w9 P
GPIO 寄存器- typedef struct
: o# F* z$ S' Z% |8 F' k% l2 I: P8 P - {" H; J) k: e$ r1 g# N1 _
- __IO uint32_t CRL;
/ |- h4 o: T, l2 ~2 X& t d - __IO uint32_t CRH;
# g, ^' ~4 R# G( g6 ]0 r$ w - __IO uint32_t IDR;
% T# T" H* f6 ]! r8 x6 Z/ |8 j) | - __IO uint32_t ODR;
; A. q9 n0 q. n* w% V2 t- @9 j% i - __IO uint32_t BSRR;5 n l( D) K' \9 ]
- __IO uint32_t BRR;
0 ^2 w0 a5 n- P1 D( p - __IO uint32_t LCKR;, Q4 i. A, ]' d. H/ `, m
- } GPIO_TypeDef;% z2 t: n# s) ~- l6 f/ `' R
- typedef struct5 Q" S2 Y! x, m9 F, `$ K
- { |- Q2 j, L( l+ x
- vu32 EVCR;
( X9 s7 j0 Y' L* q& o$ z: g# p' G - vu32 MAPR;
1 [& V" E2 G7 H$ Q. G - vu32 EXTICR[4];9 I) ~- @1 ^% C
- } AFIO_TypeDef;' k% `( T1 ]5 o2 f/ \7 ^3 L5 s
复制代码 ( C( O! |" x1 [! Y8 o
基地址 - #define PERIPH_BASE ((u32)0x40000000); ]8 a8 \) s" N% y! K0 O6 U. e
- #define APB1PERIPH_BASE PERIPH_BASE3 ^7 Z+ O/ E Z% V; y4 z; W. ]
- #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)1 s% B2 o* f) ^3 G ~
- #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)0 c% Q G7 A ^' d5 q: E3 S4 X
2 {7 k% _. ^+ e T- #define AFIO_BASE (APB2PERIPH_BASE + 0x0000)
( b" r9 l6 o" M* G) H, ~* H j- g" B - #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
6 r8 { D. A8 E. w( K* E5 g; i - #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)7 F( D, X( ?! @6 i" s
- #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)# N% p" P; ?8 Z* H
- #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)3 e1 s) ?# F; f$ k5 q# s7 e
- #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
复制代码 & f/ f5 @9 }# V; f
外设 - #define TIM2 ((TIM_TypeDef *) TIM2_BASE)- j0 e1 y$ M/ Y
- #define TIM3 ((TIM_TypeDef *) TIM3_BASE)
+ b& n3 h! Z4 Z7 J3 F) v - #define TIM4 ((TIM_TypeDef *) TIM4_BASE)/ }4 {: d1 M5 H5 U
- #define TIM5 ((TIM_TypeDef *) TIM5_BASE) U$ T: o) u3 C6 O
- #define TIM6 ((TIM_TypeDef *) TIM6_BASE)
, R( M# K8 L! |+ [ x! R. _4 k0 g - #define TIM7 ((TIM_TypeDef *) TIM7_BASE)
6 V+ x9 }# |5 y$ }1 h - #define TIM12 ((TIM_TypeDef *) TIM12_BASE)
: U S- K, j1 T. y) G7 I - #define TIM13 ((TIM_TypeDef *) TIM13_BASE)
5 ^1 D, O% O# e: R% n1 Y8 m - #define TIM14 ((TIM_TypeDef *) TIM14_BASE)
, H4 Y( G# U, m: x - #define RTC ((RTC_TypeDef *) RTC_BASE). M5 A p* l* B q: o" {; G, u
- #define WWDG ((WWDG_TypeDef *) WWDG_BASE)
: Y/ h$ \ {0 T. ~0 Y7 q$ W - #define IWDG ((IWDG_TypeDef *) IWDG_BASE): `: Z9 k$ V8 ?8 \# x/ P/ v
- #define SPI2 ((SPI_TypeDef *) SPI2_BASE)0 X; k4 U) a2 h' N1 c0 g( k7 M' |; f
- #define SPI3 ((SPI_TypeDef *) SPI3_BASE)
" G! r: O6 o) T9 F - #define USART2 ((USART_TypeDef *) USART2_BASE)4 V; I# S' q. L; W! c+ u
- #define USART3 ((USART_TypeDef *) USART3_BASE)
" E+ }2 f5 q- e+ w4 F2 `% B - #define UART4 ((USART_TypeDef *) UART4_BASE)$ a* X( ?1 \7 K" w
- #define UART5 ((USART_TypeDef *) UART5_BASE)
7 b) l3 I' D) I: }( r - #define I2C1 ((I2C_TypeDef *) I2C1_BASE)
+ q6 R# ?( D3 G) D3 [% G - #define I2C2 ((I2C_TypeDef *) I2C2_BASE)
; G& \9 r- f6 n0 ^. [& f0 ~ - #define CAN1 ((CAN_TypeDef *) CAN1_BASE)% S/ L4 J, O" K4 z+ Q! N
- #define CAN2 ((CAN_TypeDef *) CAN2_BASE)8 A8 n% `+ ?6 r+ M2 ~9 u! Z N
- #define BKP ((BKP_TypeDef *) BKP_BASE)5 ^) A+ `3 {; g$ H& Q
- #define PWR ((PWR_TypeDef *) PWR_BASE)
1 ~9 y* t/ j1 N9 M0 g; N9 K - #define DAC ((DAC_TypeDef *) DAC_BASE)! {8 u% Q1 g+ u; m9 l' e. o
- #define CEC ((CEC_TypeDef *) CEC_BASE)
5 |* @8 ~3 P% V" Y4 [ - #define AFIO ((AFIO_TypeDef *) AFIO_BASE)
( D P# k( `5 }: H- Z5 C# c - #define EXTI ((EXTI_TypeDef *) EXTI_BASE)9 r. q) J/ d% X( d0 t
- #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
6 l5 O9 c0 C: Z6 h- P( a - #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)& h/ E) s" M. C; p& z
- #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)% R7 Q# c6 U1 _
- #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE); C, Q! b( [+ j4 D. r0 r8 z3 [/ B
- #define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)6 u& n: I4 J/ n% I
- #define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)4 M0 T& T' Y/ c
- #define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
0 D6 i$ a/ Q' [2 d - #define ADC1 ((ADC_TypeDef *) ADC1_BASE)
) q" {8 P m. S! q - #define ADC2 ((ADC_TypeDef *) ADC2_BASE)1 J2 j: T L* A ~
- #define TIM1 ((TIM_TypeDef *) TIM1_BASE)
! M( c2 a4 Z! \" Q+ z - #define SPI1 ((SPI_TypeDef *) SPI1_BASE), h& w/ {5 @0 T [( k) L1 b: K- \
- #define TIM8 ((TIM_TypeDef *) TIM8_BASE)
3 J8 q2 g' J; y - #define USART1 ((USART_TypeDef *) USART1_BASE)
9 R' Y2 _* {8 D; F3 m+ p - #define ADC3 ((ADC_TypeDef *) ADC3_BASE)
1 ^. P6 X. D2 p5 b; O - #define TIM15 ((TIM_TypeDef *) TIM15_BASE)
6 ^3 [* t2 D" t' k# V4 B% b - #define TIM16 ((TIM_TypeDef *) TIM16_BASE)8 n& ?( q8 {/ u$ H6 J
- #define TIM17 ((TIM_TypeDef *) TIM17_BASE)
" |7 d9 ~* t- Y - #define TIM9 ((TIM_TypeDef *) TIM9_BASE)7 y$ I0 a6 h* `4 f% \
- #define TIM10 ((TIM_TypeDef *) TIM10_BASE)
4 R) `" z& p$ @$ {8 A0 P& J# | - #define TIM11 ((TIM_TypeDef *) TIM11_BASE)
, ^0 s6 T' X7 s* d - #define SDIO ((SDIO_TypeDef *) SDIO_BASE)
9 E$ k, [2 V P - #define DMA1 ((DMA_TypeDef *) DMA1_BASE)
& l% h! y7 s6 @9 o# [1 ] - #define DMA2 ((DMA_TypeDef *) DMA2_BASE)7 S. `* X7 S! u( k0 W+ @
- #define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE)$ U; C u& f9 S2 S
- #define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE)& H7 u6 v, V0 o" z
- #define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE)
: z" J& E7 ?. z1 a- V - #define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE)+ X9 {( u, O, t2 ? A) p x
- #define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE)
5 {1 H+ p1 l |& S" q - #define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE)0 d8 ] y+ T5 k7 m5 q+ c+ L
- #define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE)8 M v. R! w# E7 a3 V5 z
- #define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE)
3 g" n- c, v# c7 i - #define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE)
9 W: K! y5 t5 B$ G+ ` - #define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE); N5 v" E4 N. R- a0 i3 ]
- #define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE)
$ n# D/ L6 x& F- c2 B+ z" p K - #define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE) h7 q* F4 P$ V6 j1 G
- #define RCC ((RCC_TypeDef *) RCC_BASE)
' P- J9 g/ Z2 H/ a( s, C- B0 u - #define CRC ((CRC_TypeDef *) CRC_BASE)
; Z5 j1 l3 s; k - #define FLASH ((FLASH_TypeDef *) FLASH_R_BASE)4 ?" C( I! N" T2 D
- #define OB ((OB_TypeDef *) OB_BASE) " L+ U, S/ f+ p/ f! b' X
- #define ETH ((ETH_TypeDef *) ETH_BASE)
6 @/ G' k6 ~ C g - #define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE)
( _" K9 ~( b9 w - #define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE). }; o0 c* {; `5 l/ @
- #define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE)% L/ f( I: ~' ^6 P1 S5 m1 D% D
- #define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE)
+ y; k/ p$ ?# G$ G- h/ ^ - #define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE)& H# t3 v2 v9 D5 I3 K
- #define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE)
复制代码 4 d' o+ l' H; Q0 _) ^' a- P1 n
这里就已经把GPIOx的类型变为结构体GPIO_TypeDef,地址变为GPIOx_BASE;* ]( f% @% m+ E; `( U
比如使用时可以 用GPIOC->ODR这样。
, M+ A3 ]& G( z9 T g# ~, S8 E* T6 c输入模式(上拉、下拉、浮空、模拟)! }3 x/ ~" v# f7 }6 n$ {
在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器 GPIOx_IDR读取 I/O 状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候用的是这个模式。模拟输入则用于 ADC 采集。
" h! V% M2 S, ~( V# S3 N r& U
输出模式(推挽/开漏)6 H& _4 r5 }& t7 H: c" b+ n& N! r
在输出模式中,推挽模式时双 MOS 管以轮流方式工作,输出数据寄存器 GPIOx_ODR可控制 I/O 输出高低电平。开漏模式时,只有 N-MOS 管工作,输出数据寄存器可控制 I/O输出高阻态或低电平。输出速度可配置,有2MHz\10MHz\50MHz的选项。此处的输出速度即 I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。在输出模式时施密特触发器是打开的,即输入可用,通过输入数据寄存器 GPIOx_IDR可读取 I/O 的实际状态。
9 h2 j: t% C2 Z# l- E复用功能(推挽/开漏)
* {7 m9 z6 p2 A复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器GPIOx_ODR 无效;输入可用,通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。5 n3 u+ z8 ^* a) E
通过对 GPIO寄存器写入不同的参数,就可以改变 GPIO的工作模式,再强调一下,要了解具体寄存器时一定要查阅《STM32F10X-中文参考手册》中对应外设的寄存器说明。 @! X1 w" T+ r G( g/ |. D
在 GPIO外设中,控制端口高低控制寄存器 CRH和 CRL可以配置每个 GPIO 的工作模式和工作的速度,每 4个位控制一个 IO,CRH控制端口的高八位,CRL控制端口的低 8位,具体的看 CRH和 CRL的寄存器描述( G9 J: W6 B2 M' X
/ _& @5 U6 ?3 C# j; b: {" m
X- g$ N: K1 h ?( f
' h/ L- p, X9 K
- typedef enum
# W6 N+ `/ _- A3 p9 R' ~ g4 e5 L - {+ j0 @0 R5 |3 K6 C+ d- T
- GPIO_Mode_AIN = 0x0, // 模拟输入( |0 Y, k6 U! _( ~8 T
- GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入; ]6 N: r0 t8 y( v, b# `" W
- GPIO_Mode_IPD = 0x28, // 下拉输入
8 g! r \, v% C% _, v( E - GPIO_Mode_IPU = 0x48, // 上拉输入. c0 Q2 |$ A- G2 \! r) u! G8 P- ]$ G3 [
- GPIO_Mode_Out_OD = 0x14, // 开漏输出& q& W1 b$ Z( D* I' d( A
- GPIO_Mode_Out_PP = 0x10, // 推挽输出
+ P% ]! t# H+ w: K, Q8 |) M - GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出
3 }" U0 ]1 A% J - GPIO_Mode_AF_PP = 0x18 // 复用推挽输出
/ t; c3 w( G$ H4 G1 z$ ? - } GPIOMode_TypeDef;
复制代码- typedef enum
3 q2 ?* i2 c( l7 ` - { 8 ]( \9 S: s: w3 \
- GPIO_Speed_10MHz = 1,
/ j% ^# G0 g5 e4 E x - GPIO_Speed_2MHz,
( ]- k ~5 u& c3 x% o: Q7 M - GPIO_Speed_50MHz
9 d' n0 w7 n4 t; m' X - }GPIOSpeed_TypeDef;
# j5 f* n, R4 R; H, u, Z
复制代码 . F! m$ I' a+ {7 o; w, R
) B# ^) d: w* D! ?3 w0 h. U# C改变GPIO引脚状态
( D1 \4 o5 z$ Q1 |" \5 {. h: ^& n* N$ X; t4 D
1、高16位和低16位,只能以16位形式操作。
3 l9 M6 I/ d, n5 r$ o6 j0 D2、高16位用于置 0,低16位用于置 1。(高16位用于置0,低16位用于1置1,相应位设1才有效)' c2 n' m4 H. ~4 y* |- J: V; ?
3、各个位对 0 操作是免疫的
) g9 J$ m6 B0 k6 K* [5 J# T比如控制PC13:: A5 U2 c6 Q. X! ^9 T
输出高电平 1<<13
" e6 }; x# D p2 v2 o输出低电平 1<<(13+16) + B3 Q) Q0 j+ S) N
' n. I$ Z, z( E: k# f# C只有低16位有效,在相应位置写 1 时,可以输出一个低电平。 0 z) m0 S; f% y
通过这两个寄存器,我们就可以控制一个GPIO引脚输出高低电平,最简单的可以使用BSRR输出高电平,用BRR输出低电平。 + |0 i* D, F$ x: P Q9 m; L+ x
用函数控制引脚输出高电平 用函数控制输出低电平
! c5 t5 H( N' R! L5 tGPIO_Init()函数函数讲解& y2 C) n- |, t
函数讲解
. C i) n. S5 W) C9 u/ d0 |作用:根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器。 ' ] Y4 A9 h$ k, ?, {! z0 B/ P/ l
1 ^. P3 J6 y5 w5 `
GPIO_Init()函数就是配置引脚的四个位,再将四个位写入到对应引脚的寄存器。 库函数中的此函数代码如下图。 1 T8 N" v2 k+ D5 P5 C( d
/ r* m( F6 v* o' o* j
函数分析: 确定currentmode 的值。 判断输入还是输出,如果是输出,添加速度值。 配置低八位。 配置高八位。
R0 W1 v$ l* Z9 a
0 L' G0 Y# ~; q& |9 t# k 函数使用例子比如设定:PA2推挽输出,输出速度50NHz;
/ Y9 A! V; N! O/ m: K: G/ C用库函数定义的代码和实际赋值如下图: 1 d. B& s* B2 P9 c; \( {5 O
$ T6 M- X) l2 B# U* c
0b:32位 ; ^9 k) e- f. ^' T
库函数理解 . {/ E- {- j9 R8 V
库函数是控制寄存器操作的语句被封装成函数的函数集合,需要执行相应动作的时候只需要调用函数(并填入参数)即可。 n7 o3 o! y+ d* l3 Z! o6 D. m
实例操作
N9 a5 W+ y+ L' q, v. H工 程在这里分为三个程序。main.c ;LED.h ;LED.c
$ ]6 C6 v) M% @2 }1 g( T ~8 ]思路:
7 [9 ~/ i! w# k+ [, n9 T一:打开引脚对应的时钟。
8 E; s2 k; ?5 _* X% F二:配置输出,确定输出模式* v9 ]% p2 m! ^/ |* _
三:输出高电平或者低电平
( t7 o7 Q$ y" z
LED.h - #ifndef __LED_H//此处是表示当我们没有定义LED这个名字时,一下这个程序才被使用
( w' w& L9 r2 X# o* |7 j0 K% q - #define __LED_H- o9 E b* [/ ?) C
- #include "stm32f10x.h"//头文件
6 l/ v* }1 ]5 Q) W& M/ Z# L - #define LED_G_GPIO_PIN GPIO_Pin_0//定义LED灯G的管脚4 \. R% R; ~2 e' ~2 @* ]2 N) R
- #define LED_B_GPIO_PIN GPIO_Pin_1//定义LED灯B的管脚
* i, {7 r& K6 c; B' R - #define LED_R_GPIO_PIN GPIO_Pin_5//定义LED灯R的管脚: I1 U0 _4 Q8 h9 s5 W& ]$ f
- #define LED_GPIO_PORT GPIOB
* u( K t1 F; ]+ j9 I u" @: C - #define LED_GPIO_CLK RCC_APB2Periph_GPIOB
& R; j' v# K# r8 ^ - #define ON 1+ M/ `8 }3 p* o; V3 h# M
- #define OFF 0
, c R% y' V' D, B# ? - // \表示换行符
5 r V7 w! h6 b- n# P, b9 K% G G - //ResetBits可用于输出低电平0 _5 n9 |* d7 @7 Q+ v- ]) a
- //SetBits 可用于输出高电平, Y, K: p0 m( o" l
- #define LED_G(a) if(a) \' L3 y! J7 r3 @/ m
- GPIO_ResetBits(LED_GPIO_PORT, LED_G_GPIO_PIN); \- }- S5 x' G L0 w" Q
- else GPIO_SetBits(LED_GPIO_PORT, LED_G_GPIO_PIN);% j- R4 ?% U3 O' b) E; N
- #define LED_B(a) if(a) \/ k6 W3 Q( F. ^( S4 a
- GPIO_ResetBits(LED_GPIO_PORT, LED_B_GPIO_PIN); \
' w3 ~ E" I, E/ s8 I- T - else GPIO_SetBits(LED_GPIO_PORT, LED_B_GPIO_PIN);
/ {6 P- I& z4 C7 X4 b - #define LED_R(a) if(a)\* m% G: ^/ Z! h7 p
- GPIO_ResetBits(LED_GPIO_PORT, LED_R_GPIO_PIN); \0 T) u7 ?$ f9 k) Y( k
- else GPIO_SetBits(LED_GPIO_PORT, LED_R_GPIO_PIN);1 n% N0 R1 J) k9 ^" W: O" P
- void LED_GPIO_Config(void);
0 S. h0 B5 }. h- s - #endif /* __LED_H */
复制代码
l' J" a% V& z7 p b# e! D, VLED.c - #include "LED.h"( v% } C0 l9 ]: i& l3 L9 R% P9 l
- void LED_GPIO_Config(void)
& N1 ~. K0 }; Q - {
; V( a3 b5 a2 c& p3 i6 l - /*定义3个GPIO_InitTypeDef 类型的结构体*/! m% R d& i: m. w$ j
- GPIO_InitTypeDef GPIO_InitStruct1;
# _: n1 l1 y5 n3 t0 U) o8 j - GPIO_InitTypeDef GPIO_InitStruct2;! D$ t3 v, h& e. z) V, a- I( ?
- GPIO_InitTypeDef GPIO_InitStruct3;: w' u" k8 \" Y) H& N- V
- /*开启 LED 相关的 GPIO 外设时钟*/1 J$ M* F- g; |; L& N
- RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);
3 D' t S& @& C% t - GPIO_InitStruct1.GPIO_Pin = LED_G_GPIO_PIN;//赋值为相应管脚的地址0 [6 p3 }) Q; J5 O
- GPIO_InitStruct2.GPIO_Pin = LED_B_GPIO_PIN;
* Z. S4 u' `( n: ^4 o$ A - GPIO_InitStruct3.GPIO_Pin = LED_R_GPIO_PIN; X j- N* _: n- o# q, y
- GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_Out_PP;//其实就是赋值为0x10;
7 f+ Z5 t, c$ y5 \4 x' s% X - GPIO_InitStruct1.GPIO_Speed = GPIO_Speed_50MHz;//赋值为3
2 E+ K$ {7 U l) w5 f - GPIO_InitStruct2.GPIO_Mode = GPIO_Mode_Out_PP;0 C+ d5 h6 n4 L4 _: r
- GPIO_InitStruct2.GPIO_Speed = GPIO_Speed_50MHz;9 `, ~5 _& S+ s m" ?! {
- GPIO_InitStruct3.GPIO_Mode = GPIO_Mode_Out_PP;
1 H; [: v( B6 `1 Y2 U - GPIO_InitStruct3.GPIO_Speed = GPIO_Speed_50MHz;1 b4 [ Z: E* ~$ u# \ d7 s
- GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct1);
0 w1 g Z% c: h; @ - GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct2);
+ K: f8 K' Y* N, _ - GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct3); 3 e. Z: l, M( `/ z
- }
复制代码
2 v& J' |' \1 q) W" Umain.c - #include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>
$ B0 g3 Q1 D% I- H% ]: Z: q$ I - #include "LED.h"
" q1 u" D2 O/ [ - void Delay( uint32_t count )* ~* f3 t Y6 n5 ], E0 G
- {& T' x5 X2 h: g8 ~. h, u$ U9 D$ `3 ]
- for(; count!=0; count--);1 `& i8 o6 q, O+ l9 v0 L7 n
- }
6 |/ I! C3 J0 H9 M/ K! O+ A0 a - int main(void)
" c( @, p/ C* f m* s6 p6 T - {
% C+ a$ m9 W4 x X$ o - LED_GPIO_Config();7 T- m2 ~- c" I' z5 t8 S% R
- while(1)0 p }; H/ o7 `* E
- {
" O/ X$ F( ?. G6 Q, U: w" e - LED_G(OFF);: H5 Y4 q- g6 s. M
- LED_B(OFF);
/ x) y4 X9 t* z( c6 g% B - LED_R(OFF); 9 _& M, m# N2 C m
- Delay(0xFFFFF); , M7 p* u! ]; @6 _0 p
- LED_G(ON);" `6 T4 ?8 ]; i* M+ W
- Delay(0xFFFFF);. ~9 ~2 C+ b( _+ d* C6 W! w
- LED_G(OFF);" k4 O/ r) E" t4 i* A0 c
- Delay(0xFFFFF);
( X" V+ V G# a3 S - LED_B(ON);
5 I3 P) E9 X' t, z - Delay(0xFFFFF);
* A2 R/ e7 u! d - LED_B(OFF);: z% H+ ^( r) T) K3 F$ G6 N
- Delay(0xFFFFF); " o4 H) `- I6 E1 F( l1 u7 J5 t
- LED_R(ON);* m! C ^9 [' ~5 I' f2 L
- Delay(0xFFFFF);2 W) ]5 W8 {, V) l7 M! {5 w
- LED_R(OFF);
- Y& c- Z+ e6 o7 Q+ F - }
2 s/ W% Z: N1 E6 ~- C! O - }
复制代码
! k- }! ~) `0 c( d4 n: |# E& s7 d仿真图
% B0 y6 p/ P& {. W g" u: Y/ n4 w
% A0 ^7 J3 y1 K
3 K, T" C4 N7 M; { |