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

【经验分享】STM32 GPIO详解

[复制链接]
STMCU小助手 发布时间:2022-4-18 11:04
01、I/O接口电路
, S7 Z9 b' B  e带FT的是说明可以容忍5V电压的,I/O电路框图; |$ ^6 `$ T1 h8 d

4 `, y7 H$ u" L+ g* G aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlhIMXJ6ZGM1Q1FlbmJxMExp.png 6 m4 [) W1 n4 U. }" r
' I2 e' E  {5 X) y
1.1、普通输入2 P6 I* ^& B/ ^% Q& j$ g3 j9 C
普通输入模式下,上拉和下拉电阻(微弱)的存在,共分3种模式; p6 u9 T& y/ N, T; m6 p

9 J2 T6 A8 D) O3 B7 A- e浮空输入,不使能上拉电阻,不使能下拉电阻: }$ q/ ]# S+ u& F1 O/ o

. G8 R0 d0 l% k, q上拉输入,使能上拉电阻
3 i* W$ @( ^9 {, K
! T; D% {6 s* E  P% k" P下拉输入,使能下拉电阻: G7 n  }- |' f( U8 F  f* W

' R6 K) }( Q' T1 [2 u aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlhIMXJ6ZGM1Q1FlbmJxMExp.png 7 }2 B! J; X' `! s

4 t" ]4 \3 z6 ~+ X( A. q从上面框图得知,输出缓存是被禁止的
7 `5 d+ v6 |" f
; d% |0 u6 J/ }1.2、普通输出
3 x  R) V( Z2 s& e3 A普通输入模式下,上拉和下拉电阻(微弱)的存在。主要是由于P-MOS和N-MOS的存在分为下列两种模式
& [9 m+ x! q. O; n# m1 Y3 ]
' u6 m+ z% ]& [8 e! @0 [" |1.开漏模式:输出寄存器是 0 时,激活 N-MOS, 而输出寄存器是 1 时,端口保持高阻态(P-MOS 不会被使能)
7 M; v: @0 j! G! [4 v4 f6 n
7 \7 U, Y& L, u6 ]. E- H% c2.推挽输出: 输出寄存器是 0 时,激活 N-MOS, 而输出寄存器是 1 时,激活 P-MOS: V+ c6 F9 C; v* x+ Q

, B# ~" P! i! b$ ^0 s aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlhIMXJ6ZGM1Q1FlbmJxMExp.png
$ _: `) T3 F+ V( U, n1 Y2 t
$ x% u. a. r3 \% K从上面的框图得知,
( d/ X' Q3 O+ Q/ k. K
2 |' u& }$ c3 \1、在普通输出模式中,TTL施密特触发器是打开的,所以读输入数据寄存器,可以得到 I/O 的状态。
% D/ q6 s; `' F0 c; U
9 c# \2 R- J& h1 {% N$ v. I+ D2、驱动GPIO输出,我们可以采用输出寄存器也可以使用位段
( y* Q: k5 b* R" w8 n6 i1 F' h
5 g" J# w' ]% Q0 L1.3、模拟输入' {( E6 m  x% e4 G, ?) _3 A# K
模拟输入上拉电阻和下拉电阻是没有用的' y4 w7 ~) w4 @/ h0 p; f8 F/ K

' T% g1 H" _0 Z0 f, n: ]4 ^* {高阻态下模拟输入
! O: \6 Y* _9 E5 u- E( n7 b; k$ L* F0 z) [8 p, H8 \4 b; ~3 e* D2 a

7 z8 e" [: F/ `- L0 S5 R4 O$ G2 N- o. Q4 E
从上面框图得知
2 V4 u; k. F* D) m8 k4 f8 D2 i! _3 r5 P7 u. h# E5 B+ F# o
1.弱上拉和下拉电阻禁止6 _& t6 }- B5 G' p/ a; L2 W

$ I$ {5 I% s7 d+ b, ?2.施密特触发器停用,施密特触发器输出值强制为0
9 ~0 ~, b8 u/ G4 X: c3 H. k
( u* w1 A" S/ }: G+ L1 y3.输出缓存被禁止
/ q3 C2 Y# n: F" A3 K$ r( Q9 }$ u7 w7 }+ g! l# w2 b2 w! J7 P
4.读输入数据期存器, 读到的值为0
# i8 s; d8 l2 |3 r& Z2 z5 `' C  l- S  C
注意:IO配置成模拟输入时,不能容忍5V电压3 h  S7 o, j/ ?" w4 |' R$ Y
  y" C1 F# @  i+ j
1.4、复用输出

. a2 A  ~# Z# ?8 b& k复用输出框图
3 G. I" ?" p* v, |' k* v
8 T( @. S" x/ s, \ aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlhIMXJ6ZGM1Q1FlbmJxMExp.png - A7 q, @* B. S" K8 e
7 _) P0 J  J5 s( Y
从上图框图中可以得到5条信息" K$ `3 _( h# Z( A6 [

1 i) a/ w4 K$ R( S" U1.输出缓存被来自外设的信号驱动(发送数据器使能和数据),也即是位设置/清除寄存器和输出数据寄存器在这里是无用的
0 w* N6 M5 a- Z8 c: [' }
. k; i& K2 I& O/ c$ I- s2.由于P-MOS和N-MOS使能,仍然可以配置成推挽输出和开漏输出
" R  ?% G. o& _, L& V& n2 _; a4 O" Z0 N' J) o2 N6 ^  [1 X
3.上拉电阻和下拉电阻使能,可以进行配置8 h  f7 E: I+ ~# ]% s0 n' Z

, c* x2 G! \. y" e( B4.TTL施密特触发器使能
6 I+ C# [0 w! e" b4 n9 L8 P3 O, z! ^6 T6 t
可以通过读输入数据寄存器, 可以得到 I/O 的状态
$ n7 j" Q4 k& p+ D9 X
9 @) a; {1 B* ^2 |$ G) H, v5 v/ v02、管脚复用和重映射
7 _2 F; V, f3 h4 V7 I7 A: I- D管脚复用和重映射(其实是一回事),STMF10X系列叫重映射,STMF20X系列叫管脚复用,也就是复用功能
7 W4 r  N+ g5 R/ S3 r' I1 M/ k  [1 L, v/ t6 k1 c9 D
2.1、STMF10X系列" C3 M* d$ V, i, L2 {
STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的。& M1 ]2 }7 G* z! N2 z& i
9 J5 F' y7 {  ^- I: D
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy8wUmc4RGRwQWliZlhIMXJ6ZGM1Q1FlbmJxMExp.png 7 X& B& V/ f! o* Z& S# T7 V
) ~5 R8 z- Y' V( |5 O9 D0 N# r1 V
三个红框交汇处.STM32F103VCT6这个CPU的USART1接的是PB6/PB7但是上电初始化后默认功能并非是USART1.所以想要用串口功能.必须用端口重映射。
1 {6 E' X  K  m& y9 ~: g! }" }1 `
STM32的单片机每个功能模块有自己的时钟系统,所以要想要调用STM32单片机的功能模块时必须先配置对应时钟,然后才能去操作相应的功能模块.端口重映射也一样.如图示:
) _6 _* J4 b% q& E% L
) L- h! Y) f3 k: d/ Q# D aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy8wUmc4RGRwQWliZlhIMXJ6ZGM1Q1FlbmJxMExp.png ) `# [5 n: x& w5 f

+ C, ~& G* O, d! e) M重映射步骤为:
9 g7 n4 L6 J6 d) R- m. M- l6 g" g8 W6 u* y$ D" e  {
1.打开重映射时钟和USART重映射后的I/O口引脚时钟,
* b4 M1 d+ C& q
! ]" m2 f# e% c5 u6 [
  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO,ENABLE);
复制代码

' e( j4 \: U) ]) s- [1 N6 v% k2.I/O口重映射开启.4 X, \. r, K9 a

8 ^! d2 j* H8 i5 b* b
  1. GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
复制代码
& ~/ C/ T& p2 A5 V9 o2 }
3.配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置.8 S) i: `- U$ M. g
4 c2 m) [( b1 `. @! D0 a3 K# T+ E) w
  1. GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6;
    - c8 J. P# l! v8 N0 c
  2. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
    2 \- V' w# F1 h7 _: r5 }5 c/ B
  3. GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
    2 a7 O4 w. P) r& h) E. u  A! S
  4. GPIO_Init(GPIOB,&GPIO_InitStructure);7 l2 L1 a" Y5 ]' y1 \: x
  5. * G' y/ K7 h  \' A" S" x
  6. GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7;2 V1 `  u- l$ J
  7. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
    5 Z8 u7 d6 ^* O/ i. Y
  8. GPIO_Init(GPIOB,&GPIO_InitStructure);
复制代码
7 L3 l# d, f4 [# s, ~
2.1、STMF20X系列
: `; z6 ?+ i" q' y7 ]0 c
STMF20X系列(包括之后的40系列)是没有重映射的说法,只有统一的称为复用功能。1 U- H6 G/ l3 Z5 @. @2 B

# }% J+ g% a0 f8 A aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy8wUmc4RGRwQWliZlhIMXJ6ZGM1Q1FlbmJxMExp.png
, G1 D/ C3 u( k' t7 T
; w/ w" ]0 }3 b% {0 O& r0 m从上图看出F10X系列会有专门的普通IO寄存器,会有复用寄存器,使用库函数如下:7 [( U7 |( q8 P4 [# f7 R
7 U0 z; ~, s6 b5 Z2 y2 G1 v2 }
  1. void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalStateNewState)
复制代码

- d9 d; h3 S3 h9 C8 I0 D& r aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy8wUmc4RGRwQWliZlhIMXJ6ZGM1Q1FlbmJxMExp.png 1 q" E+ K8 S& {( x6 s- s

& A& t8 ]- P% k" o从上图F20X系列使用了复用功能寄存器,然不是像F10系列存在专门的复用寄存器,F20X系列GPIO复用的功能更广。
$ Z+ M! j# B" |# e
$ b1 @* ]( v, R- y( T6 w, ^备注:要先配置GPIO为复用功能,再调用复用的库函数. ?+ K. y' K0 X+ C' o
4 Q8 R( F8 y' y$ y3 Z" _6 t
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlhIMXJ6ZGM1Q1FlbmJxMExp.png % u! E% r# e8 u3 L$ {% l1 W

' B6 D! S: o0 a+ `! M03、相关名词解释
( h+ g% O% |# F8 N2 i1 Q' EGPIO模式名字解释& V( j$ a$ d; p' C# U. m/ N1 D6 z2 t

6 O: m: ?5 w. X* W RHVMZT`ONZ`UUNB}M7G{B9I.png 1 L- Q; i- q7 f: o

4 i' p' {7 x9 u) WF20系列:GPIO共有四种功能* M' @! x9 p( Z3 L* S& x
- R! e7 ?: m. u# Y8 K+ W
  1. typedef enum/ W7 K# Q# v# {' _$ s$ P
  2. {
    8 |. Z9 x7 H7 d' D% i. x1 e
  3.   GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode */
    3 }1 ~2 Q! c6 }, b
  4.   GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode */, B1 D' T) c5 x6 }4 e3 d4 v2 o! X
  5.   GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */* N6 F5 g0 ]; ?7 Z# \/ g2 h" |/ ]
  6.   GPIO_Mode_AN   = 0x03  /*!< GPIO Analog Mode */& t( Y3 Y6 @' ]; ~2 y
  7. }GPIOMode_TypeDef;
复制代码
7 O6 b. O# N1 N; F# u
GPIO状态3 `8 _# D! W7 m6 u

- _3 M# v( U6 u- j' {# W' H" l推挽输出

' F& W2 k; J; j1 X" @- e1 r: n4 l7 `. K# C2 c! L
可以输出强高低电平,连接数字器件。7 |, n4 X" c4 r8 m; W
9 v$ d5 B; _6 p6 T' ?
开漏输出* x4 G) P1 h% W- @3 t+ @, i
! x: C* ]" }& H+ C7 s4 A) \. U
只可以输出强低电平,高电平需要外部电阻拉高,输出端相当于三极管的集电极,要得到高电平,需要上拉电阻,适合做电流型的驱动,其吸收电流negligence相对强(一般20ma以内)
4 u, u1 o0 M1 K/ ^  y2 i$ E/ Q2 A6 m7 e* m' Y1 a) v* g
高阻态
) h) R5 x' g+ q% Q
! b4 B9 x" \  r: k7 m: |) N$ R
高阻态是一个数字电路里常见的术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电平也有可能是低电平,随它后面接的东西定的。如果设置为浮空输入,也就是既没有上拉电阻,没有下拉电阻。可以认为是高阻态。
, i8 I( _# V) K* P0 l. r- ~4 }9 K# U$ ]; B& g; G, a( n; F2 l
4 U* j  Q; {- |5 d% e- j
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlhIMXJ6ZGM1Q1FlbmJxMExp.png
赞 收藏 评论0 发布时间:2022-4-18 11:04

举报

0个回答

所属标签

相似技术帖

官网相关资源

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