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

STM32入门-GPIO端口的八种工作模式

[复制链接]
攻城狮Melo 发布时间:2022-11-7 23:17
一.GPIO的简介
1 {6 h8 U2 o. a7 @7 SGPIO (general purpose input output)是通用输入输出端口的简称,简单来说就是软件可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
6 C- }. j& C* C. v2 f$ {6 D8 p
# N) M" M" e$ a8 g% l' a1.引脚全是GPIO嘛?/ ^, h, X; A) f6 O  C1 m  E8 M# p) L
答案是否定的,不是所有引脚都是GPIO% c. L' L* w% b! c; l2 i# ]+ J
7 W' N2 @' J+ a8 |; B8 X  K+ j
STM32F103VET6引脚图

) F' [5 `9 s) |. O6 t d81b7e8215264ed3aee631f675411e4b.png 7 N! e1 r' ?* Q3 L# P6 `3 |
STM32 芯片的 GPIO 被分成很多组,每组有 16 个引脚,如型号为 STM32F103VET6 型号的芯片有 GPIOA、GPIOB、GPIOC 至 GPIOE 共 5 组 GPIO,例如GPIOA(PA0~PA15 16个引脚)芯片一共 100 个引脚,其中GPIO 就占了一大部分,所有的 GPIO 引脚都有基本的输入输出功能
! g. z4 T  s7 p+ i7 B- S" T
- N) z6 ]* D9 \. `! C! v这100个引脚中除了GPIO还有特殊功能的引脚,例如复位引脚,电源引脚…% f/ O6 I3 {! P& i
, W# D; d; d5 u9 y" e0 m
eff2ab6335984471984045e5e6f3277f.png
  C; e8 i2 W, w" O* V+ E% |) a9 o' Z5 _4 w: f( z7 O
2.GPIO的输入输出模式; K; F4 g$ `. v) }" ~( L2 N
GPIO可配置8种模式' J4 o: w5 q: g: W& g
输出模式下可控制端口的输出高低电平,可用于驱动LED、控制蜂鸣器、模拟通信协议输出时序(SPI I2C 等)等
$ N& p* G$ L$ w& d输入模式下可读取端口的高低电平或电压,用于读取按键输入,外接模块电平信号输入,ADC电压采集、模拟通信协议接收数据(SPI I2C 等)等
& d2 S; v2 m$ T4 f8 `0 s/ D9 O* J3 N! @: k) V4 z* d" u  D
3.GPIO基本结构( H# {2 [# h& O9 L9 ]

, p. k+ u" P% I. I% j: e; }& | 748064534aea438d9847685c3dc87b36.png
% f/ [% ~- W2 P5 \& w6 W1 \  ?1 s8 F$ o( ^& x
每个GPIO端口对应16个引脚,例GPIOA(PA0~PA15)
. \6 Y( f/ L5 `' p9 \内核cpu就可以通过APB2总线对寄存器读写,完成输出电平和读取电平的功能* H4 @4 ?  M) v: p& V

9 m  e' d  D3 n二.GPIO功能框图
6 @5 a% l" D2 ^, \3 z! q3 I6 {  W9 c$ N' K! `; t6 e+ }. U
753c81fedfd144dbba8026ae29c0552d.png
5 }! p4 _4 ?$ S. i& M- Q+ U: c; q) I8 j
保护二极管) o$ ]# P4 N7 W
芯片的引脚电平0~3.3V,部分引脚可以5V,引脚的两个保护二级管可以防止引脚外部过高或过低的电压输入
4 B. W) d% ~  q/ [$ F1.当引脚电压高于VDD 时,上方的二极管导通8 t/ m8 _& @. m' a1 Q4 o# b1 h- F

6 S/ T. q$ {1 X( M  a" y  u 6e3a132df2e147e0b220b082984d182a.png
" F+ d* d  U8 G# a
9 n( M, e; G# K  C( H) E, g& ~防止过高电压进入芯片内部烧坏芯片
+ a2 b1 m. o4 U8 Q
0 o( g7 I; R0 r( t, f# B- P2.当引脚电压低于 VSS 时,下方的二极管导通
+ H9 |4 a" c- s' {; g) a" c/ P" F; |2 f
f54f0b4267aa4c3480032e818715738d.png
$ Z; X1 I: j2 q$ X3 L5 O  T6 z7 ~7 K& v/ Y" o" j( F5 c0 F! U
防止电压过低,从芯片内部汲取电流
# R6 X) d3 T% D4 M
% p8 {! Q, Z# b, V施密特触发器
5 S- a( n8 D$ Z# h' t$ E
3 Z5 f$ j( |+ o1 x& d 6fee4aab6f0a41f8b9455fe376b226d3.png
' q' @, I4 ]. J% h- b: o  n# O# l2 }* c6 t
具有滤波的作用,就是让通过的电平输出稳定的高低电平
4 \3 \9 ~1 U0 e6 \! [2 C
3 r" U3 Z* \; h8 T4 B& _ 5ac6b76e5d1b4e1e8ad9c0cb14401587.png
# ~; Y8 r! k# Z$ K$ j& g
% n# Y, p& S5 A4 x' q% ~2 D三.GPIO的8种工作模式
2 d: X. F. q, r: ^7 k4 D4 b4 y- A
0 M) J* l$ ^* |5 S* s  V c7402b3435ef48349f3eac9a3def27a4.png   S6 L$ e/ s  u+ ~# b2 `1 y+ W. w
8 H; N" A/ p+ {6 d% H: ^% ^
1.浮空,上拉,下拉输入2 H; g% S7 e* T0 z( R

$ O) e5 k& y7 N& X ae3b81234c404725a5b9d82beca89c42.png
' y4 M; W9 A7 z! G2 K. m& |
* h/ r( }3 W# J& y- I6 @在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器 GPIOx_IDR读取 I/O 状态。, ^, s1 S9 \8 C4 C* L) `
, N% {# y  F* G$ u+ h
由于电阻阻值很大这里的上拉下拉输入都是弱上拉 弱下拉,为了对外部输入产生很大的影响
6 l7 P- G/ T6 k% K" w* d5 y3 y- s. o0 H- ]& _$ e- @  m$ @
上拉输入:给一个默认的高电平也就是说当没有外部输入时默认输入高电平1 O1 r7 i8 d4 e' y

' \4 c+ c( L: Z) Y# J8 }. B% k 11dd61a83e574010b40fc0a2fc23af0b.png ! t  Q, m" ]! t: M
9 D8 I" K9 e4 x% I/ F$ e
下拉输入:给一个默认的低电平也就是说当没有外部输入时默认输入低电平
. @+ L+ J7 H2 k6 X- J6 C$ t+ ?- S& I1 L: Z9 C
d9702a539b5647f7b7180c5391d41755.png
" v8 |1 K5 N* ?% t" z8 v4 {7 P* m% a% Z- \- J$ S/ g
浮空输入:如果输入引脚啥都不接,此时输入电平极易受外界的干扰导致输入电平不确定,完全由外部的输入决定。4 g3 j4 r: }5 U$ k# |8 i+ |; r
) [( n) T" q4 [  u: w2 T% E
a5cf301814014bd0afe2b2e07b168455.png * L! c  K6 N' v9 O
0 U) c7 Q( `; T! s; h
2.模拟输入
  m( e5 g9 z8 L这模式主要为片上外设ADC而配置,从外部读取模拟信号, N, r4 a3 d. I+ x" n

5 g$ O* _+ u  z9 {- D模拟信号:测试信号未经过采样前,均是时间和幅值均是连续的信号称为模拟信号,例如连续变化的电压,电流,温度等等。, C/ }3 ]* G8 @# Y2 l( {1 i& m

" J- K* j7 l( t3 E$ }! T  k数字信号:模拟信号经等间隔“采样”及幅值量化以后,时间和幅值均是不连续的(离散)的信号,例如0 /1' F& E3 p/ \4 M0 Z: s

% B. J% _# v& I4 H 146d2c0e1cb44df5baadd354f73e5c21.png
" P! ?5 @+ h  y: o
. C+ o) x. {6 M, l$ T- b这里不需要经过施密特滤波,人家本来就要连续变化的模拟量, z+ X# P, {3 f- p% b' w- t2 |

' `( w0 W' f: Z, }/ `9 i& A3.推挽和开漏输出
0 ~/ b, D8 l" t& J● 施密特触发输入被激活( U! ^: M5 J$ L# d) N" d
● 弱上拉和下拉电阻被禁止
3 v7 a5 k6 z2 u+ e● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器/ o, |! I5 V7 _2 V5 J
● 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
5 N& W8 y! W8 `4 v7 C' x. o$ \● 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值
) |; H- U/ s+ [1 c
  B. {% k* D) A, _5 H2 \除了模拟输入的这种模式会关闭数字输入功能其他七种模式,都可以通过输入寄存器读取I/O状态,例:在模拟I2C实验中把GPIO的工作模式配置为开漏输出时同时也可以读取引脚电平状态,现在不知道不要紧后面会详细讲解
4 s, M  @/ @$ o0 Q9 g8 `7 E
% Z2 ^* a2 h9 E. u3 d9 h% ?0 X5 i在输出模式中,推挽模式时双 MOS 管以轮流方式工作,输出数据寄存器 GPIOx_ODR可控制 I/O 输出高低电平。开漏模式时,只有 N-MOS 管工作,输出数据寄存器可控制 I/O输出高阻态或低电平。" X  ^6 c7 b: i- F, b0 `- x5 D/ D! w
' M/ C0 H* D+ d$ z8 T$ s3 z" a" M
1.推挽输出
( D, I$ N1 A% g( z( C( `- D
- g3 y) j' w2 R% W. r& A! _- F7 w% u 7281237deaf943fab229c027d1112033.png ' ?' E; ]% F$ E; g

+ q; P# S4 ]" n当输出寄存器输出高电平,则引脚也输出高电平
' n5 F; U$ e% I- u& t  c+ v
- d1 a+ C( R# m1 c7 r c3cfc904953046d6a1cb9e40cc2cfcd9.png $ s8 [1 H0 v# o2 L- v7 R

) c+ j5 \7 Q( f+ `  s8 L当输出寄存器输出低电平,则引脚也输出低电平
8 W- G: e* r  T3 Q: Z1 b
" H$ ]0 f! v' E) X& x- J& o cb457a5ef69b4bc29df367da3666c76c.png 2 M! b3 N5 ^0 J

+ |$ v( k: Z7 W- _0 m+ x9 W$ c2.开漏输出
* r3 I- m. L3 E7 R, Z' C. d
; P* [; s4 V. j% v/ O当输出寄存器输出高电平,则引脚输出高阻态, i# c+ N3 U# m: y: k+ [* ~

+ h. C) k& x3 m3 |$ U1 o/ Y dc28cac2268d4bd496b908b1eb8d214a.png ! U# f7 E4 u/ n+ O
0 ]1 Q! b  w* ^1 U9 i% X
当输出寄存器输出低电平,则引脚输出低电平
! O2 y& Z  Z. t- K, `6 a
. F/ P  }6 D$ e  Y dd53455c20f44edba6388a95ecd0698d.png
5 u8 e( C7 X, s- k% K: g$ N1 S+ D$ n2 V! n
4.复用功能推挽开漏输出
4 a* C' c1 J2 t1 Y! {9 ?0 c7 N复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式, 但是输出信号源于其它外设
# _8 z  y$ e) l4 v* R+ ~7 D  @! a, `输出数据寄存器 GPIOx_ODR 无效;输入可用,通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号1 {! x9 N* {( M- n, N7 \! t
6 d  F; b  B+ M# V  L4 _
这里以串口的发送TX和接收RX引脚为例
( _6 |! |+ Q9 I* H" B9 x- U4 Z
8 J- B2 b: l( i3 v; \  {+ I9 T串口的发送引脚TX1 l+ V, y; _" b9 H; o' q

6 H! C, `( }$ y* O3 j 15b766b943df4f62b9ef589b847265cf.png ' u# [0 [9 v! \' S  y, Z

8 h' v* ~2 T. ?  u6 q( ?串口的接收引脚RX, p' `" C- C, v' l' C1 ^, K6 K

, @4 B% s3 g) B( U& I ecb310f614294be99dd53dde3fb169ca.png
/ r0 ~* n1 \4 Y1 ^) g" d
4 b# x* h+ o4 U8 t2 g# g9 {这里串口外设不知道是什么不要紧,以后会细讲只要指到复用功能的推挽与开漏输出与普通的推挽与开漏输出只是输出的寄存器换成外设的寄存器
6 N# G# b' R; C- R. y. L& }
/ s1 C4 B% d0 b
7 J" a1 W; n6 \6 L' t; A0 e四.GPIO的寄存器
- f8 k8 y) E8 |4 J1 ^4 G通过对 GPIO 寄存器写入不同的参数,就可以改变 GPIO 的工作模式,要了解具体寄存器时一定要查阅《STM32F10X-中文参考手册》中对应外设的寄存器说明。; H' Z$ |& Q& f5 n. c. u
0 ?$ i5 w' ]1 g  l* D2 k
端口配置低寄存器( ]2 n& i4 l* A
0 W$ Q" w+ }  F8 H' X# l
5bc445efc995450883c0c5738165051b.png 3 W0 g) l# i" N( J% B) i
' H; r1 E$ m* y
在 GPIO 外设中,控制端口高低控制寄存器 CRH 和 CRL 可以配置每个 GPIO 的工作模式和工作的速度,每 4 个位控制一个 IO,CRH 控制端口的高八位,CRL 控制端口的低 8 位,具体的看 CRH 和 CRL 的寄存器描述
! y7 Y" d8 n! Q3 n% l/ G- p* l8 v7 G% G  q8 J
端口配置低寄存器7 g) ~7 O( G- J  v6 n9 o

  d4 B' q7 k3 G! s, J5 H ede203295ac14641bd92328b57e40e8f.png * H3 G+ w) n9 z% g5 p: d
' f% Q+ V* S! O, J; m# G, Q, w
端口输出寄存器
/ _: _1 L% f: T) B( r* c5 {' L1 z: Y) v+ Y
2d309f5e6fca486db8a503764b446158.png
: A* R6 R" T. \1 f8 y* Y$ N0 `5 {. a; ?7 ?% X2 t7 [
端口位设置/清除寄存器9 G, D1 I* ^) j
6 o% u/ j/ }, w# T  r4 Z
6df3cafae7d74d339121a2f00aa13d7a.png 7 r" p! P, f/ K4 ^- `

$ U- W6 O1 q4 ^端口位清除寄存器
% N  s( x0 C5 _$ T0 z
1 J+ X4 z( @! J& O3 `" U% R6 V/ v ec428b66947140e3ac7a5e926cb98ab2.png
2 P* l8 p' r, }
! a, X- Q1 \5 K! P. E端口位清除寄存器+ |* d  f3 L4 B6 Y
/ L) J' S+ j3 o8 W8 {
9608a99810f042fc93b5f2d3f99e7836.png 0 `/ y6 P+ X. V
————————————————
2 p0 C% `( B7 H( G2 s/ _5 r版权声明:rivencode) j3 z' }, O, ]! q9 `; T
: w7 L5 F* j+ z+ E
( c+ A. F. Z) C3 }1 `% V
收藏 评论0 发布时间:2022-11-7 23:17

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版