知识点; E" C0 s% \2 R, _4 o" n! A5 [/ p7 V
GPIO 寄存器- typedef struct4 U/ C4 T& z2 n5 j
- {
+ c$ P' A2 a0 G, T, }1 | A - __IO uint32_t CRL;
5 S6 g4 Q+ g5 T. \/ [4 S - __IO uint32_t CRH;* m0 I! p+ k6 | H3 V0 ]( y
- __IO uint32_t IDR;
" O1 O# I5 g$ z - __IO uint32_t ODR;/ s% n5 i2 ~: F/ a9 w
- __IO uint32_t BSRR;4 B/ N( @9 j/ h- d5 Z$ Z8 u- @
- __IO uint32_t BRR;) ~7 K2 _0 P- h8 r c3 H) t
- __IO uint32_t LCKR;3 F1 `7 ] z% ~
- } GPIO_TypeDef;# Y. Z k7 L; o# V+ U! K0 |
- typedef struct
' U& y) p6 w, f5 E! B; `3 R - {6 E: n2 C, s1 P; b: g0 ^% b) d( w2 b
- vu32 EVCR;
& w( L6 w4 o' x' j; [. J" J2 k - vu32 MAPR;7 Z$ U! E b6 K+ s
- vu32 EXTICR[4];
0 ~3 q, f7 h1 k |8 K& e - } AFIO_TypeDef;
r2 C+ t8 Z6 Q9 \$ e' D2 n/ F
复制代码 - ?" I* S/ m, O, ?
基地址 - #define PERIPH_BASE ((u32)0x40000000)" C x2 w. X0 I( n9 q3 n3 S( f
- #define APB1PERIPH_BASE PERIPH_BASE
- Y7 J9 Y. A2 }% p, O0 V3 y7 J - #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
0 F2 S. r/ f8 @* X v - #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
$ O5 l, i* t1 R& g6 J* F( S' d+ ~ - 2 v5 w! U( S- o. S v
- #define AFIO_BASE (APB2PERIPH_BASE + 0x0000)
3 m* g2 j& p% X7 R+ q - #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
?4 P' b8 p% I6 n) n2 [, V8 j - #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)5 S- t' M( o0 K3 X3 v
- #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000); F( F9 Z! X, J$ o+ f1 }
- #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400). {) a/ K( p! k/ {. H
- #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
复制代码
5 l' m8 Z- d) N$ |3 b+ T& l/ k6 Z; `外设 - #define TIM2 ((TIM_TypeDef *) TIM2_BASE)# C* r8 @: @0 S" S
- #define TIM3 ((TIM_TypeDef *) TIM3_BASE)
6 I3 n) E; D* W x) a - #define TIM4 ((TIM_TypeDef *) TIM4_BASE)
5 ?6 ?" }( ^: L$ P9 x. ] - #define TIM5 ((TIM_TypeDef *) TIM5_BASE)
0 k) D% @; l7 Z. e5 z2 X, T - #define TIM6 ((TIM_TypeDef *) TIM6_BASE)
. P5 J- C, X. T, c; Z( `4 P9 R - #define TIM7 ((TIM_TypeDef *) TIM7_BASE)
. W, ~" \7 t& Y1 @1 y% \8 k. C - #define TIM12 ((TIM_TypeDef *) TIM12_BASE)$ @% ]6 h8 j- s2 y$ J4 L
- #define TIM13 ((TIM_TypeDef *) TIM13_BASE)
5 w- a4 ?+ m# I+ ?) r - #define TIM14 ((TIM_TypeDef *) TIM14_BASE)
; ]/ h6 H( U" N" e0 T6 S: \" G - #define RTC ((RTC_TypeDef *) RTC_BASE)) a1 W* t1 s& g6 Z6 [9 A- C
- #define WWDG ((WWDG_TypeDef *) WWDG_BASE)
" a0 \2 s5 j' `# m& A - #define IWDG ((IWDG_TypeDef *) IWDG_BASE)
& C6 m! H9 _5 w: O2 q - #define SPI2 ((SPI_TypeDef *) SPI2_BASE)
* ]2 s) c" I* H" h - #define SPI3 ((SPI_TypeDef *) SPI3_BASE)
6 I! g; ?' d# i2 {7 ^, P# j - #define USART2 ((USART_TypeDef *) USART2_BASE)# e. P# I6 Z }; O) c" J
- #define USART3 ((USART_TypeDef *) USART3_BASE)
+ v3 x3 l/ @* @2 R5 l% } - #define UART4 ((USART_TypeDef *) UART4_BASE)
2 E$ a, R) j/ T. }5 J; @' {& E - #define UART5 ((USART_TypeDef *) UART5_BASE)# N- W) [' f* H
- #define I2C1 ((I2C_TypeDef *) I2C1_BASE)
3 `; t/ N1 w2 p5 r2 z - #define I2C2 ((I2C_TypeDef *) I2C2_BASE)
9 A, J$ E$ j) z. g2 [ - #define CAN1 ((CAN_TypeDef *) CAN1_BASE)) }. s: j* S2 V* Y
- #define CAN2 ((CAN_TypeDef *) CAN2_BASE)
) q4 k2 \3 t0 t: c* Y* r - #define BKP ((BKP_TypeDef *) BKP_BASE)
0 `( _7 e7 T: {# O n% L - #define PWR ((PWR_TypeDef *) PWR_BASE)5 b+ C" y7 ^( V4 ]& R/ n* d
- #define DAC ((DAC_TypeDef *) DAC_BASE), X N5 Y; k" i4 s5 K8 S& C8 @$ s
- #define CEC ((CEC_TypeDef *) CEC_BASE)
4 _4 t1 k: j) Y3 {6 \, g# q1 L - #define AFIO ((AFIO_TypeDef *) AFIO_BASE)
) m5 ]# S, e6 t. p) U% m' ]( @ - #define EXTI ((EXTI_TypeDef *) EXTI_BASE)
3 Q0 c6 ^1 M0 A' U+ ?+ y3 }- u - #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
! ]. R, j0 K4 ^1 |8 J& A - #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)8 V" w) L7 g3 z3 l3 S* }' ]0 L3 b' `
- #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)& W: I2 s" s/ H7 Z6 m7 Z# z
- #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
) R. A) L5 G" {/ H4 ?, i8 c - #define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
0 x' G$ t. L l& |7 m- b - #define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)5 a4 q' b$ V2 i* P
- #define GPIOG ((GPIO_TypeDef *) GPIOG_BASE). B e0 G7 G" u& j
- #define ADC1 ((ADC_TypeDef *) ADC1_BASE)
. H0 U( e8 A( _- }. t2 e) R - #define ADC2 ((ADC_TypeDef *) ADC2_BASE)) e5 {3 q9 I! i" Y
- #define TIM1 ((TIM_TypeDef *) TIM1_BASE)+ o, t8 z3 ]! p1 P4 _2 n
- #define SPI1 ((SPI_TypeDef *) SPI1_BASE)
7 l q" D* o1 |$ I) l7 [: ?. P - #define TIM8 ((TIM_TypeDef *) TIM8_BASE)
- }( ? h' ]; G# b; M4 z- O - #define USART1 ((USART_TypeDef *) USART1_BASE)# J; i( x' B- D* D) _
- #define ADC3 ((ADC_TypeDef *) ADC3_BASE)1 C* G/ k) ]: @' z- o! F5 B" r
- #define TIM15 ((TIM_TypeDef *) TIM15_BASE)) T. v" G; y- d0 c5 L* c" K, r
- #define TIM16 ((TIM_TypeDef *) TIM16_BASE)
$ X# |* l3 [% a4 G' B - #define TIM17 ((TIM_TypeDef *) TIM17_BASE)
$ H( o' W1 c1 d2 v( C - #define TIM9 ((TIM_TypeDef *) TIM9_BASE)7 h, }) Q- `/ O8 h: ?
- #define TIM10 ((TIM_TypeDef *) TIM10_BASE)
6 s1 l+ M% ?/ ?( x$ q - #define TIM11 ((TIM_TypeDef *) TIM11_BASE)
$ F# z3 f9 t P - #define SDIO ((SDIO_TypeDef *) SDIO_BASE)
$ P1 U$ D* `9 h4 X2 I$ B - #define DMA1 ((DMA_TypeDef *) DMA1_BASE)5 v2 `6 W# H) b$ f+ \/ o2 F
- #define DMA2 ((DMA_TypeDef *) DMA2_BASE)# Y6 K1 k! A' ]5 s1 _* H. t' d
- #define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE)
* P/ O) T$ @% U; M4 g - #define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE), ^1 q! T" t+ W" ~
- #define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE)" H6 Z4 w& ^ T* t1 \, I$ X
- #define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE)
Y W+ Y0 A8 h$ b - #define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE)
2 c" I4 V& I; y, K% ?& P' P6 @" y - #define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE)' W9 e" Q( R& ?0 H% V- \! ?
- #define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE)9 r# ^: J# p, Z% f2 T
- #define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE)5 k! G: w) [3 n `' }0 J9 d5 I8 M
- #define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE)
; O; H o3 L- Q& { - #define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE)+ d5 n( [6 A0 |. d
- #define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE)
$ h1 A/ [- t% A2 Y& W% K$ q* c* p! j - #define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE)1 n+ Z( m; W/ s, j
- #define RCC ((RCC_TypeDef *) RCC_BASE)/ `1 Z C7 D @& l l
- #define CRC ((CRC_TypeDef *) CRC_BASE)
3 w2 v* L0 a6 Y e# m, P2 A/ y( g - #define FLASH ((FLASH_TypeDef *) FLASH_R_BASE)1 E$ w. x8 R) o, [9 @7 z9 E
- #define OB ((OB_TypeDef *) OB_BASE)
1 }7 }! p& ?: R# v6 K( N$ v. Z - #define ETH ((ETH_TypeDef *) ETH_BASE)( O* ~4 F7 z: C2 l0 P+ U
- #define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE)
6 b' F) E, R" d' d$ Y5 x. A" D - #define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE)1 `; J& ^9 O) e5 x$ Y! I1 U
- #define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE)
, V1 l& t& c7 A) O9 b' {) P6 Y4 V" i, l - #define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE)2 X5 Z3 D4 h3 \! S& x+ l% {
- #define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE)) ~ C1 _, X" ]4 ~9 Q/ I
- #define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE)
复制代码 * Y0 m4 m$ K+ a
这里就已经把GPIOx的类型变为结构体GPIO_TypeDef,地址变为GPIOx_BASE;: q; o6 L0 F+ N: h+ J; j+ U( r
比如使用时可以 用GPIOC->ODR这样。 6 M! K) J+ v& b; b
输入模式(上拉、下拉、浮空、模拟)! h3 q- _( q: c
在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器 GPIOx_IDR读取 I/O 状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候用的是这个模式。模拟输入则用于 ADC 采集。 % w! G S3 K+ k* x6 z& P" ]& l# V
输出模式(推挽/开漏) K$ ]0 h V4 D4 `" ^
在输出模式中,推挽模式时双 MOS 管以轮流方式工作,输出数据寄存器 GPIOx_ODR可控制 I/O 输出高低电平。开漏模式时,只有 N-MOS 管工作,输出数据寄存器可控制 I/O输出高阻态或低电平。输出速度可配置,有2MHz\10MHz\50MHz的选项。此处的输出速度即 I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。在输出模式时施密特触发器是打开的,即输入可用,通过输入数据寄存器 GPIOx_IDR可读取 I/O 的实际状态。
/ U- E4 {1 W3 @/ X( i复用功能(推挽/开漏)( n- ]/ }! ~5 L, s0 _5 S0 _' w' C7 n
复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器GPIOx_ODR 无效;输入可用,通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。
* r& j$ t& e0 [4 C v/ l通过对 GPIO寄存器写入不同的参数,就可以改变 GPIO的工作模式,再强调一下,要了解具体寄存器时一定要查阅《STM32F10X-中文参考手册》中对应外设的寄存器说明。& k8 P* o1 p/ r( Q7 o2 A
在 GPIO外设中,控制端口高低控制寄存器 CRH和 CRL可以配置每个 GPIO 的工作模式和工作的速度,每 4个位控制一个 IO,CRH控制端口的高八位,CRL控制端口的低 8位,具体的看 CRH和 CRL的寄存器描述5 W3 x$ w+ _* _+ A( \0 W) O/ I
L9 `( [/ e" t4 e. e w2 g4 Q4 S$ Q
" f; j% Y8 C, A# ~- k. ?! M
2 t5 W6 }6 f* Q* `6 e s: y( \; o- typedef enum" { Z' J" e9 `
- {
3 Z. e: r9 [% v5 B+ B - GPIO_Mode_AIN = 0x0, // 模拟输入4 A$ `& ~' k. p
- GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入& X$ P' L# l# j2 G
- GPIO_Mode_IPD = 0x28, // 下拉输入
* V& W9 ^& A1 v. r - GPIO_Mode_IPU = 0x48, // 上拉输入0 u; \' U4 ^$ n3 P( t* I. U0 _
- GPIO_Mode_Out_OD = 0x14, // 开漏输出* w8 Y5 X; I. {% X# A
- GPIO_Mode_Out_PP = 0x10, // 推挽输出
{7 E5 s7 w$ S+ l - GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出" \& E7 T* A+ u/ U
- GPIO_Mode_AF_PP = 0x18 // 复用推挽输出
# m9 s# s5 U T - } GPIOMode_TypeDef;
复制代码- typedef enum2 u/ u, [3 G' m% o% z( O+ O
- {
7 w/ `4 u; |, O1 N; n7 Z" Z6 B2 t+ H - GPIO_Speed_10MHz = 1,; _8 V/ L' k: ?* y* U% F f
- GPIO_Speed_2MHz, , Q( p5 d' \6 z
- GPIO_Speed_50MHz' u- ]/ X$ Q, T9 m$ Q* h5 H2 O. d
- }GPIOSpeed_TypeDef;
) S6 d3 t8 I' u P$ W
复制代码
9 P* B% u8 t2 Z: G3 T. G' Q R7 M" Z9 S/ r4 G
改变GPIO引脚状态
' |$ ?3 o; |4 j5 A2 {; u1 L
; q' {2 ]- j3 X6 E- C1、高16位和低16位,只能以16位形式操作。, T+ U; I: S/ S, E* a" M7 d
2、高16位用于置 0,低16位用于置 1。(高16位用于置0,低16位用于1置1,相应位设1才有效)
( N6 k I* F8 b- c2 S6 ~! h- v3、各个位对 0 操作是免疫的) L, \9 G# }6 t5 J" A3 R" z$ @
比如控制PC13: f* o" _* p! ]+ \
输出高电平 1<<13
& p6 t6 L8 u5 k% R- O3 d) _/ V$ c" E% S输出低电平 1<<(13+16) & N3 z$ V- i' c
% A% x8 |9 Y4 g0 t只有低16位有效,在相应位置写 1 时,可以输出一个低电平。
+ ]+ \! V# W8 t% W
通过这两个寄存器,我们就可以控制一个GPIO引脚输出高低电平,最简单的可以使用BSRR输出高电平,用BRR输出低电平。 % Y, ? h! m6 p
用函数控制引脚输出高电平 用函数控制输出低电平
6 L r5 b% v# ~: y/ iGPIO_Init()函数函数讲解6 f. } d# W& A- j% f
函数讲解
1 \0 X5 A+ }9 B6 f+ o4 N作用:根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器。 % [+ S! l/ M/ M& c2 m" y
* m6 g7 P' Q7 z$ u; lGPIO_Init()函数就是配置引脚的四个位,再将四个位写入到对应引脚的寄存器。 库函数中的此函数代码如下图。
9 W8 a* F9 b) `+ Z! J e& o % q, W, f( _% Y. U
函数分析: 确定currentmode 的值。 判断输入还是输出,如果是输出,添加速度值。 配置低八位。 配置高八位。 # S0 `- v, ? B" U
2 B0 G) {7 f A6 x2 \- w' q2 a 函数使用例子比如设定:PA2推挽输出,输出速度50NHz;7 C! E( C( D9 H% v- Y- D
用库函数定义的代码和实际赋值如下图:
* j/ y1 ~# U) @( H1 m
: M9 V4 z, O1 G* S! o0b:32位
9 Z' H+ @3 D! {6 @/ u) r2 i8 |库函数理解 - }/ [8 X* e. {: f5 E7 a5 N& f+ y
库函数是控制寄存器操作的语句被封装成函数的函数集合,需要执行相应动作的时候只需要调用函数(并填入参数)即可。
% W0 ~3 l( O7 T" h实例操作
3 Q; Q7 C B) n2 j& n! \工 程在这里分为三个程序。main.c ;LED.h ;LED.c5 v# B( H8 r1 ?) K5 c2 L8 V
思路:
6 j2 h! `/ I! N一:打开引脚对应的时钟。
9 |: C4 r2 I8 ^5 U& j6 J9 `二:配置输出,确定输出模式5 S2 y2 F& W% }# l' k: i
三:输出高电平或者低电平 8 X5 F. V9 j s3 U+ L/ T
LED.h - #ifndef __LED_H//此处是表示当我们没有定义LED这个名字时,一下这个程序才被使用
3 [( t" T8 z. }" @, v$ x - #define __LED_H: e5 D d _2 E( B8 |! Q! N7 b, }" t
- #include "stm32f10x.h"//头文件
{4 r5 _; u! O$ K$ ?5 w! I - #define LED_G_GPIO_PIN GPIO_Pin_0//定义LED灯G的管脚+ k1 p( U, P1 X, \; z
- #define LED_B_GPIO_PIN GPIO_Pin_1//定义LED灯B的管脚0 Q- _$ P7 p' G1 M" l& b. y
- #define LED_R_GPIO_PIN GPIO_Pin_5//定义LED灯R的管脚$ | _6 B+ ]& {9 T; X. \3 q8 q5 T0 _4 z
- #define LED_GPIO_PORT GPIOB
* c: W. j' y3 Q- r; \, T: u - #define LED_GPIO_CLK RCC_APB2Periph_GPIOB
! P) Q; a' U# J- c$ D, U0 m - #define ON 1- d* _3 o- N7 _6 M {
- #define OFF 0* H& U. i4 h* [+ |$ d4 S
- // \表示换行符
# a; T9 k* U( G - //ResetBits可用于输出低电平/ x9 ~+ f; L9 z X
- //SetBits 可用于输出高电平
9 v2 {- S0 ]) v4 ` - #define LED_G(a) if(a) \2 Z! W3 ]( [+ O7 G' O# A
- GPIO_ResetBits(LED_GPIO_PORT, LED_G_GPIO_PIN); \
5 m8 d7 L, g! ?' { O - else GPIO_SetBits(LED_GPIO_PORT, LED_G_GPIO_PIN);4 F) T5 _9 x( i$ O( q" J- h
- #define LED_B(a) if(a) \7 B5 w( Y r6 o6 d
- GPIO_ResetBits(LED_GPIO_PORT, LED_B_GPIO_PIN); \) S2 G; a$ s7 ?* n
- else GPIO_SetBits(LED_GPIO_PORT, LED_B_GPIO_PIN);
8 F7 k& f" e$ n" g c! r* n4 d# j3 r - #define LED_R(a) if(a)\# w A/ e5 Q8 [
- GPIO_ResetBits(LED_GPIO_PORT, LED_R_GPIO_PIN); \
2 A; I* d" y) S+ A9 r - else GPIO_SetBits(LED_GPIO_PORT, LED_R_GPIO_PIN);
! g }) v j( L# ?7 d2 v - void LED_GPIO_Config(void);
& z0 e a# e+ \! O) ` - #endif /* __LED_H */
复制代码
) @1 C: y; y! e! r# s$ LLED.c - #include "LED.h"
M8 y, R! ~ A2 M/ A; n - void LED_GPIO_Config(void)
3 \2 G- W9 w. A& H9 K - {& L& k% @0 n/ M% I3 w4 U9 R
- /*定义3个GPIO_InitTypeDef 类型的结构体*/
$ ]# R: G" E0 _8 P' a - GPIO_InitTypeDef GPIO_InitStruct1;7 o+ S% I9 L4 H9 m* d% U# C
- GPIO_InitTypeDef GPIO_InitStruct2;
8 x9 q+ b4 W& i& f - GPIO_InitTypeDef GPIO_InitStruct3;6 b1 y! U* r' ]' ^, e
- /*开启 LED 相关的 GPIO 外设时钟*/
0 l! B9 n9 Y- j5 Z" `* ^ - RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);2 p% m, }/ [, b( Y7 g
- GPIO_InitStruct1.GPIO_Pin = LED_G_GPIO_PIN;//赋值为相应管脚的地址
# h% _" ~3 i8 P - GPIO_InitStruct2.GPIO_Pin = LED_B_GPIO_PIN;
: I& t. i1 H( e! `3 X0 o# S - GPIO_InitStruct3.GPIO_Pin = LED_R_GPIO_PIN;/ p* f- d8 g, e' r2 @
- GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_Out_PP;//其实就是赋值为0x10;
1 n. b; j* [# p. t) d7 z - GPIO_InitStruct1.GPIO_Speed = GPIO_Speed_50MHz;//赋值为34 l; {# x$ _1 j; [- N. D; p' @. k
- GPIO_InitStruct2.GPIO_Mode = GPIO_Mode_Out_PP;
5 H; _2 o, X' s' g: q+ F - GPIO_InitStruct2.GPIO_Speed = GPIO_Speed_50MHz;; W$ ]- b$ L4 Q0 F6 U: X
- GPIO_InitStruct3.GPIO_Mode = GPIO_Mode_Out_PP;2 ~4 o! B! Y* K9 M4 T
- GPIO_InitStruct3.GPIO_Speed = GPIO_Speed_50MHz;
! Q' X! e2 `4 u7 H$ l1 H - GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct1); ) q7 O! p0 H0 f$ S" @" d9 ?( }
- GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct2);
0 ]( y; P+ E8 b2 I# R3 f - GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct3); ; u& B% V- C/ Z# m4 B7 V
- }
复制代码 ! g/ q3 |4 B$ L# W* N
main.c - #include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>; |5 P6 I2 c" y
- #include "LED.h"
1 E! v t- T. g) X: r - void Delay( uint32_t count )
) U* T b. ^2 `3 P5 Z - {8 Q' f% u: V# ~8 j( o1 e, U8 L
- for(; count!=0; count--);' F' j+ h1 @) E" z! y. `0 z& t
- }- m: R( }* W7 p# \: j$ _
- int main(void)2 n7 N% D/ U$ h1 B4 I! z( E
- {
% S3 l* }( ~; }8 @! C - LED_GPIO_Config();
8 x" ~& e# i1 N, K) l - while(1)! C, R0 q% k7 O3 l) Z
- {$ z- @, p! L% s+ ?4 ?
- LED_G(OFF);; R, m6 `; f) i. B
- LED_B(OFF);
. [' T% R- M! I4 }: T7 Y - LED_R(OFF); n; [3 J) G" d$ O: t" v
- Delay(0xFFFFF); 3 o2 `5 N/ y$ j
- LED_G(ON);2 f, A5 g, c: }8 ^% W
- Delay(0xFFFFF);
2 G4 v0 _ h* O1 }/ d4 Q8 M. A9 b - LED_G(OFF);
' L6 @; }+ u4 @/ v* Y - Delay(0xFFFFF);
4 V+ f5 i( ]$ W2 G, O0 t) Y: f F - LED_B(ON);$ m( p2 |# |0 F5 b7 l
- Delay(0xFFFFF);
$ R* _& H" b% G" p) v - LED_B(OFF);
( V! z% V! k. s" |3 ], \1 i - Delay(0xFFFFF);
' w" @& F( c$ M; L- A4 Y - LED_R(ON);8 x% U; M f) A, e& L. u' G1 w D
- Delay(0xFFFFF);1 ?. u5 T3 Z) V" X+ ]
- LED_R(OFF);
- i# k7 f% X; i; A y1 d) r - }
1 r7 s" k5 s* o- T5 f7 ^% t3 C - }
复制代码
9 F) f1 G. {. M& ?% c仿真图
' j2 t: C3 o% o( J; {( F) h3 O( F G n4 o) n
; m, D2 j n" v2 M* d* q9 J3 y |