一、硬件电路分析
! w! Q" h/ t, ]1 I" J7 U; q具体LED原理图如下图所示:+ s' B- O+ [% _0 x; n$ D: c) G
$ b' Y2 Y d' J' E
, c) M1 a$ X: [; Z9 I m5 i4 N/ w
( E# E5 B; C1 m( }7 c, T! Q% i2 e( Q
由LED原理图可知:
; A5 y9 _9 G$ Y" x# I/ j& j& W当单片机的引脚,PB14和PB15输出低电平的时候,LED1和LED2 亮 。
G+ R; Y& M' _5 p当单片机的引脚,PB14和PB15输出高电平的时候,LED1和LED2 灭。& u6 o' l1 ]% ]) C) I( H7 t! ^
- E* a' H+ z* @! G/ X; O: \* K
二、LED灯GPIO配置
: e) D' L7 N! L" R5 \ J1. GPIO初始化配置( a$ T* Z3 z/ h4 U- i) q
(1)使能GPIO时钟1 Z/ I4 R; O c: g6 g
APB2外设时钟启用和禁用函数$ X1 x: @* M+ o; v4 m1 R
1 N( G. N8 u6 V- /**
* r3 W5 {; d; w+ S/ y L9 q4 E - *@功能:启用和禁用APB2外设时钟+ Y' ^' H- W' \2 n( X1 W; t7 f4 `
- *@参数1:指定外围设备% n; N( T0 @- z: m7 ~, v
- *@参数2:指定外围设备状态
% C I" B! w. m1 e/ b# ^ - *@返回值:无
( k: F7 p, s/ j" ^+ a - *// n5 H0 u4 K( ~5 t
- void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
复制代码 # U( w" K. Y, I0 I2 @
APB2外设如下:- ]7 @1 L. f: K; @; @) p2 I: [
* [& {8 \$ J4 Y0 V
- #define RCC_APB2Periph_AFIO ((uint32_t)0x00000001)
/ A K9 w% e2 J; k - #define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004)
( ]6 i' O- A& y! ]. x# i - #define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008)
8 s# _: r) y# B) z2 g# C. C - #define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010)" `6 A7 v) C! a2 F; v# O
- #define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020)
+ T$ Z3 b, G" W! u$ S2 v# b - #define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040)
4 N7 V% I6 p2 R9 t' h* R - #define RCC_APB2Periph_GPIOF ((uint32_t)0x00000080)- \( n; C% O1 J1 g& z7 @( k
- #define RCC_APB2Periph_GPIOG ((uint32_t)0x00000100)# ]. x3 X/ r9 ~* l. b3 v
- #define RCC_APB2Periph_ADC1 ((uint32_t)0x00000200)
3 K5 V/ ^( s2 ]/ v - #define RCC_APB2Periph_ADC2 ((uint32_t)0x00000400)/ @ `3 k# V4 ^5 p
- #define RCC_APB2Periph_TIM1 ((uint32_t)0x00000800)) K; w. Z7 J" e- ?% V" c
- #define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000)+ X' ]3 t5 m: M* r! R# L- U- o9 b
- #define RCC_APB2Periph_TIM8 ((uint32_t)0x00002000)
9 D2 }, R& V& R& T& z - #define RCC_APB2Periph_USART1 ((uint32_t)0x00004000)- x$ v0 U! [: q( ?6 m6 W
- #define RCC_APB2Periph_ADC3 ((uint32_t)0x00008000)
" F" z. i( z% C2 |+ Y - #define RCC_APB2Periph_TIM15 ((uint32_t)0x00010000). Q% d2 ^+ A5 v V) k
- #define RCC_APB2Periph_TIM16 ((uint32_t)0x00020000)7 f3 Q$ Z- H3 [( O
- #define RCC_APB2Periph_TIM17 ((uint32_t)0x00040000)* j5 u: X Q( f& s# R$ T' s
- #define RCC_APB2Periph_TIM9 ((uint32_t)0x00080000)
6 m5 O) l v* _/ H5 j/ N, E - #define RCC_APB2Periph_TIM10 ((uint32_t)0x00100000)& L( F. N! L3 Q/ [0 f8 r, ^) \
- #define RCC_APB2Periph_TIM11 ((uint32_t)0x00200000)
复制代码 1 u+ [& L: q: R& Q/ K
本次配置如下:- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); // 使能PB端口时钟
复制代码 ( i. _0 g& F( ?- a6 p2 {
(2)GPIO初始化配置信息
- h: B, S) `9 y3 `" u工作模式可以参考:STM32F103:GPIO八种工作原理详解- N$ @" m" Y+ ~. D2 C# M9 e. f
, z- R* y8 u- s7 e5 h
GPIO初始化函数如下- /**
2 |8 ]5 t- s( m& F' w - *@功能:初始化GPIO外设
/ n7 u, |4 ?6 p - *@参数1:指定GPIO外设(GPIOA~GPIOG)
/ ~1 t! m- W3 n c - *@参数2:指定GPIO外设的配置信息
( _, v" Y7 F0 V$ r/ u6 b/ I - *@返回值:无- C' Z2 T: s5 A+ Y& H' `. ~
- */
3 \! q( B% \: a! z, U! B, T - void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
复制代码
) S7 l7 _7 M4 P' s. ?5 v4 v+ S9 p1 oGPIO_InitTypeDef----GPIO初始化配置信息:
; y7 u$ w3 Y7 ]! v, o4 C/ h' S6 Z8 h0 V6 `& h
- typedef struct
, [8 K& z% b( } - {
) `* {3 Y, O, k( W( e4 l! w - uint16_t GPIO_Pin; //指定要配置的GPIO引脚
. a5 L( R8 J6 L2 K - GPIOSpeed_TypeDef GPIO_Speed; //指定所选引脚的速度. R( D5 {8 d) Z: N- @" a
- GPIOMode_TypeDef GPIO_Mode; //指定所选引脚的工作模式6 x% F1 f6 C4 l3 M4 d% e- ~9 }
- # l9 f" b# b! p: K; N& X7 U3 a
- }GPIO_InitTypeDef;
复制代码 8 Z, w8 U0 }5 m! j$ i T* O& I3 w
GPIO_Pin----指定要配置的GPIO引脚:
& K) {9 P. d% _" a+ e& D1 P6 Y' N" L. O' [
- #define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */+ y7 b, G( I: g( C
- #define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */' c9 g7 P9 E: y/ N
- #define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
4 O+ o$ n6 l6 B2 n7 ?! e8 F2 r - #define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */9 H1 W- Q: _: D. @" F5 p0 O6 u
- #define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */" r2 h9 K1 ?- H4 d$ G7 x) B9 O
- #define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */4 b. h; l& q& \7 m
- #define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */' D0 @' U: U, e- @. l* Y
- #define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */
( p k6 ]) o- k% K8 x - #define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */
% w% y) j; u/ A! s5 F! F - #define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */
. B' C9 R$ [9 O - #define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */
3 ^- p$ s: H# R' c; G6 }1 N3 ` - #define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */! ^% W" A7 w3 `
- #define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */% L* K/ G, }& W% U {
- #define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */
6 b7 |& t2 Y: M. b% g1 ^ - #define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
% X7 ~; z! F! M! b7 k# B3 U- ? - #define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */, }9 B2 q1 m5 h: r
- #define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */
复制代码 3 `9 C0 X- t( t5 E% o* \
GPIO_Speed----指定所选引脚的速度:
( Y0 R( V: o/ g) b6 c# b9 U. a; R& I* L
- typedef enum& @1 h) u* t% V$ L2 [( J
- { # j! C& }# B+ T8 v/ Q
- GPIO_Speed_10MHz = 1,4 @1 w! y7 m( r5 \8 y
- GPIO_Speed_2MHz, 4 K8 ]0 \# ^5 D1 y; [. _6 A
- GPIO_Speed_50MHz! ^( l- ~, Q$ L% f1 M
; s8 y3 v! A8 G' [- }GPIOSpeed_TypeDef;
复制代码
# b5 y% s E+ `0 _% ]GPIO_Mode----指定所选引脚的工作模式:' ^ ?4 y' x; q0 _! i
" a) G: z2 H# Y D) ]
- typedef enum% N8 c/ l" I. Z! E
- {
1 @8 Y1 b. q" k! Z/ h% D - GPIO_Mode_AIN = 0x0, //模拟输入模式
5 s) |8 k5 p5 S* o - GPIO_Mode_IN_FLOATING = 0x04, //浮空输入模式7 K3 T1 C0 ~9 V0 V w" m% U e+ Y( z
- GPIO_Mode_IPD = 0x28, //下拉输入模式3 L0 D- c6 @) S% ]
- GPIO_Mode_IPU = 0x48, //上拉输入模式
6 ~9 b4 |/ V* V& E& a- J! | - GPIO_Mode_Out_OD = 0x14, //开漏输出模式, F& T7 ?& _2 |( H. X. [1 z: i% Y
- GPIO_Mode_Out_PP = 0x10, //推挽输出模式
# {5 d4 k# v# }0 V, \ - GPIO_Mode_AF_OD = 0x1C, //复用开漏输出模式
8 r/ o, ^8 S7 ]1 M7 b. u+ } - GPIO_Mode_AF_PP = 0x18 //复用推挽输出模式) q0 Y( a+ |1 a+ D0 a! _
-
( K Z. u0 _6 T' |) N - }GPIOMode_TypeDef;& s1 ^& t, B- J7 |$ P7 W. n9 r
复制代码
' j2 ^+ u4 ~; Y4 H本次配置如下:7 E. C' V- R `3 R- x. D- g
p+ e! u2 |+ Z) K- GPIO_InitTypeDef GPIO_InitStructure;
* @# x4 l4 n9 o3 R - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15; // PB14,PB15) }) h2 H. Q8 m S+ }
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式: c- L, _ N c! H+ U" R7 l
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50mHz速度2 q' e8 e6 Q' ^" t( F _
- 1 D$ s! E' ]( B( N" ?
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB端口
复制代码
3 F( m7 Q7 u* ]2. GPIO控制配置
( V. \& o, V% W4 B" T7 _' lGPIO引脚置高函数
3 V0 ?! X1 `( D- T) C! V2 r, k& T+ D8 h+ x
- /**
3 _# s" k w( ~ - *@功能:GPIO引脚置高* S; @& D8 u. ] w" s
- *@参数1:指定GPIO外设2 |4 @6 J! e% m0 e4 s* r1 H& n
- *@参数2:指定GPIO外设的引脚端口号, t0 g$ g& P$ u
- *@返回值:无
% I' T6 h6 g$ a% }2 m8 f+ D- A - *// {0 M9 l! t7 M. }6 C* a1 Q) H8 D
- void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
复制代码 / C+ h) M5 E7 y! r* g& l5 z x0 p+ ]( @
GPIO引脚置低函数
4 L, D; ~/ f6 ^( j J) g; z# P+ Y& |4 q" H6 l, g) S
- /**
# f* Y9 X7 F% ]8 B/ [5 A2 K - *@功能:GPIO引脚置低1 q/ _0 U* d s- R( [
- *@参数1:指定GPIO外设% I F, h( D2 B) M' f
- *@参数2:指定GPIO外设的引脚端口号
/ y: s7 C5 k) k; ` n1 y3 g - *@返回值:无
" r! Z9 Q7 u q( R - */
) V7 N9 W& u' s# ~# b - void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
复制代码 & N/ c' G- z' t; r/ S
本次配置如下:3 r( e6 ]8 A$ ~: Z' _% y
+ ^; r: P2 \8 B% j! i% b- GPIO_SetBits(GPIOB,GPIO_Pin_14); //PB14置高
/ y5 P4 R5 M3 o. Y. N - GPIO_ResetBits(GPIOB,GPIO_Pin_14); //PB14置低
复制代码
, B. W0 T! c) P1 n2 l, F0 I3. 具体程序: C% O$ n" D6 a5 y& d3 q
LED.c文件- ~# r% ]0 U; I( E
5 u; t* j4 s. U& A( r( W% {
- #include "led.h"% ^2 ~1 `( s. h, W1 G% F$ w
2 g7 C5 [. \+ P/ p- /*************** 配置LED用到的I/O口 *******************/' l7 y/ d* d& T, Y
- void LED_GPIO_Config(void)
3 K9 m/ c5 n. |5 m - {
& u- a \+ x2 n - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); // 使能PB端口时钟 ; S# ^8 Q( |0 S& o
- $ d; N# M( T( w! B; t: _' t
- GPIO_InitTypeDef GPIO_InitStructure;
) ^$ ~& k$ N# y9 s - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15; // PB14,PB15
" e: @; V" b; m - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式
2 {5 Z+ W5 Z( d, l+ O5 E: ^, S - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50mHz速度: ?0 l( j) S" L2 o0 ^5 t
- , `& p, y) E4 V. m
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB端口# ~5 @+ q+ `" I6 m7 r0 x
- }
复制代码
" b5 I k& i$ P+ v. q4 ILED.h文件
4 ~' X& r$ M/ G! m- v1 y
, y3 K8 [4 B3 L' d# p2 H9 T3 x- #ifndef __LED_H/ F8 A |/ |1 q5 N7 U
- #define __LED_H M3 |2 }+ K: ^& V! P ?5 ~
( W5 ]3 X, f2 N6 `0 o" t8 f- #include "stm32f10x.h"' G( | L$ u+ x1 g( p- A# v
) g! K3 o; w6 M+ }1 V- #define LED1(a) if (a) \# H6 Z) K4 h0 W" C$ j
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);\
5 R, O- b$ j2 u - else \
1 u* M$ r$ H- `) w" o - GPIO_SetBits(GPIOB,GPIO_Pin_14)# `$ _% _. o7 b* E: ^8 a
-
% G8 \& @9 E# ^1 K, i8 k4 [* { - #define LED2(a) if (a) \
; e/ w7 K1 Y$ I p w - GPIO_ResetBits(GPIOB,GPIO_Pin_15);\- q) C- J6 v# B1 r( c0 K
- else \
# T1 j' {; q; E: N. @, B6 r - GPIO_SetBits(GPIOB,GPIO_Pin_15)
: I6 R% E& x' S, R* z
% K. u! G& \& k. D- s: ^/ ^- void LED_GPIO_Config(void); //LED初始化配置
6 Z7 y3 l" y" i: z, K - 2 y& ~- |$ q( X D2 d
- #endif
* f$ ]6 p6 E* X' R! ~ Y
复制代码 1 E$ G! q2 \- [0 V0 b0 ]8 ~( V
三、LED跑马灯
, W, H- q" Y. r% L4 V, i# N1. 延时函数, i x" ^0 H! [
/ L/ Y. O: r4 b, G& w. B( j4 v7 |8 D) F/ c3 b0 [7 n
2. LED跑马灯实现" w, u3 Y8 [! R# F' Q$ I" Z4 `2 b( W
- #include <stdio.h>
& s- u3 z+ B( k" Q3 m - #include "led.h"& y+ ]7 L5 i& O5 P$ L
- #include "delay.h"- }5 z3 B- L/ f/ h M0 j6 E1 `" C2 f
- # d, A. [5 l( x6 i+ y' y
- int main (void)
; `7 ], M; M# h- C% H9 X; { - {
1 z) F. w9 N- B$ M% }) C - SystemCoreClockUpdate(); //设置系统时钟为72M
5 @4 P+ y7 U# h. n9 s8 P2 ^ - LED_GPIO_Config(); //LED初始化配置5 _# z& @+ T9 \; ]$ v# f6 s( F
, J0 Y2 K9 D# K! y9 Q- while(1)# }8 I9 ~! {3 M+ p
- {
. G7 K1 \. ]* q/ A - LED1(1); //LED1亮) m: q; S% w9 p* U, z: F
- LED2(0); //LED2灭8 N! V; S) s+ v! P: {) ^9 T) @3 y5 y
- delay_ms(200); //延时200ms& t/ e% P) E7 w& m& x1 d" P
- LED1(0); //LED1灭
: P8 v M( ^2 d4 U4 m - LED2(1); //LED2亮1 J) U9 E0 K$ l/ x& N
- delay_ms(200); //延时200ms' R- ]+ v5 Y; ] B( w% Z+ C/ d, g' E
- }& m$ u: E/ k; {! D* G
- }
复制代码
z4 }. w0 Z- d1 q# F- p( L
: K. i, s9 @5 R$ Q1 x/ O& F0 o9 ]0 }$ l; `3 Q. L- q
9 e, B6 m- P% p7 z
( N8 e6 C1 c. u |