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

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

[复制链接]
STMCU小助手 发布时间:2021-11-20 22:00
一. GPIO (General Purpose I/O Port) 统称为通用输入/输出端口。) ?' v* Q0 a5 y  u. C: k- r# r
一个完整的GPIO组由16个引脚构成,每个GPIO引脚都可以通过软件配置为
0 I/ X- b' r3 b9 ?# r输出 ,输入,复用的外设功能* S9 U* ?& ~7 z7 i
并且所有的I/O都可以配置为外部中断的输入端。
% w7 v! ]1 n1 v0 h( g' r( V6 f* z" K
1 H3 y; Y0 s# j2 n, FGPIO——输出状态下,可以配置成带有上拉或下拉的推挽输出或开漏输出。
! d. N2 q! G! {4 N( Q2 G$ FGPIO——输入状态下,可以配置成浮空,上拉,下拉,或模拟输入。# }2 W4 @9 c+ h7 n$ x! Z4 S; @2 H
+ H! ~+ X6 l/ x" [
系统复位后所有的GPIO端口被配置成浮空输入模式,
7 I1 X$ v  @. ]% z特殊的是由于调试的5 B; A# u2 y! b2 `
PA13 (SWDAT)引脚置于上拉模式。
3 E% k2 p+ T3 a. ZPA14 (SWCLK)引脚置于下拉模式。
! s/ T( n& V! o( ?! P" i+ c7 g8 X. ^$ z* Y
二. GPIO的基本结构
4 \, P; R5 D3 ?$ `" P保护二极管,上下拉电阻
& |. F) `- W2 k; t1 h引脚的两个二极管可以防止引脚外部过高或过低的电压输入,1 G7 n$ Z: T: @/ Y3 @
当引脚的电压输入高于VDD时,上方的二极管导通。( `$ t" A+ b$ f7 \) G; m* v
当引脚的电压输入低于VSS时,下方的二极管导通。
! W- {+ _0 Z* E& o/ g9 P4 h
3 {/ f, k3 h) X
" e. t$ T8 e. K' W) I0 `( o1. 输入配置$ m  I7 e3 y3 ?& l3 r
GPIO端口配置为输入模式时,端口的输出缓冲区禁止,输入端连接的TTL施密特触发器激活,GPIOx_PUPDR寄存器可以配置成上拉、下拉电阻。3 y( N4 H, W8 A! Z: w2 D7 M

6 f' N7 a9 A* oTTL施密特触发器:& `: ?; Q4 L  O, W1 c
当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变。
' `3 p9 n: e7 O1 Z. v6 v6 v能将模拟信号波形整形为数字电路能够处理的方波波形。3 C9 C. {2 {# l
在此处的作用就是将模拟信号转化为0,1的数字信号,然后储存在 输入数据寄存器中。
+ b8 i. R+ u7 F& h/ V
9 n, t" f( G/ q: {8 U在每个AHB时钟周期,引脚上的数据都会被锁存至输入数据寄存器,CPU通过对输入数据寄存器的访问可以获取I/O口的实际状态。
; k0 K; \, i/ {& [) Z* M0 O+ \. k# E! U3 M6 m

4 r+ ?8 J8 j/ N9 C; G2.输出配置
9 R: V  i# |/ gGPIO端口配置为输出模式时,输出缓冲器开启。# y; |4 v7 U4 J( \

- S" T+ U& H* m% i) \6 r如果GPIO工作在开漏模式,, a" K: Z7 m3 i
输出数据寄存器上的数字“0“将激活N-MOS,端口输出低电平,
8 k3 j1 p8 a3 g/ r输出数据寄存器上的数字“1“则不会激活P-MOS,也就是N-MOS 和 P-MOS 都处于关闭状态,端口处于高阻状态。) c8 ?: U' y, o! U6 Y

- F% l4 F; n$ R- |如果GPIO工作在推挽模式,输出数据寄存器上的数字“0“将激活N-MOS,端口输出低电平,输出数据寄存器上的数字“1“将激活P-MOS,端口处于高电平。
* B. `( \. Z7 y( F+ D当引脚高低电平切换时,两个 MOS管轮流导通,P负责管电流,N负责拉电流,使其负载能力和开关速度比普通方式有了很大的提高。推挽输出的低电平为0v,高电平为3.3v。2 ]( r- W0 E. b$ l" C3 h
& E- i$ L( G/ O9 k
同时,在GPIO配置为输出时,施密特触发器输入也会激活,弱上拉,弱下拉电阻是否激活取决于GPIOx_PUPDR寄存器的值。也就是此时对输入数据寄存器的读操作同样可以获取I/O口的真实状况。9 E# n8 }0 K: I5 N# r' @
" L& z. ~$ P3 G- M. }

8 H" N. r1 J( b0 x
3 a3 g$ ~* x2 U5 R3. 复用功能配置, ]. }3 I% I8 E$ K& N' U. ^
绝大多数GPIO端口与外设输入输出共同使用引脚。
' ]" q- I0 V/ A- W( t4 j2 h当端口被配置为复用功能时,来自外设的信号会驱动输出缓冲器,此时输出数据寄存器将无法驱动输出缓冲器,也就是说,端口的状态完全有外设信号来决定。/ ?3 p/ @% l3 P% d9 L; C
同时,施密特触发器输入也会激活,弱上拉,弱下拉电阻是否激活取决于GPIOx_PUPDR寄存器的值,此时对输入数据寄存器的读操作同样可以获取I/O口的真实状况。
. Z3 G! q" p5 a7 h9 C6 Z9 R( g2 _" [* c& o3 A

+ h; {3 s: q' I$ Z4 i8 x( U% @6 }7 u0 S6 p( u
4. 模拟配置: Q* s% M: \: l2 h) n) X
当端口被配置为模拟输入时,例如作为ADC模块的输入时,输出缓冲器关闭,施密特触发器关闭,上下拉电阻被禁止。此时输入的电流电压完全是外部的真实电流电压。. V8 k, K) G: l0 S$ V( d. H
" r4 S  L6 e0 h/ c9 Z7 F! v4 M
- S5 v! Y# B$ P0 |+ q2 p1 G7 }
三. GPIO的特殊功能
3 A0 Z* \9 t  A2 ]4 H) M6 F* s4 cGPIO除了可以配置输入,输出和复用功能外,还具有一些较为特殊的功能,比如可以单独对某一位进行置位/复位操作, 端口锁定操作,或将端口的复用功能重映射到其他引脚上等。, ], u+ D" G$ ~! n

# I" |- D# R( S+ E4 L, \- ]% c1. 位操作
6 a. Y* n: R! J# c3 WGPIO端口通过置位/复位寄存器 GPIOx_BSRR,可以对端口输出数据寄存器的每个位进行置位和复位操作。6 t- x) @- t% j/ a# \
置位/复位寄存器 GPIOx_BSRR是一个32位寄存器,而端口输出数据寄存器GPIOx_ODR是16位的,相对于GPIOx_ODR寄存器中的每一位,GPIOx_BSRR寄存器中有两位与之对应,即 BSx和BRx。
9 g4 z  [1 h* b) ?+ A对BSx位写1时会将相应的ODRx位置位,对BRx位写1时会将相应的ODRx位复位,
- U- _7 P! k* f* g对GPIOx_BSRR的任意位写0时,都不影响GPIOx_ODR的值。
) `+ E# h& U& u$ T) a0 G- ^/ q" B如果对GPIOx_BSRR寄存器的BSx和BRx同时写1,那么置位操作具有优先权。
+ v# O. d6 }$ n; V" i3 Q$ p& }5 m" r. o& X& ~
2.端口锁定
; O- ]& u! e( ]) r4 T端口配置锁定寄存器(GPIOx_LCKR)用于冻结端口的控制寄存器。2 N1 u% F( c) N2 x2 c5 q3 I
当一个特定的写/读序列作用于GPIOx_LCKR寄存器时,相应端口的控制寄存器将会冻结,直到复位才有效。
) i- b9 f6 m5 l: r# c& n, _! r% ?8 t2 D- M# U- _
3. 端口复用功能映射。
0 h* }; g! M9 I: V: gSTM32F系列微控制器的大部分GPIO端口会与多个外设共用,选择每个端口的有效复用功能可以通过GPIOx_AFR寄存器来实现。通过对GPIOx_AFR寄存器的AFRLx[3:0] 为赋值,可以选择该端口所连接的外设,也可以根据需要将某一外设复用功能映射到其他引脚。( M  {9 b% N2 [/ I) N0 t

  d, e, |7 m  y  l2 u3 K四,GPIO寄存器分类。
/ K5 }* U8 ?+ L( g1 {+ Q7 U% [& _1. I/O端口控制寄存器- T, R  S* O0 E( S, U7 v( C
每个GPIO端口都有4个32为控制寄存器,; E/ X+ v1 ]& ^6 `+ P' K# S
GPIOx_MODER: 选择I/O模式,如输入,输出,复用或模拟等。
+ Z4 Z! j5 ]3 e+ rGPIOx_OTYPER: 选择输出类型,如推挽,开漏等。% V, s/ ]' Q; m. }& {+ q! R* q8 W
GPIOx_OSPEEDR: 设定I/O口的速度。1 D  o* F: P( u6 ]6 @, [$ d
GPIOx_PUPDR: 选择I/O口上拉,下拉方式。0 k/ m7 z7 E- y9 `& o
( z6 ?+ [$ Z5 n) Q
2. I/O端口数据寄存器
9 V2 i+ ]( P+ S4 F7 t7 ]每个GPIO口有2个16位数据寄存器和一个32位置位/复位寄存器+ f; Q4 o9 Y3 {3 ]9 Y1 f* F
输入数据寄存器 GPIOx_IDR : 存放I/O口锁存的输入数据,只读寄存器。6 [; [% Z" S1 ]
输出数据寄存器 GPIOx_ODR: 存储输出数据,配置输出I/O, 可读可写。6 S4 v- j( z6 c# }3 b1 x9 L( k
置位/复位寄存器 GPIOx_BSRR: 用于对端口的某一位进行单独的操作。0 `6 f6 y% j0 g1 ]3 y

  G" k: g9 ~3 N3. I/O端口锁定及复用功能寄存器; r$ w3 r. X9 Z* F
32位端口配置锁存寄存器GPIOx_LCKR: 用于锁定I/O口配置,防止被微控制器在运行过程中更改。. t3 u/ F" P) x* X* j- p9 t) V; b
2个32位复用功能寄存器GPIOx_AFRH, GPIOx_AFRL: 用于端口复用功能配置。/ U0 x9 {! W: \4 g% e9 ~3 t4 `

& Z4 O- i# v  Z! q* Z- ~; B4 Z* E
! Y2 ~+ W2 N: ^) S2 z
赞 收藏 评论0 发布时间:2021-11-20 22:00

举报

0个回答

所属标签

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