你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

物联网之STM32开发二(GPIO口操作)

[复制链接]
STMCU-管管 发布时间:2020-9-27 11:19
STM32—GPIO操作(基于STM32F051开发板)

1_meitu_1.jpg


: p+ x: S, `, }- s+ A内容概述:# K2 k( Q: I! R( L2 ?% X

GPIO的基本概念及寄存器介绍

照亮电子世界的那盏灯——LED寄存器版

照亮电子世界的那盏灯——LED库函数版

初识人机交互——按键


" q0 h( [4 D+ m; @& l, H

% A8 [$ q! D+ \- d3 `1 N! f6 O7 N

GPIO的基本概念及寄存器介绍:7 G$ a2 e& n& ?4 K' A0 q5 \

内容概述:

GPIO接口简介

GPIO功能复用

GPIO寄存器介绍

GPIO接口简介:

通用输入输出接口GPIO是嵌入式系统、单片机开发过程中最常用的接口,用户可以通过编程灵活的对接口进行控制,实现对电路板上LED、数码管、按键等常用设备控制驱动,也可以作为串口的数据收发管脚,或AD的接口等复用功能使用。因此其作用和功能是非常重要的。

! Y/ g4 F2 j6 V( Q" B

& t0 S  T+ W, T' |* I9 Y

2_meitu_2.jpg


+ N1 l' G2 k& c$ g8 h$ _+ ^( g5 Q; c0 C9 @8 x" w

3_meitu_3.jpg


% \$ y) x/ i' ^, w5 D' }$ c; U6 [# ?8 E" S5 ~& o% L

4_meitu_4.jpg


% A1 F& w; {* Y  d4 f; }4 z; {$ W
. H0 N( P4 b$ E8 d

GPIO寄存器介绍:

! c' ]2 a9 z# s

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(复用功能低位寄存器)


9 p8 ]) d5 w# u$ C

注:每一组GPIO端口都有一套上述的寄存器去配置它自己的功能

GPIO寄存器MODER(端口模式寄存器):


5 e  y4 E: F5 U- P8 f

5_meitu_5.jpg

; N% {$ Z2 k' q
) u7 Z9 l/ a. `; t& x# v: e

                                              6_meitu_6.jpg

& t! f% ^& G" c$ ~# c3 ?

7 {1 F. s* K) P7 `* D  \  L' b

GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..D,F)   

偏移地址: 0x00   

复位值:  

●  0x2800 0000 端口 A  

●  0x0000 0000 其他口

GPIO寄存器OTYPER(端口输出类型寄存器):


8 c! [$ W6 Q0 X! {! C1 e

7 x& V- n$ r) Y0 k


' Z; }6 s1 p1 U6 h

7_meitu_7.jpg

0 {& l: J: M4 T5 |) G" R0 X

                                  8_meitu_8.jpg

3 C/ m/ H" P2 }1 t0 Z( j8 x; ~% X1 Q

4 [/ z; U' t3 X

GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A..D,F)  


, Y" _: S# I9 ?; x; F

偏移地址: 0x04  

复位值: 0x0000 0000

GPIO工作原理框图:

6 \; Y9 \* s, M

2 n/ j7 m$ f& u) R; W$ c) I

9_meitu_9.jpg


+ n1 M5 s. T) ?" K" o! _9 ]; A* V) p1 ?8 ~
; K3 [$ N  G, |+ V. O% _

GPIO寄存器OSPEEDR(输出速度寄存器):

5 x$ b5 Z8 A' a- h" N. y7 C3 E

8 U5 b! S6 b4 [

7 X. Y, _. L$ U# Y' R( i; v  o/ y

8 |9 i/ {& [* A2 i

10_meitu_10.jpg

: W% ^$ M! N1 C/ P! g
# f# ~4 O) N; B; W, T6 W& ?7 k+ j
1 b0 u% ?+ S) o) f/ z* o. G6 |

                                                 11_meitu_11.jpg

2 A9 A! X0 N2 r- @$ {( F5 k- G

9 a; W# Q% M; Q( g

GPIO 口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..D,F)      

偏移地址: 0x08      

复位值: 0x0000 0000

GPIO寄存器PUPDR(上拉 / 下拉寄存器):

7 C" X+ N; U% @8 H' i

12_meitu_12.jpg

% r( I  j4 U9 E9 F

0 x: ^" r* A1 k/ X/ H

                                                   13_meitu_13.jpg


8 R- C) N) z4 m- ?! u  N  V& G! ?1 i: S

GPIO 口上拉 / 下拉寄存器 (GPIOx_PUPDR) (x = A..D,F)      

偏移地址: 0x0C      

复位值:   

● 0x2400 0000 端口 A   

● 0x0000 0000 其它端口


2 M, `5 v9 ^/ A+ q2 Z# q4 [7 Q

GPIO寄存器IDR(输入数据寄存器):

5 W7 q& X$ n/ z

14_meitu_14.jpg

6 F& v3 M( b' P, x+ x

                                     15_meitu_15.jpg


6 L% u% j/ q) z' O9 C$ k
' U) {5 w2 `7 g+ T5 h! ]: Y) ?1 y

GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A..D,F)      

偏移地址: 0x10      复位值: 0x0000 XXXX (X 表明不定 )

GPIO寄存器ODR(输出数据寄存器):

1 [+ w) C6 `5 x- n' N

16_meitu_16.jpg


) r) c2 K; f1 t! M! E/ t) R
! p& g9 z3 W6 l* T: \

                                       17_meitu_17.jpg


+ u8 V  o6 _8 x/ ~9 N- `9 n/ I

GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A..D,F)      

偏移地址: 0x14      复位值: 0x0000 0000

GPIO寄存器BSRR(置位 / 复位寄存器):


: D: r- P! W0 s. v/ }

1 N' M$ ^( \# `/ g6 {+ j, T

18_meitu_18.jpg


2 v$ Q* i2 r4 e% E6 w

                                              19_meitu_19.jpg

8 O8 @+ Y, Q1 ]! ^" O; |

; E, Y5 z7 ?9 C; r! j+ M

GPIO 端口置位 / 复位寄存器 (GPIOx_BSRR) (x = A..D,F)      

偏移地址: 0x18      复位值: 0x0000 0000

GPIO寄存器AFRL(复用功能低位寄存器):

& Y  f* S  B( I1 R. h

20_meitu_20.jpg


$ E, t% C; E. g: A. v& `# x7 L# i/ L: o* ?. \% I' _1 z% ?

                                        21_meitu_21.jpg

" q. o$ ?6 U$ u/ q2 i* {9 S

GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A..B)      

偏移地址: 0x20       复位值: 0x0000 0000

# D' g9 n$ s: P7 i

GPIO寄存器AFRH(复用功能高位寄存器):


) V7 C. h% k& b& F* o4 ?( Q2 ~; u

22_meitu_22.jpg


: G% W& B" c1 J2 R. t4 [2 U3 |
7 b$ ]! R9 f4 u6 o  D# i- m- @

                                  23_meitu_23.jpg


, I4 T3 V2 @: {, j, t

GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A..B)      

偏移地址: 0x24       复位值: 0x0000 0000


+ O. {- G; M) y- \5 a+ C

照亮电子世界的那盏灯——LED寄存器版$ p0 U: B6 n9 I1 o, @

$ G+ R( _9 a, k

内容概要:

硬件原理图分析

编程步骤分析

编程实例操作

硬件原理图分析:

: U. G0 {0 n  S7 b$ y' \

24_meitu_24.jpg

, w2 g: a1 ~. s

使能GPIO的时钟:

) K7 k) c. Y2 K& ^' M6 j2 N

25_meitu_25.jpg


# w& U+ o3 j  d

26_meitu_26.jpg

# D/ b' |0 g0 h( [
( H$ `: w) f! @5 K, ]9 C

AHB 外部时钟使能寄存器 (RCC_AHBENR)   

偏移地址 : 0x14   

复位值 : 0x0000 0014   

访问:无等待周期,字,半字和字节访问

编程步骤分析:


3 r; [. n" l0 M4 }5 c

  1. 开启GPIOB的时钟
      Q7 C. ]* G0 C4 k. ^8 M$ O% w3 ?' r
  2. RCC->AHBENR  |=  1<<18;            8 W5 e5 w- D0 C% |( Q

  3. & a1 z: [$ h$ f6 D* \* B5 ^
  4. 配置PB0 PB1 PB2接口   7 P' M. l7 V5 f6 m. r: c! ?
  5. GPIOB->MODER |= (1<<0)|(1<<2)|(1<<4);    //设置PB0, PB1, PB2为通用输出模式
    - Z  _; E$ a( M9 ^) A: C2 X1 {
  6. GPIOB->OTYPER = 0x0;    //设置PB0, PB1, PB2为通用推挽输出! L! f3 X" B; o; b( g/ z
  7. GPIOB->OSPEEDR = 0x0;   //设置输出速度为低速9 V  v! c3 ]2 L3 p% L' H
  8. / W" {7 j& T7 A& V: p2 j
  9. 控制LED0 {" a/ C  k6 v, O* u- N$ K
  10. GPIOB->BSRR = (1<<16)|(1<<17)|(1<<18);     //复位PB0, PB1, PB2 既点亮LED
    * ?# @) J; m2 G& D- ~; `7 p9 d) m
  11. GPIOB->BSRR = (1<<0)|(1<<1)|(1<<2);    //置位PB0, PB1, PB2 既熄灭LED
复制代码

0 L( b, P" t; s2 R8 ^
+ [8 Z  P, p- M& P5 N: v! D: Q8 @照亮电子世界的那盏灯——LED库函数版" ?( C8 S  ]0 o% f1 Z/ B& D1 f# u

8 s, O2 o5 E. w+ |

内容概要:

硬件原理图分析

CubeMX配置

编程实例操作

硬件原理图分析:


8 U5 u, W9 `: d( v) H0 N* `

27_meitu_27.jpg

! T2 `/ r5 g3 z. o" {, C

CubeMX的配置:


0 ?. e% Q! ?& S9 q  m1 g* ?

6 U* O: f/ h+ m/ P

28_meitu_28.jpg


/ m: g+ _+ T  H! o+ ^+ |- ?& F4 v0 j  z0 l$ f# z# R" H

29_meitu_29.jpg


! D* G. [6 A! G7 P

初始化关键代码分析:


! @' j9 R/ t3 I. ~0 C5 Y7 U

  1. 开启GPIOB的时钟1 e$ u' K8 u9 Z* n8 b% s
  2. RCC->AHBENR  |=  1<<18;            
    6 g# f' N1 R5 j) z% j  E, ^
  3. 3 f, H; m& Q8 j7 B, s4 W
  4. 配置PB0 PB1 PB2接口   
    ! b" @9 C, F; q$ D3 Q' H
  5. GPIOB->MODER |= (1<<0)|(1<<2)|(1<<4);    //设置PB0, PB1, PB2为通用输出模式* r$ Q9 X. {  C1 e+ b& O) y
  6. GPIOB->OTYPER = 0x0;    //设置PB0, PB1, PB2为通用推挽输出. [7 r$ B* Y/ a' b
  7. GPIOB->OSPEEDR = 0x0;   //设置输出速度为低速3 ^( C) [4 Q/ R1 b8 N* K6 A
  8. $ B3 ?, Q) m- a( _
  9. 控制LED8 h- \+ y+ |1 H0 j. f) ?
  10. GPIOB->BSRR = (1<<16)|(1<<17)|(1<<18);     //复位PB0, PB1, PB2 既点亮LED4 T2 _! o$ h$ L1 W, w: p9 d$ g
  11. GPIOB->BSRR = (1<<0)|(1<<1)|(1<<2);    //置位PB0, PB1, PB2 既熄灭LED
复制代码

: U1 L1 Q; S( `4 l4 }

控制LED关键代码分析:


% G+ \" U* _* @( l2 L% K1 s; R8 r


  1. " I9 a! ?  ~/ t' G# G. h, `) d
  2. 复位PB0, PB1, PB2 既点亮LED
      H5 Z" q; N/ Z
  3. HAL_GPIO_WritePin(GPIOB,  GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET);8 A  f1 {* {/ y5 R( ^* t& d
  4. 1 }) ?) v% {" M6 P# }
  5. 置位PB0, PB1, PB2 既熄灭LED& |/ \1 D, H" A) |& r; D2 Z1 Q) ^6 ?
  6. HAL_GPIO_WritePin(GPIOB,  GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET);
复制代码

4 p/ K; s7 V4 H2 J* L初识人机交互——按键% r5 o. Y! J# i) N8 E- p
6 w/ T+ @" F) L" C% L

内容概要:

硬件原理图分析

CubeMX配置

编程实例操作

硬件原理图分析:

30_meitu_30.jpg

( q+ m4 H: r# O' v2 f/ t

CubeMX的配置:

31_meitu_31.jpg

" ^9 L# g. d7 M5 V  r8 D

32_meitu_32.jpg


( ~$ [8 X! m- _5 m8 \' Y* l0 I: t

STM32F0硬件:

33_meitu_33.jpg

编程实例操作:按下按键灯的状态会进行翻转


9 _; n  a$ M7 c$ F! h8 {& d


  1.   V0 F+ S% @' Y! {1 l: u- v
  2. ​while (1)
    , X4 |) d" p. G1 R- q
  3.   {" a$ w; W: T: R7 n
  4.                 while(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)); //判断按键是否按下
    - G9 o6 K5 H+ F: j0 b
  5.                 HAL_Delay(20);  //延时消抖
    ( N4 e) v" ^: ^. S, n: z$ e
  6.                 while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8));  //再次判断按键是否还是按下状态
    ( s6 J* D* q3 s8 {/ l7 i1 ?
  7.                 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); //使灯翻转(亮灭)
    0 P/ G+ h  c5 k( x: A* u1 h9 I: ]& y
  8.                 while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8));  //判断按键是否抬起
    : |' c# J) C, @. A' z; x" {/ `
  9.                 HAL_Delay(20);   //延时消抖% i* \7 q( D' X  m+ z
  10.   }
复制代码
8 U6 Y" x; G2 ]
# y7 x6 r* b4 K4 |3 ]  F1 E# Q' s

: u* d/ p# N8 C
) |! v$ L1 j9 h* `  f6 r
" F# x2 Z3 i% y. W& C: A# {
收藏 评论1 发布时间:2020-9-27 11:19

举报

1个回答
陌路夕颜 回答时间:2020-9-27 17:00:52
写的很详细,很清晰
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版