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

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

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

1_meitu_1.jpg


& A, V# _: A; W0 |: E, M内容概述:
+ [$ G  w) D$ I# ]& G

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

照亮电子世界的那盏灯——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

2_meitu_2.jpg


! _- P. \' J, a- Y4 t7 S8 G3 X. X( e/ O! Q

3_meitu_3.jpg


5 v& b5 H& B# [) `! E' b3 ^! `* ^, p: D: F& c6 |; p

4_meitu_4.jpg


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

5_meitu_5.jpg

( G0 G0 ^& K$ L! e
& |5 M5 D( ?! A" C: J

                                              6_meitu_6.jpg

$ 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

7_meitu_7.jpg


( W( [! k, t7 a- {: _8 H5 R$ {

                                  8_meitu_8.jpg


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

9_meitu_9.jpg

4 U/ P# u5 S/ o  j% C+ E

# X" a, q* r: a5 o  f) R: h

GPIO寄存器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

10_meitu_10.jpg


- Q, }- a6 o- t9 k: |& b- v! }- b" s* Y" Y/ G

* E: J# i9 D/ n8 U5 ?) k2 v

                                                 11_meitu_11.jpg

* V6 W5 \) V, P! D$ r

2 V) Q2 ?7 h+ v8 j

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

偏移地址: 0x08      

复位值: 0x0000 0000

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


" \7 L; H! X% P  |

12_meitu_12.jpg

% o6 s/ U3 k3 ~7 c( t

5 q* k, [+ _: G# x+ F9 v/ F

                                                   13_meitu_13.jpg

* k7 p4 v1 x8 y! {

8 |6 _2 U4 v% ^& x( V- G

GPIO 口上拉 / 下拉寄存器 (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

14_meitu_14.jpg


4 ^0 z' v1 x6 B$ \8 K* z

                                     15_meitu_15.jpg


0 t1 q: D' \. M: @% h; |, _# r
, G3 G# Z2 ?, `5 }1 F7 X

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

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

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

; S: |; u: g. B+ C: N; S

16_meitu_16.jpg

, L) t  @6 u2 O
7 p. E4 j1 t8 V* ?! \- p, R+ b! y

                                       17_meitu_17.jpg

( \: 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

18_meitu_18.jpg

2 i% U0 _( x$ m' O1 t

                                              19_meitu_19.jpg

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

20_meitu_20.jpg

* z$ y' X2 [# i1 w8 Y9 I/ Q  o' B) z

* r% a* u, k, z& ?; K' O/ _+ s

                                        21_meitu_21.jpg


- S# M! |  b6 U$ R

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

22_meitu_22.jpg

0 J+ C+ C! [( O0 {1 y7 X- J5 T# B
5 H  V6 @. J+ u( H: c

                                  23_meitu_23.jpg


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

24_meitu_24.jpg


0 C( @! A& H' z8 y. \6 k: C

使能GPIO的时钟:

; u% \  U( l- Z! x

25_meitu_25.jpg

# A, K# Z% s+ t( u; {9 q7 G4 R; h* c

26_meitu_26.jpg

0 K* u$ `& B& C/ W

+ Q( T0 ]8 ^" k2 e

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

偏移地址 : 0x14   

复位值 : 0x0000 0014   

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

编程步骤分析:

7 T  D3 u0 k0 n$ b4 u8 e! `

  1. 开启GPIOB的时钟. X( z# m) e" B( [; [( w! i- d, i
  2. RCC->AHBENR  |=  1<<18;            
    ; z/ \) ]# {. c' r. M( w

  3. , e+ d$ V+ B8 P  N& a
  4. 配置PB0 PB1 PB2接口   
    ) Q4 ?+ f1 E* @! P2 h' g  o4 {; @
  5. GPIOB->MODER |= (1<<0)|(1<<2)|(1<<4);    //设置PB0, PB1, PB2为通用输出模式
    1 W* \& w# G+ I! ^- T% Y1 T% N
  6. GPIOB->OTYPER = 0x0;    //设置PB0, PB1, PB2为通用推挽输出
    / ^& v6 @* _& C+ A2 H3 @$ P
  7. GPIOB->OSPEEDR = 0x0;   //设置输出速度为低速) _, J2 x  n' V

  8. 6 ?; D% V% Y2 _8 H% F! ^
  9. 控制LED4 S1 t- j9 q. q0 ]7 u0 g
  10. GPIOB->BSRR = (1<<16)|(1<<17)|(1<<18);     //复位PB0, PB1, PB2 既点亮LED  z4 b) @+ T, I9 s, {
  11. 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

27_meitu_27.jpg

9 o/ y4 H2 V; X

CubeMX的配置:


3 _. s) Z4 c' x

  S, k: v8 P3 n3 E

28_meitu_28.jpg

4 o5 d2 ~& U$ q# o* b' b% v; A' \# J
" R! Y* M. u, l4 }0 C  e2 K

29_meitu_29.jpg

8 i0 d3 t* N. U9 U1 s$ @1 V

初始化关键代码分析:


& R) b4 A1 P8 M3 k% I8 M/ ]7 K# i& @+ L

  1. 开启GPIOB的时钟
    # C, f. a6 c1 v
  2. RCC->AHBENR  |=  1<<18;            ( k: d) t0 H+ o, V& M% c5 F1 ~
  3. , z9 ?9 s6 L; Q  K6 m* g/ u
  4. 配置PB0 PB1 PB2接口   
    ) D+ O. T/ B4 V, w9 a+ V3 O3 S5 ]
  5. GPIOB->MODER |= (1<<0)|(1<<2)|(1<<4);    //设置PB0, PB1, PB2为通用输出模式( t% n* T- }) S9 }! ]1 Q+ F
  6. GPIOB->OTYPER = 0x0;    //设置PB0, PB1, PB2为通用推挽输出
    ; T" `" y: d: c. P
  7. GPIOB->OSPEEDR = 0x0;   //设置输出速度为低速. @3 i( h  k/ L. ?* t, s
  8. 9 L  ^- L1 I/ I
  9. 控制LED
    ( x% p: `9 @2 V1 F
  10. GPIOB->BSRR = (1<<16)|(1<<17)|(1<<18);     //复位PB0, PB1, PB2 既点亮LED8 L3 {; y! b( F" w& S7 X
  11. GPIOB->BSRR = (1<<0)|(1<<1)|(1<<2);    //置位PB0, PB1, PB2 既熄灭LED
复制代码

8 }) ?/ f1 f2 Z+ b

控制LED关键代码分析:


+ W& F2 l: g# Z" z


  1. 7 Z, q+ V! O% |0 U  Y2 V  l
  2. 复位PB0, PB1, PB2 既点亮LED
      ^7 \, x8 X& q/ U* s
  3. 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. 4 O/ m1 D, C7 B! j7 J" Y. ?
  5. 置位PB0, PB1, PB2 既熄灭LED$ f* f! N( x; b$ |" {; c: S
  6. 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配置

编程实例操作

硬件原理图分析:

30_meitu_30.jpg


1 N1 K+ [/ R1 s1 v1 n9 F

CubeMX的配置:

31_meitu_31.jpg

) o! Q. c6 D7 I- Q% |! R1 O

32_meitu_32.jpg

1 o/ }" g) i6 x8 V0 D; N

STM32F0硬件:

33_meitu_33.jpg

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

/ d( y  j9 Z2 L- v9 p& i5 c

  1. ' F- l* o# A# |* U% H
  2. ​while (1)& j# }( A) S8 w3 F& R
  3.   {6 M& m; ?* c: I/ Q& y
  4.                 while(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)); //判断按键是否按下
    ' ~% n: W$ W! g4 Y$ E( F
  5.                 HAL_Delay(20);  //延时消抖
    9 x$ R' H. L) x2 l$ P: N
  6.                 while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8));  //再次判断按键是否还是按下状态
    / y. I7 l- a  q+ l& t" p% f, k
  7.                 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); //使灯翻转(亮灭)
    ) u' X- {5 W# H, r
  8.                 while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8));  //判断按键是否抬起
    ) p: K* Q8 u" R; ?
  9.                 HAL_Delay(20);   //延时消抖! E) @) }& y4 |: S
  10.   }
复制代码
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
收藏 评论1 发布时间:2020-9-27 11:19

举报

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