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

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

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

1_meitu_1.jpg


( r& X) a+ A  K" ]3 a! T- P$ \内容概述:
& N1 c! _: K$ {8 ?# c

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

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

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

初识人机交互——按键


* w; a- S4 l/ S* Q* _1 m  T8 r


) l, A9 _8 X) L' P+ T0 X

GPIO的基本概念及寄存器介绍:7 h/ s/ }- D, T& w( ?' X

内容概述:

GPIO接口简介

GPIO功能复用

GPIO寄存器介绍

GPIO接口简介:

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

1 l% ^1 G, c7 @6 C9 I/ a# X


2 k( z8 b- S$ B! N7 I0 E& h

2_meitu_2.jpg

; \8 u7 J" J4 {7 {3 K

# }) u3 @6 J* [6 ?/ X

3_meitu_3.jpg

: O- N, |; n: ^# @! M+ I/ ^
1 F9 c; A# l7 ~( f* l" f

4_meitu_4.jpg

( o  m% ]/ H' i
$ ?! y% J# W$ S8 v% R6 q

GPIO寄存器介绍:


$ I) v/ i6 c. 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(复用功能低位寄存器)

# ?7 L$ R5 c0 f

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

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


" V+ I# u) B7 A+ M6 w6 I

5_meitu_5.jpg

3 F' a; E2 b) a8 f

7 G0 h, N6 H$ u- C) c+ O

                                              6_meitu_6.jpg

" z! d0 Q0 F: \9 [8 Y
. T! E( e0 p: ^2 Y$ m( H2 F# x

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

偏移地址: 0x00   

复位值:  

●  0x2800 0000 端口 A  

●  0x0000 0000 其他口

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


- s+ q* |: ~( U


' {! [2 @8 \2 G* V

) p6 B/ Q" C# ^- }8 J

7_meitu_7.jpg


& V1 Y6 ]7 j  V

                                  8_meitu_8.jpg


/ M7 i6 t& v* Y. z/ b
; E* P4 I$ n4 v! x" b( x

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

# x' d. g) L; |+ D& \5 T

偏移地址: 0x04  

复位值: 0x0000 0000

GPIO工作原理框图:


7 _& a+ w' A$ l6 g9 ?' `


5 I% m9 D9 s! g) F" g

9_meitu_9.jpg

# [. ^" {9 I$ H6 l  e; z4 K) T+ d
5 n9 p6 ^* X0 j) a

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


3 t: x9 m3 n0 Z7 P- ^& h


: X4 c% g- }& _3 U( X' y! |  R# E% k

& N( X9 }1 F& a0 R7 C# y  C

# u% g3 L$ b5 E+ @

10_meitu_10.jpg


% }. {, |4 l0 f0 c* s- S
* H2 T$ L7 q3 W4 t3 j% E  K+ k" r5 j" N  l( j$ A0 {! Z) h! E

                                                 11_meitu_11.jpg


$ i% L" Y* f( G$ ]4 h! Q- y, Y; A3 u$ Z3 Q4 V6 w- `

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

偏移地址: 0x08      

复位值: 0x0000 0000

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

, u* U' I9 y3 ~$ B. K9 }) N! b

12_meitu_12.jpg


5 g8 u2 t5 J: [% b5 C
2 ^: w, M2 v  [; q

                                                   13_meitu_13.jpg

3 J# ?1 l& s" \

7 M5 z* p2 n! g9 S( {! T

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

偏移地址: 0x0C      

复位值:   

● 0x2400 0000 端口 A   

● 0x0000 0000 其它端口


+ }$ O& K) ^* u

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

; _4 @/ o7 r5 t! B# `- O% R& \

14_meitu_14.jpg

9 v+ a6 N, U0 D3 `/ C9 b: X: Z

                                     15_meitu_15.jpg


3 s4 f+ m3 G# G5 a7 k& v' F6 H3 l; n7 v2 i9 M

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

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

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


/ o2 ^1 l/ S* h

16_meitu_16.jpg


$ u) Z0 R3 }. j$ O, \+ {9 [. x( T, z( `$ _' a! ]$ M5 y

                                       17_meitu_17.jpg

* f5 n# k1 Z/ W9 l! [

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

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

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


8 F$ F! ?3 Y0 W  g" ~0 ~8 H" R- K


: H1 A' T) ]+ `. C

18_meitu_18.jpg

4 R2 `* y- L( P2 z) Q/ y5 d5 Z

                                              19_meitu_19.jpg


' |! K8 y; s- m
! y4 v! u4 C4 G$ ?, S

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

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

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

7 z9 F5 }/ D$ R) c- E) |

20_meitu_20.jpg

3 q6 x1 D7 p: }; e+ b. Q
2 n$ ^$ H- g, ?+ T0 M$ i

                                        21_meitu_21.jpg


* u) o$ H  t+ @2 Y; Z

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

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

. O$ R1 C; W& }" Q

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


# G0 w9 Z- b% E6 R5 o; u

22_meitu_22.jpg

4 R8 T+ Y3 Q# t0 F3 e( p7 s& ]

! E- a6 u( \3 y& T" I

                                  23_meitu_23.jpg

$ d& M+ Q5 t$ p  N. `* F

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

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


( ]3 h) G& Z( k: q. v6 H

照亮电子世界的那盏灯——LED寄存器版5 U! I: @) L5 U) U" H  [
& E; p. `* ?7 l# l! j6 t

内容概要:

硬件原理图分析

编程步骤分析

编程实例操作

硬件原理图分析:


6 K. F5 E; L) l  _

24_meitu_24.jpg


6 M8 j4 q5 T4 I/ d' ^% Q9 v+ i

使能GPIO的时钟:


8 L0 O2 }9 s4 ]

25_meitu_25.jpg

! p( @3 Q$ }: G8 S. ^: U

26_meitu_26.jpg

' o( l) i/ ]6 @
2 q) z% ^$ K; z  g) @$ n/ O! U' j

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

偏移地址 : 0x14   

复位值 : 0x0000 0014   

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

编程步骤分析:


  _+ {* g5 d* ~' U2 A' q

  1. 开启GPIOB的时钟3 S% U5 V9 }0 V( B$ h6 T" x9 q
  2. RCC->AHBENR  |=  1<<18;            & ~& |# o& l7 e
  3. 4 |& O. z3 }' h/ z. u" _
  4. 配置PB0 PB1 PB2接口   
    6 _7 I+ Y+ s! n6 T, q2 W
  5. GPIOB->MODER |= (1<<0)|(1<<2)|(1<<4);    //设置PB0, PB1, PB2为通用输出模式
    + J( r% f/ h" c+ K
  6. GPIOB->OTYPER = 0x0;    //设置PB0, PB1, PB2为通用推挽输出
    # N" d; i* I. J" O
  7. GPIOB->OSPEEDR = 0x0;   //设置输出速度为低速
    9 ]# ~: j. S7 J" E- C; s  T

  8. ! k" n$ D/ E1 h8 u! x. }3 S
  9. 控制LED
    # _/ ]) I+ \  b* j% p, B+ t4 T: B
  10. GPIOB->BSRR = (1<<16)|(1<<17)|(1<<18);     //复位PB0, PB1, PB2 既点亮LED
    / T7 W' p% k. ]1 x6 A! k
  11. GPIOB->BSRR = (1<<0)|(1<<1)|(1<<2);    //置位PB0, PB1, PB2 既熄灭LED
复制代码
# a1 z! x' s+ u) m8 S
& V( b1 x' l! D1 P/ z1 r! A
照亮电子世界的那盏灯——LED库函数版
$ ^& m8 |2 A4 N% k0 a
' \2 c6 I- w* G5 q2 _

内容概要:

硬件原理图分析

CubeMX配置

编程实例操作

硬件原理图分析:


( c8 Q" X9 z$ z

27_meitu_27.jpg


1 l) U" j+ E( j7 L; L# \

CubeMX的配置:


. Z% ]2 [' v+ H( D! w/ |

& E- B- j+ n8 j1 O  B, P5 U8 W

28_meitu_28.jpg

) `8 [; c, w0 O) Z- W" S

- _' {5 R: O4 e( P8 N& o

29_meitu_29.jpg


! Y  ?/ W) p- E* e6 |4 J

初始化关键代码分析:

3 Y& V5 f, ?5 g- [

  1. 开启GPIOB的时钟
    ' z! }: v2 G  T5 l: C! X
  2. RCC->AHBENR  |=  1<<18;            
    - S. p  g. H/ n" c4 b

  3. - {% p1 [* r" I( O3 V% q  M$ v# J& k
  4. 配置PB0 PB1 PB2接口   / @" t2 s+ L$ `2 {7 @( f
  5. GPIOB->MODER |= (1<<0)|(1<<2)|(1<<4);    //设置PB0, PB1, PB2为通用输出模式
    * {' c$ @# r) d: Q0 {
  6. GPIOB->OTYPER = 0x0;    //设置PB0, PB1, PB2为通用推挽输出
    : ~1 z% }) y* @* X8 G" v
  7. GPIOB->OSPEEDR = 0x0;   //设置输出速度为低速1 @5 s" o$ @+ o; |  d5 n" }
  8. 6 M4 ^/ f9 @) y2 M' h
  9. 控制LED$ U4 {/ g$ r/ f7 T
  10. GPIOB->BSRR = (1<<16)|(1<<17)|(1<<18);     //复位PB0, PB1, PB2 既点亮LED
    5 [  n( w1 P0 h# }9 O
  11. GPIOB->BSRR = (1<<0)|(1<<1)|(1<<2);    //置位PB0, PB1, PB2 既熄灭LED
复制代码
9 I/ h2 f1 i' J( k

控制LED关键代码分析:

3 _4 A) J2 |. n


  1. ) n4 T! P- o) q9 R& n% S
  2. 复位PB0, PB1, PB2 既点亮LED3 m) m) O& u! T" Y' T7 ~
  3. HAL_GPIO_WritePin(GPIOB,  GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET);
    ; w, X' h! ?. F1 r/ v+ R

  4. 6 S. Q) [+ ?  s5 q9 b% K1 j9 @
  5. 置位PB0, PB1, PB2 既熄灭LED/ n# s0 U! P8 R2 @3 h8 W
  6. HAL_GPIO_WritePin(GPIOB,  GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET);
复制代码
. [1 v" K" {( Q& O
初识人机交互——按键
. k' F; a; k* k/ B+ m) m* _6 a. w/ u, x% c7 p! \8 N8 {

内容概要:

硬件原理图分析

CubeMX配置

编程实例操作

硬件原理图分析:

30_meitu_30.jpg

; M5 j. F  C6 u4 q+ b& {

CubeMX的配置:

31_meitu_31.jpg


8 ?; {. p; j- Z. a  @3 @, B# d

32_meitu_32.jpg


# a$ ^) x4 n* J+ A+ ^; A* |

STM32F0硬件:

33_meitu_33.jpg

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


: a+ b# E8 B7 ]' t0 C) F1 Q: f

  1. . p6 \+ x% ]5 j9 t1 {$ f3 C# L8 b
  2. ​while (1)8 X; P9 b9 \8 L% H  T
  3.   {2 h+ D" G* ^+ N2 P
  4.                 while(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)); //判断按键是否按下
    / Q! U! G  ]6 o
  5.                 HAL_Delay(20);  //延时消抖
    ( r! Y' z$ Q: O% P% a6 r& Y  l) j
  6.                 while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8));  //再次判断按键是否还是按下状态( c. V* M5 @- T3 x/ ^' K
  7.                 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); //使灯翻转(亮灭)
    " K1 Y: l- U; j: p
  8.                 while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8));  //判断按键是否抬起
    # v* \( S; y- ^! U% L+ h
  9.                 HAL_Delay(20);   //延时消抖
    " _5 g2 p7 w+ O1 r% w- P
  10.   }
复制代码
, a- f* [# q2 g+ |5 O

. L% l% }. P( P2 G

$ ^5 n, J  W' I! i( {( J* C0 G5 S
0 n! I5 g* l7 K" r* r
赞 收藏 评论1 发布时间:2020-9-27 11:19

举报

1个回答
陌路夕颜 回答时间:2020-9-27 17:00:52
写的很详细,很清晰

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版