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

【经验分享】STM32F0——GPIO详解

[复制链接]
STMCU小助手 发布时间:2021-11-20 22:00
一. GPIO (General Purpose I/O Port) 统称为通用输入/输出端口。
5 ~+ h/ R8 y9 r$ t一个完整的GPIO组由16个引脚构成,每个GPIO引脚都可以通过软件配置为  k/ f% m9 O: z, z' T
输出 ,输入,复用的外设功能/ A" t; f- h& }1 F; P0 X
并且所有的I/O都可以配置为外部中断的输入端。. B. O/ V' E- L8 O
  `- w8 @6 r* e4 M; o1 K
GPIO——输出状态下,可以配置成带有上拉或下拉的推挽输出或开漏输出。
! N5 q9 @9 d+ ^2 R6 e! P- \' nGPIO——输入状态下,可以配置成浮空,上拉,下拉,或模拟输入。4 b7 N& j. T6 M, I3 I

! m! O9 S; m2 F1 M系统复位后所有的GPIO端口被配置成浮空输入模式,3 L. U4 B6 x( ~+ f8 u
特殊的是由于调试的, ]* C3 V7 y. z
PA13 (SWDAT)引脚置于上拉模式。
# U* v( n* d5 [0 U; R/ MPA14 (SWCLK)引脚置于下拉模式。
1 {: [$ Y! d" J6 ~5 F1 B6 X0 \2 k4 J2 |+ G( Q
二. GPIO的基本结构
( e2 ^3 E  d" J0 l; J- R2 O5 y保护二极管,上下拉电阻* @5 y3 B5 E% r& d
引脚的两个二极管可以防止引脚外部过高或过低的电压输入,
9 J; Z4 I5 f3 {  C当引脚的电压输入高于VDD时,上方的二极管导通。
! y  i! R5 K: ]5 L; `* S当引脚的电压输入低于VSS时,下方的二极管导通。0 u8 X: D6 l' N# c
% }) T1 L$ Q' U  |3 l$ Y. p

( V/ a' o, C/ g. e% U/ `# K1. 输入配置- P8 Q/ ?* {& b) D* r: y" |) V
GPIO端口配置为输入模式时,端口的输出缓冲区禁止,输入端连接的TTL施密特触发器激活,GPIOx_PUPDR寄存器可以配置成上拉、下拉电阻。% w- B( l+ Z9 [) U
9 K. ~; Z6 b3 ~0 a( E- y
TTL施密特触发器:0 b; N1 o! c+ p2 z; [
当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变。6 c! z( \- \+ ^: F: `8 C' s
能将模拟信号波形整形为数字电路能够处理的方波波形。$ Z/ S5 \4 l8 [# c  L! `
在此处的作用就是将模拟信号转化为0,1的数字信号,然后储存在 输入数据寄存器中。
. M- C9 U. k3 ^1 t/ d5 x" V! n& x
" y; k- ~) B9 b' `6 p* s在每个AHB时钟周期,引脚上的数据都会被锁存至输入数据寄存器,CPU通过对输入数据寄存器的访问可以获取I/O口的实际状态。7 j: ], F4 k& s/ ~% m8 C/ s
% u. V" U. d5 [) Z( [

0 J0 x: z$ x* o2 a! ]2.输出配置* B4 f; Z) @1 M2 m9 Y4 V
GPIO端口配置为输出模式时,输出缓冲器开启。! B* u& B/ `2 d& X0 g% D8 h9 p
! a3 X5 f( d3 W
如果GPIO工作在开漏模式,
9 l& p6 t" w; C0 e, j$ I9 {输出数据寄存器上的数字“0“将激活N-MOS,端口输出低电平,4 S3 j: f6 ]0 i. H
输出数据寄存器上的数字“1“则不会激活P-MOS,也就是N-MOS 和 P-MOS 都处于关闭状态,端口处于高阻状态。
' j  U* [$ ~6 G/ T3 D2 N
# t5 `  |4 v+ Y* z如果GPIO工作在推挽模式,输出数据寄存器上的数字“0“将激活N-MOS,端口输出低电平,输出数据寄存器上的数字“1“将激活P-MOS,端口处于高电平。
5 [. v7 H3 y; b5 V; D6 {% q当引脚高低电平切换时,两个 MOS管轮流导通,P负责管电流,N负责拉电流,使其负载能力和开关速度比普通方式有了很大的提高。推挽输出的低电平为0v,高电平为3.3v。& l6 q) w1 J6 y& E% F
# @+ u3 \8 u7 f- v% r; r
同时,在GPIO配置为输出时,施密特触发器输入也会激活,弱上拉,弱下拉电阻是否激活取决于GPIOx_PUPDR寄存器的值。也就是此时对输入数据寄存器的读操作同样可以获取I/O口的真实状况。8 [8 Y7 }5 h2 N7 j
# X  B7 t! a2 r* @; P" r
. {* u7 k+ s% |. G: A
' y" F. g7 |$ G. q! `9 [# m
3. 复用功能配置7 x+ Y) y+ a. E6 S; `5 t) q
绝大多数GPIO端口与外设输入输出共同使用引脚。, f+ X6 C) U0 \3 A0 c) G& H
当端口被配置为复用功能时,来自外设的信号会驱动输出缓冲器,此时输出数据寄存器将无法驱动输出缓冲器,也就是说,端口的状态完全有外设信号来决定。1 i7 _4 x$ [9 L: b8 f6 u
同时,施密特触发器输入也会激活,弱上拉,弱下拉电阻是否激活取决于GPIOx_PUPDR寄存器的值,此时对输入数据寄存器的读操作同样可以获取I/O口的真实状况。
3 x" ^; @: @9 Y( o+ R# _- @% D9 Z3 q/ F" Y9 t; W9 b  m2 _
/ d8 L* J% K9 u9 u! f$ V+ L

) E! c' k9 D. f$ S5 j) n4. 模拟配置! Z3 p- \8 {1 f3 ]  _. G- C/ X
当端口被配置为模拟输入时,例如作为ADC模块的输入时,输出缓冲器关闭,施密特触发器关闭,上下拉电阻被禁止。此时输入的电流电压完全是外部的真实电流电压。
9 I( j  x! ^7 N
' I' I# }! _+ G! _7 m' a) Y4 v* @; n% j
0 _" O0 I3 V. l% v! |三. GPIO的特殊功能, m0 h. Q7 `" n5 W- F1 X5 s
GPIO除了可以配置输入,输出和复用功能外,还具有一些较为特殊的功能,比如可以单独对某一位进行置位/复位操作, 端口锁定操作,或将端口的复用功能重映射到其他引脚上等。6 j6 ^5 e  g& O7 ~' i2 s3 ]3 M( w
, B$ q0 ~# A. Q2 c* n1 h
1. 位操作
3 C9 B3 f! F# H# mGPIO端口通过置位/复位寄存器 GPIOx_BSRR,可以对端口输出数据寄存器的每个位进行置位和复位操作。6 l; O: `6 }3 J/ L9 |
置位/复位寄存器 GPIOx_BSRR是一个32位寄存器,而端口输出数据寄存器GPIOx_ODR是16位的,相对于GPIOx_ODR寄存器中的每一位,GPIOx_BSRR寄存器中有两位与之对应,即 BSx和BRx。$ ~8 R7 Z* I! ]  R
对BSx位写1时会将相应的ODRx位置位,对BRx位写1时会将相应的ODRx位复位,1 r! U3 k0 k/ W! s2 p9 R
对GPIOx_BSRR的任意位写0时,都不影响GPIOx_ODR的值。% n2 Y* K0 R- A$ `
如果对GPIOx_BSRR寄存器的BSx和BRx同时写1,那么置位操作具有优先权。2 j# }! I( m# L& ~; a
5 ]  Q. h1 C1 D* u4 u* Q; e
2.端口锁定
# t2 s" c7 K8 X5 U4 _$ E( h端口配置锁定寄存器(GPIOx_LCKR)用于冻结端口的控制寄存器。3 [/ C( F* b8 l1 {% p$ l* J, C
当一个特定的写/读序列作用于GPIOx_LCKR寄存器时,相应端口的控制寄存器将会冻结,直到复位才有效。
5 W% @7 Y' M4 D
5 A, a( W' I' `- F3. 端口复用功能映射。
. A! t5 `; n9 @: NSTM32F系列微控制器的大部分GPIO端口会与多个外设共用,选择每个端口的有效复用功能可以通过GPIOx_AFR寄存器来实现。通过对GPIOx_AFR寄存器的AFRLx[3:0] 为赋值,可以选择该端口所连接的外设,也可以根据需要将某一外设复用功能映射到其他引脚。- w# Q6 Z) Q& |/ h7 J
. _  x1 G. S! D' ]; R
四,GPIO寄存器分类。1 D% n& C+ f5 G9 Y+ z* P3 P
1. I/O端口控制寄存器
1 p$ J: X7 N" d每个GPIO端口都有4个32为控制寄存器,
  }: N+ s* u) K6 y- A9 HGPIOx_MODER: 选择I/O模式,如输入,输出,复用或模拟等。
, l8 }( |' Z- r$ Q" k6 [9 r! i  {* kGPIOx_OTYPER: 选择输出类型,如推挽,开漏等。
6 S1 Y  s8 X3 @6 q$ V3 s) h' sGPIOx_OSPEEDR: 设定I/O口的速度。
" k( ]3 @% n2 i0 ~( J/ ZGPIOx_PUPDR: 选择I/O口上拉,下拉方式。
6 u2 G8 B, U) L$ p# H% y
% Y# E* e. _! t- B+ J) b) X+ w2. I/O端口数据寄存器+ h1 ~* i& x- N$ W
每个GPIO口有2个16位数据寄存器和一个32位置位/复位寄存器* ~' C# f7 X4 j; u. h( Q1 [
输入数据寄存器 GPIOx_IDR : 存放I/O口锁存的输入数据,只读寄存器。- N9 S; }& ]' q8 v
输出数据寄存器 GPIOx_ODR: 存储输出数据,配置输出I/O, 可读可写。
! K6 b' {- o8 h6 w置位/复位寄存器 GPIOx_BSRR: 用于对端口的某一位进行单独的操作。
  e; U9 ~% {2 q+ v9 U
$ A. \8 }, ~2 U! ^# c7 n4 C3. I/O端口锁定及复用功能寄存器
* Q3 u" m! C4 j. H0 f: N32位端口配置锁存寄存器GPIOx_LCKR: 用于锁定I/O口配置,防止被微控制器在运行过程中更改。; y1 ^4 U% i( E, ]8 n
2个32位复用功能寄存器GPIOx_AFRH, GPIOx_AFRL: 用于端口复用功能配置。
; t5 q* d) A7 _
0 ?# ~) L; |2 f! r
: F3 k5 V+ ?1 n% ^1 o2 z1 N& R" g, _
赞 收藏 评论0 发布时间:2021-11-20 22:00

举报

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