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

基于STM32 GPIO 经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-8 14:10
一、GPIO功能描述
+ _2 |; z  ^  A# r9 x每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。
4 m( B- B9 W1 I* b4 m) ~: n输入浮空. |- v8 r- d7 X. M
输入上拉( v7 V" @) c" j1 p9 V
输入下拉
0 s- A( |0 t) Y# b$ T模拟输入
3 }* ]( G- n, ?& y9 V3 M开漏输出
, v/ I4 M- i$ o+ \! v7 p; e& I1 L8 t1 b推挽式输出
$ _6 I/ J+ E! d$ U/ f2 I9 w6 A推挽式复用功能1 W" n# z$ t. q6 D1 _7 |& H: \# U2 Q
开漏复用功能

8 ?2 q1 `1 B9 N' ~
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。8 U4 u, {* |3 I9 m! I
9 w. Y, X  [4 E: D: g
图1 I/O端口位的基本结构图片
( Y: u# |) Z" c: }5 ]
6 V7 p$ E/ {4 `+ U1 P' x. M
微信图片_20231108141014.png
/ H) E' B' W8 Q# \1 Y
! S" |  f1 V% m* n+ [3 m: ~
图2 端口位配置表图片
2 V* c: ~) Z3 Y; @9 f7 ~; l% f2 X$ e- c- ~! ~
微信图片_20231108141004.png
' G5 D8 t0 ^# E+ i/ Z

; Z3 b% y; t$ ?6 `图3 输出模式位( y  ~: ~; L& y! \* n; P

% U7 J( G# [: B5 ^9 {1 n: I" n  ^, ]4 r9 ]
微信图片_20231108140950.png 0 `/ v/ }( o; w) J. i- x' ~

7 V; i" \3 P9 ?2 X( O5 ?# ~$ ^! X二、通用I/O(GPIO)  V9 u) G; R  z9 Q9 G
复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:/ Y! o* n3 c; ?3 F  Z+ S2 i
PA15:JTDI置于上拉模式
/ g8 z; {' G" {+ ~% f( J7 gPA14:JTCK置于下拉模式
& {: z" G9 |$ n" g8 \5 q/ lPA13:JTMS置于上拉模式0 i" v- Y3 V/ w8 m: A3 W
PB4:JNTRST置于上拉模式3 f9 Q6 G' V! n' }4 x6 S
7 v4 y6 E, p6 K2 ^; f6 Y
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。& H# |5 l/ F) a5 u

- p1 Z  h: f8 |& s% A输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
% e" N/ [/ Z; a' C# K0 I+ q, j0 Z4 n* {
所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。
" J7 ^5 P: _/ d5 W$ m8 W! r$ y% J  E% u2 ^: }0 O3 }
& l5 `, @; ~- s
三、单独的位设置或位清除
$ X$ R% C1 O& _) O  }# C7 C* I6 V当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。, P6 @: L* e1 o* e, K4 M4 H

# `- ?( S; T( W5 Y这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。5 u: I1 l" O, q

2 w! z# i9 v, Q# R5 Z1 {0 \) Y. n0 J7 P

0 M: t2 h$ M2 Z3 s四、外部中断/唤醒线
% e2 S! f  \, @所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。- G6 ~) ?& W% I( Q) V7 G% Y0 O9 V
9 [$ ]) A2 B7 B3 e: X% }6 Y

; x2 C2 `* h1 s, b. S' \, _五、复用功能(AF)
1 X. X( U. p7 V+ f使用默认复用功能前必须对端口位配置寄存器编程。/ }  h: e& L: R( [' g6 F, ]& a
对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动* e" @" q4 i7 t
对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
* B) D! I0 q" z1 {2 K2 K4 u对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。
, P8 I8 }- E" `2 B( E1 X* B. {6 f+ }4 N$ Q3 ~' `/ Y* M  N& U, M
六、软件重新映射I/O复用功能5 J, G7 t: c( ]; p0 S
为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。3 s+ ~, \  v5 `8 Q, `
3 p9 B. p% s" ]: l5 H  H
七、GPIO 锁定机制
. I. Y( c8 Z" U, S1 O5 t锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。
' d. Q+ N! {$ x& F

6 y" d9 q9 V) y5 ^- s3 K# H八、输入配置
2 ~/ M( y( ?( a4 h当I/O端口配置为输入时:、/ Z0 A: A7 M$ i9 i$ ]. k
输出缓冲器被禁止! ?2 n% e4 R% e- |' m
施密特触发输入被激活
" B4 x5 j6 {/ C: d根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
) Z0 q* N+ ^: P出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器( D5 ?! h- {- u+ P, s
对输入数据寄存器的读访问可得到I/O状态
& n( J8 X5 L9 W2 N- h, N4 q, J! r3 ~; B& ]
下图给出了I/O端口位的输入配置
) n" `7 i# N  Z& w1 Q
7 e% Y: W# ~) X. i* r( q9 c- _
微信图片_20231108140946.png , g# c7 u/ l  P- \4 o( j
4 d9 Z4 D+ ]# S, \/ e$ N
九、输出配置
% ?; [$ k; B6 h# O9 C& u当I/O端口被配置为输出时:
* b1 I) C% v7 K* x: d, W" O输出缓冲器被激活* G$ x) J# e( |* K( R" a
开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。
% H8 b& P% B0 c9 T' T+ ?推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。. [. i: F4 g* c, d" T. m
施密特触发输入被激活7 D3 n' n1 r# H5 x% B" J
弱上拉和下拉电阻被禁止
  q2 s4 e) O+ ~6 F  i出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器' j3 L% J( e6 ?# K* E: O
在开漏模式时,对输入数据寄存器的读访问可得到I/O状态3 f) c1 L8 @' Z6 s5 \, w+ d
在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值' o3 j) H0 q5 l9 |. {$ J0 A
* l5 S$ p, C) o& E" X
下图给出了I/O端口位的输出配置
0 N; ~6 ~$ O3 z8 t6 x" i, c* }( E( Q/ U+ B8 k! ]5 P5 w
微信图片_20231108140922.png 7 [3 M* E- l0 W4 Y

) k1 V! h' M1 q* ^, ~7 P  P/ T7 x/ X十、复用功能配置
! l1 p* X# f+ |! S3 E- f# j当I/O端口被配置为复用功能时:4 U( Z% \' z7 H' X5 Q
在开漏或推挽式配置中,输出缓冲器被打开、7 I7 V! I. V4 K" v8 Z. [
内置外设的信号驱动输出缓冲器(复用功能输出)
7 Z& u- O6 I  }: M2 j施密特触发输入被激活
+ t# L- ~: F- b. ~% l* J弱上拉和下拉电阻被禁止
$ k" W# c2 m" x在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
6 p3 ?( X" ]1 D) \开漏模式时,读输入数据寄存器时可得到I/O口状态3 K& S- a- W! U8 T" V8 g! I
在推挽模式时,读输出数据寄存器时可得到最后一次写的值6 C7 I4 R: d" U; D2 N
3 F1 M! @0 h% o0 a

0 f4 g* q. K! Y( F( s下图给出了复用功能配置图片6 u1 |: `# {2 k
9 I- _7 y% J, x/ I) L
微信图片_20231108140919.png 5 a* _; \- F* y
+ E+ ^5 f. u- b' q
十一、模拟输入配置
7 \; C1 a6 R9 D) h' m; V9 [当I/O端口被配置为模拟输入配置时:% `  j. r9 Z; O9 j# M/ z3 n7 t$ }
输出缓冲器被禁止;
9 p8 e* ]0 j0 A% Z' g9 i, V禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;
* D$ k& Q, ~+ B& X) N2 V弱上拉和下拉电阻被禁止;/ d9 ^6 V  Z8 A# O! [6 ^
读取输入数据寄存器时数值为’0’。
3 w% b( i' a8 C  ]  l下图示出了I/O端口位的高阻抗模拟输入配置:7 R2 u' y1 G0 _
. p; N$ o/ n* _# x

3 W% q5 [1 [5 H3 z4 z' i# ]转载自: 嵌入式产品侠
/ @# q+ [8 {9 O8 u0 V% d如有侵权请联系删除, N0 ~% U1 J* o: D2 r1 x  @0 L

1 e" i, t6 I" h5 g$ S, I2 ~* B

# V/ B" O/ c8 U" y) }/ q* u2 i2 d. t) k" R* G# R, p
微信图片_20231108140915.png
赞 收藏 评论0 发布时间:2023-11-8 14:10

举报

0个回答

所属标签

相似技术帖

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