STM32—GPIO操作(基于STM32F051开发板)
& A, V# _: A; W0 |: E, M内容概述:
+ [$ G w) D$ I# ]& GGPIO的基本概念及寄存器介绍 照亮电子世界的那盏灯——LED寄存器版 照亮电子世界的那盏灯——LED库函数版 初识人机交互——按键 % V7 }* {3 U6 ]. c( j: ?7 W- a3 s
" f, n) X0 H0 h% z GPIO的基本概念及寄存器介绍:
9 ? b' O+ e$ B. \) Q内容概述: GPIO接口简介 GPIO功能复用 GPIO寄存器介绍 GPIO接口简介: 通用输入输出接口GPIO是嵌入式系统、单片机开发过程中最常用的接口,用户可以通过编程灵活的对接口进行控制,实现对电路板上LED、数码管、按键等常用设备控制驱动,也可以作为串口的数据收发管脚,或AD的接口等复用功能使用。因此其作用和功能是非常重要的。
* ], k1 j p2 M% D5 t7 f
5 A8 R' t: T2 z
! _- P. \' J, a- Y4 t7 S8 G3 X. X( e/ O! Q
5 v& b5 H& B# [) `! E' b3 ^! `* ^, p: D: F& c6 |; p
9 A$ E8 r8 }( D' }
) h3 `" B1 C, l* H+ _GPIO寄存器介绍:
n3 Y$ q/ u2 `; B7 r$ j
STM32F051-GPIO常用寄存器:(下文会具体介绍) 4个32位配置寄存器 GPIOx_MODER(端口模式寄存器), GPIOx_OTYPER(端口输出类型寄存器), GPIOx_OSPEEDR(输出速度寄存器), GPIOx_PUPDR(上拉 / 下拉寄存器) 2个32位数据寄存器 GPIOx_IDR(输入数据寄存器) 、GPIOx_ODR(输出数据寄存器) 1 个32 位置位 / 复位寄存器 GPIOx_BSRR(置位 / 复位寄存器) 2 个 32 位复用功能配置寄存器 GPIOx_AFRH (复用功能高位寄存器)、GPIOx_AFRL(复用功能低位寄存器) # f. p9 A' `, C+ U- x" U& }5 f; A
注:每一组GPIO端口都有一套上述的寄存器去配置它自己的功能 GPIO寄存器MODER(端口模式寄存器): : Y. ~! R) a# x
( G0 G0 ^& K$ L! e
& |5 M5 D( ?! A" C: J
$ I& u+ ]- S+ D6 ?9 ]$ ]
9 _0 n; }3 \2 |GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..D,F) 偏移地址: 0x00 复位值: ● 0x2800 0000 端口 A ● 0x0000 0000 其他口 GPIO寄存器OTYPER(端口输出类型寄存器): 6 Z- _1 l1 ]) l& y" n c; w1 U8 j
5 f, d7 C& m5 ?# h
" b. o j' I# G
( W( [! k, t7 a- {: _8 H5 R$ {
2 m4 k) C' B _% W' |$ ^/ |# s/ ~; s# Y9 S8 y/ l- J. ^* Z9 l6 K
GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A..D,F)
* N+ i9 M4 y: n( D
偏移地址: 0x04 复位值: 0x0000 0000 GPIO工作原理框图:
0 E. ~8 G$ ^" D, _$ E3 g( o
5 U8 K# N3 ]- J; k
4 U/ P# u5 S/ o j% C+ E
# X" a, q* r: a5 o f) R: hGPIO寄存器OSPEEDR(输出速度寄存器):
* R @: }# I4 o* {% @
8 H+ D+ j# y5 C, I
2 m1 s& k9 H) r( d: y# q
: u( c! W. f2 t5 V5 R* B0 Y d
- Q, }- a6 o- t9 k: |& b- v! }- b" s* Y" Y/ G
* E: J# i9 D/ n8 U5 ?) k2 v
* V6 W5 \) V, P! D$ r
2 V) Q2 ?7 h+ v8 jGPIO 口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..D,F) 偏移地址: 0x08 复位值: 0x0000 0000 GPIO寄存器PUPDR(上拉 / 下拉寄存器):
" \7 L; H! X% P |
% o6 s/ U3 k3 ~7 c( t
5 q* k, [+ _: G# x+ F9 v/ F
* k7 p4 v1 x8 y! {
8 |6 _2 U4 v% ^& x( V- GGPIO 口上拉 / 下拉寄存器 (GPIOx_PUPDR) (x = A..D,F) 偏移地址: 0x0C 复位值: ● 0x2400 0000 端口 A ● 0x0000 0000 其它端口
& s$ F1 @; D: L" j
GPIO寄存器IDR(输入数据寄存器):
! h, G4 B2 B9 I& K# S
4 ^0 z' v1 x6 B$ \8 K* z
0 t1 q: D' \. M: @% h; |, _# r
, G3 G# Z2 ?, `5 }1 F7 XGPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A..D,F) 偏移地址: 0x10 复位值: 0x0000 XXXX (X 表明不定 ) GPIO寄存器ODR(输出数据寄存器): ; S: |; u: g. B+ C: N; S
, L) t @6 u2 O
7 p. E4 j1 t8 V* ?! \- p, R+ b! y
( \: o' } v$ k
GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A..D,F) 偏移地址: 0x14 复位值: 0x0000 0000 GPIO寄存器BSRR(置位 / 复位寄存器):
2 f) y7 T8 C1 {7 ^! R1 s
/ t+ q( a" h! ^+ @) \) C( U3 |5 O
2 i% U0 _( x$ m' O1 t
2 e' K0 t1 T3 c! {
; d I' D* t& X! S
GPIO 端口置位 / 复位寄存器 (GPIOx_BSRR) (x = A..D,F) 偏移地址: 0x18 复位值: 0x0000 0000 GPIO寄存器AFRL(复用功能低位寄存器):
/ ?) _ J* d4 B0 u9 \/ W
* z$ y' X2 [# i1 w8 Y9 I/ Q o' B) z
* r% a* u, k, z& ?; K' O/ _+ s
- S# M! | b6 U$ RGPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A..B) 偏移地址: 0x20 复位值: 0x0000 0000 4 \1 t( s8 e" x- a+ V+ C0 @
GPIO寄存器AFRH(复用功能高位寄存器):
- P2 u V7 V3 D; M, w
0 J+ C+ C! [( O0 {1 y7 X- J5 T# B
5 H V6 @. J+ u( H: c
8 O9 E, l( p9 E5 J1 O1 V" _GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A..B) 偏移地址: 0x24 复位值: 0x0000 0000 ! X6 n7 B1 W5 Q8 V8 D; v+ i' E+ k
照亮电子世界的那盏灯——LED寄存器版" f3 K$ G; K6 k7 v5 }6 L( s' \
$ R; X$ l7 n+ g* D5 ?/ o+ C8 F3 n内容概要: 硬件原理图分析 编程步骤分析 编程实例操作 硬件原理图分析: 0 G4 P. |: R+ u
0 C( @! A& H' z8 y. \6 k: C使能GPIO的时钟: ; u% \ U( l- Z! x
# A, K# Z% s+ t( u; {9 q7 G4 R; h* c
0 K* u$ `& B& C/ W
+ Q( T0 ]8 ^" k2 eAHB 外部时钟使能寄存器 (RCC_AHBENR) 偏移地址 : 0x14 复位值 : 0x0000 0014 访问:无等待周期,字,半字和字节访问 编程步骤分析: 7 T D3 u0 k0 n$ b4 u8 e! `
- 开启GPIOB的时钟. X( z# m) e" B( [; [( w! i- d, i
- RCC->AHBENR |= 1<<18;
; z/ \) ]# {. c' r. M( w -
, e+ d$ V+ B8 P N& a - 配置PB0 PB1 PB2接口
) Q4 ?+ f1 E* @! P2 h' g o4 {; @ - GPIOB->MODER |= (1<<0)|(1<<2)|(1<<4); //设置PB0, PB1, PB2为通用输出模式
1 W* \& w# G+ I! ^- T% Y1 T% N - GPIOB->OTYPER = 0x0; //设置PB0, PB1, PB2为通用推挽输出
/ ^& v6 @* _& C+ A2 H3 @$ P - GPIOB->OSPEEDR = 0x0; //设置输出速度为低速) _, J2 x n' V
-
6 ?; D% V% Y2 _8 H% F! ^ - 控制LED4 S1 t- j9 q. q0 ]7 u0 g
- GPIOB->BSRR = (1<<16)|(1<<17)|(1<<18); //复位PB0, PB1, PB2 既点亮LED z4 b) @+ T, I9 s, {
- GPIOB->BSRR = (1<<0)|(1<<1)|(1<<2); //置位PB0, PB1, PB2 既熄灭LED
复制代码 ! r- S: M- j* o) p* X
0 O2 z- P0 }+ P: b7 u# _$ G
照亮电子世界的那盏灯——LED库函数版: t) |; N. K! V3 b
0 d/ j7 p) H' b0 q
内容概要: 硬件原理图分析 CubeMX配置 编程实例操作 硬件原理图分析:
# i8 z* N$ W2 t. J$ s
9 o/ y4 H2 V; X
CubeMX的配置:
3 _. s) Z4 c' x
S, k: v8 P3 n3 E
4 o5 d2 ~& U$ q# o* b' b% v; A' \# J
" R! Y* M. u, l4 }0 C e2 K
8 i0 d3 t* N. U9 U1 s$ @1 V
初始化关键代码分析:
& R) b4 A1 P8 M3 k% I8 M/ ]7 K# i& @+ L
- 开启GPIOB的时钟
# C, f. a6 c1 v - RCC->AHBENR |= 1<<18; ( k: d) t0 H+ o, V& M% c5 F1 ~
- , z9 ?9 s6 L; Q K6 m* g/ u
- 配置PB0 PB1 PB2接口
) D+ O. T/ B4 V, w9 a+ V3 O3 S5 ] - GPIOB->MODER |= (1<<0)|(1<<2)|(1<<4); //设置PB0, PB1, PB2为通用输出模式( t% n* T- }) S9 }! ]1 Q+ F
- GPIOB->OTYPER = 0x0; //设置PB0, PB1, PB2为通用推挽输出
; T" `" y: d: c. P - GPIOB->OSPEEDR = 0x0; //设置输出速度为低速. @3 i( h k/ L. ?* t, s
- 9 L ^- L1 I/ I
- 控制LED
( x% p: `9 @2 V1 F - GPIOB->BSRR = (1<<16)|(1<<17)|(1<<18); //复位PB0, PB1, PB2 既点亮LED8 L3 {; y! b( F" w& S7 X
- GPIOB->BSRR = (1<<0)|(1<<1)|(1<<2); //置位PB0, PB1, PB2 既熄灭LED
复制代码
8 }) ?/ f1 f2 Z+ b控制LED关键代码分析:
+ W& F2 l: g# Z" z
7 Z, q+ V! O% |0 U Y2 V l- 复位PB0, PB1, PB2 既点亮LED
^7 \, x8 X& q/ U* s - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET);1 N# Q" E6 z, {) o! O3 o$ q" v
-
4 O/ m1 D, C7 B! j7 J" Y. ? - 置位PB0, PB1, PB2 既熄灭LED$ f* f! N( x; b$ |" {; c: S
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET);
复制代码 $ [) W, ?5 y% Z! L9 F& y
初识人机交互——按键
; q0 t2 l- i7 ?: u% o) h+ n4 i- b3 g! j6 R* S6 t; _
内容概要: 硬件原理图分析 CubeMX配置 编程实例操作 硬件原理图分析:
1 N1 K+ [/ R1 s1 v1 n9 FCubeMX的配置:
) o! Q. c6 D7 I- Q% |! R1 O
1 o/ }" g) i6 x8 V0 D; N
STM32F0硬件:
编程实例操作:按下按键灯的状态会进行翻转 / d( y j9 Z2 L- v9 p& i5 c
- ' F- l* o# A# |* U% H
- while (1)& j# }( A) S8 w3 F& R
- {6 M& m; ?* c: I/ Q& y
- while(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)); //判断按键是否按下
' ~% n: W$ W! g4 Y$ E( F - HAL_Delay(20); //延时消抖
9 x$ R' H. L) x2 l$ P: N - while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)); //再次判断按键是否还是按下状态
/ y. I7 l- a q+ l& t" p% f, k - HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); //使灯翻转(亮灭)
) u' X- {5 W# H, r - while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)); //判断按键是否抬起
) p: K* Q8 u" R; ? - HAL_Delay(20); //延时消抖! E) @) }& y4 |: S
- }
复制代码 5 G, d1 `6 t2 M8 m3 a8 ~: I
2 L) L" e2 a) t, J4 S) Y5 t
* ?( f5 z/ y) M4 H" \
" l$ i5 \, i' k4 P) \" ^
6 B- \' ~9 f9 r7 v" W5 u
|