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

基于STM32 GPIO 经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-8 14:10
一、GPIO功能描述
5 ?9 W2 l8 h2 s每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。
( C. |: ]  c# o# X/ b% E. W" e输入浮空
; {5 t. z7 B% f3 j3 R, J+ v输入上拉
; k- k# g0 ]' ?输入下拉
- P5 h, D; W. }: [% l7 Z# K; D1 Z模拟输入- w8 V; h- _0 s( T! _  Y8 \0 H; S
开漏输出  Y1 y" o2 f6 Q' d
推挽式输出
8 x' x7 R* A' x1 V3 {0 P% A( W推挽式复用功能' G/ y4 N2 R7 X: Y
开漏复用功能

& @8 u( {! S/ d) o' |" B8 D. s
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。" ^) @" f9 N9 t2 ~
* k9 g) \0 ~: ?( k& d, x
图1 I/O端口位的基本结构图片# P/ k% |7 F6 X  V# G% ?
3 {3 ?2 |9 h: B4 @
微信图片_20231108141014.png
' F! C% p+ Z) Z" `& F! f7 j

3 s( J8 s/ y2 f/ `1 b图2 端口位配置表图片
- i; f6 [+ [1 G" c, _, E2 D9 b' ^* K
微信图片_20231108141004.png
/ {! k7 o3 F: R& o- n9 i

' {: q& M, H) U; m. J5 X图3 输出模式位
, G: v( s3 a% b) P8 e" C$ [) o& L% b& \& p4 R' V& J- s9 S
微信图片_20231108140950.png
& G! Q& r' }! w6 C3 e" o9 N# {
+ E! R5 ]$ B, l) e7 x1 B8 Y4 X4 y
二、通用I/O(GPIO)) s* r7 J: l& J1 Q$ l2 J! M, D- Z
复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:
) @7 z; K8 t6 |3 m: s- {PA15:JTDI置于上拉模式5 }$ S) V( X2 x. L% ^9 x9 ~
PA14:JTCK置于下拉模式/ i! p4 k1 S1 E2 L3 `
PA13:JTMS置于上拉模式& X1 j2 ]0 H- I5 X& k
PB4:JNTRST置于上拉模式- m, v, R1 Z0 ~. ^' K+ ]

, k7 Z: G/ ^( {- ~
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。# e6 ~5 ]; c# g# m/ `* A

' x! K0 D7 o, b8 c4 J输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
# c  Y  W/ d! t+ b, c
' V+ R( {* n* m所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。
9 F/ i4 p( v% l8 m" [
* A* d6 L7 z' Y8 J$ n, i' T4 M& h

, W* Q" p1 j* ~2 G+ j, e  V三、单独的位设置或位清除6 J; {: A. h% ], V3 y
当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。3 x5 B/ l/ V7 N; ~# h" p

1 q  x$ Y0 q5 i4 E这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。" X# \& E) c9 k! w/ m/ E8 M) j

5 e; g' G/ h5 Z) S; k. N1 ]

! |! {8 o% @1 l- n0 w. J3 ^四、外部中断/唤醒线
8 P6 j* K9 s2 P0 C* R* j所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
! p- X: v. P/ I0 ^8 Q& m: C5 i, V3 k; _5 Z% }8 @' Y; @
! E0 H% j, }! H- f) p0 f6 g; ]
五、复用功能(AF)
  C6 |! y% w3 _, i0 T- D4 m( j使用默认复用功能前必须对端口位配置寄存器编程。2 P6 M( `2 E& B+ `
对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动
4 Q9 r4 Y- R  ]) G% ^6 e对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
, Q% Y4 x- L% R) w- a; \对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。3 ~/ Y! C$ H4 R* T

( ?9 ]4 F% a' q& q( H3 N" l" w8 A
六、软件重新映射I/O复用功能; N/ K  A- ~. ~+ e: D
为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。
8 J5 T1 L* Q: }8 u" W

: @  w5 `' \9 @- G- g3 ]  [( L七、GPIO 锁定机制
/ u0 h$ D5 g8 ^$ c4 {2 e) P锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。: ]1 F( `  z0 U' y( h7 i0 d- Z

% ~) [. g% m0 ]2 V: f* w# ]. \. d八、输入配置. t" s* Q4 I0 W2 d- d5 J) I
当I/O端口配置为输入时:、
& H/ }6 E5 n" B( `- H: U输出缓冲器被禁止
* Q' R8 R, |0 S8 K' d施密特触发输入被激活
; S0 V1 y- G) m2 Y  k: P根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
4 Q, N: K4 T2 d2 f1 L出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
+ z. X: c5 C! J8 }对输入数据寄存器的读访问可得到I/O状态0 w6 ~5 H1 |" o
% b/ f9 t# F' G/ |& n4 U
下图给出了I/O端口位的输入配置+ ~3 K7 a8 D9 j: F

4 Q! J+ \! ]1 M  ?/ A
微信图片_20231108140946.png " e9 c9 i& s5 X  W6 w

/ ^; C3 k- l4 `+ p) S" `九、输出配置
  S* m# R  J7 S/ L7 i) _当I/O端口被配置为输出时:
- d9 h' x: l' n& n输出缓冲器被激活
# t7 T% v& d9 k1 i8 |& L% Y- N开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。
) b2 v  }- n+ b5 D推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
% v3 V7 c4 U- Y8 P施密特触发输入被激活
) V5 F0 i, q1 c; @  ?+ c" B# `弱上拉和下拉电阻被禁止& B! @5 Z: Q0 l% N/ U( y- n
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器! U; P6 u5 S) q
在开漏模式时,对输入数据寄存器的读访问可得到I/O状态0 K) B. L8 }' r# p: b) p
在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值
& _) w( s  R& {
% r# b, T) i# r8 M
下图给出了I/O端口位的输出配置9 N/ l; d* n0 s% r0 |( W
7 X% B( e4 L2 x  [/ T! Q4 m
微信图片_20231108140922.png
8 X* ?1 L) `3 Q# z2 ]. L; G
0 x8 r0 j2 z) Q十、复用功能配置3 w) I. r: C1 ?
当I/O端口被配置为复用功能时:0 v) }% m" S# B8 z: C4 C3 A' R; g5 _' t
在开漏或推挽式配置中,输出缓冲器被打开、
# u% q6 Y* o2 G; a内置外设的信号驱动输出缓冲器(复用功能输出)& @- G2 T& s9 F3 i8 h6 |
施密特触发输入被激活8 E" B4 @! e7 X$ n1 f# i
弱上拉和下拉电阻被禁止3 o: n3 @( n, y8 K* g
在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
5 R- J8 T: r) v4 [" y" X2 k开漏模式时,读输入数据寄存器时可得到I/O口状态7 K8 Z( S7 i. i6 S! i
在推挽模式时,读输出数据寄存器时可得到最后一次写的值
) f) l# m# S! G- C/ E3 I3 M9 w
. e; f7 \6 T4 F8 D# |; D* E

) ^5 T7 W* H1 L1 }+ M下图给出了复用功能配置图片
: x# o% O* y1 X% M3 A9 C2 A0 Q8 J) V
微信图片_20231108140919.png 0 h) c% s; a6 G1 N# N3 R
4 R+ N+ X2 f, o# @' a$ {6 Q
十一、模拟输入配置. p4 t' q+ P0 ?2 x2 v+ ]( ?
当I/O端口被配置为模拟输入配置时:
" J- L; H! m2 f# w5 T输出缓冲器被禁止;
; f1 z" F+ s+ _# l8 `5 t禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;
7 o( Y1 D! g* j- ^4 ?: s. [弱上拉和下拉电阻被禁止;
! z/ ]6 ~, a3 [; }# E5 K读取输入数据寄存器时数值为’0’。
0 v% d" Q/ g& G! [& X6 s! G下图示出了I/O端口位的高阻抗模拟输入配置:
# ~$ j; {- y: ^* Z0 I4 @2 M0 q' ^) L% a
7 k# h. D  A8 [& T4 R6 O3 A) E
转载自: 嵌入式产品侠+ ?0 B* J6 p0 h; }" \
如有侵权请联系删除& Q% z( n, m% z7 O2 H: r/ P5 S

( {; c1 N) K+ u: o0 X
, V  ~- ?/ n% n% X

# }6 I0 r7 j! ~# l
微信图片_20231108140915.png
赞 收藏 评论0 发布时间:2023-11-8 14:10

举报

0个回答

所属标签

相似技术帖

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