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

基于STM32 GPIO 经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-8 14:10
一、GPIO功能描述
9 }! H% D2 L# Z- ^& P! j" J每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。% M( k3 C% \2 g
输入浮空
) y; V5 ^$ [$ q, ?输入上拉! [* Q% G% x" k6 p- _0 Z
输入下拉
2 D7 R  J6 N" q: m7 j# }$ l) \模拟输入# l) ?& Q! q5 a" B" y3 s* w% d# A
开漏输出
9 E$ s4 _7 P* w推挽式输出6 X# n4 p' S) n" |  H' |) r
推挽式复用功能% V0 y5 ?( ?& K+ M
开漏复用功能
! ^% e: M# E% l( _' W& O/ o% T! [/ s
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。& c/ I, Y9 ]) |/ I
) \" Q+ J1 y5 o, u  L
图1 I/O端口位的基本结构图片
! R1 K; B, j* n% N5 C: M' d
; |( B9 j" w  s4 ]( a9 ~
微信图片_20231108141014.png
5 i0 R% _0 P4 T1 r' l

1 h& u) ~6 s3 i# Q2 `9 W图2 端口位配置表图片
+ K' W8 f0 v$ P) g) H, F0 d* I6 T
9 Q  m/ }$ P( _1 q$ P" H1 F& l
微信图片_20231108141004.png
; ^+ n* I* r% s" j; @" y: \8 y

+ a: W# Y6 ~" X( k! \  ^4 r图3 输出模式位
1 I  o* Y4 b, Z3 |+ f" a2 C2 h* L) Q7 D5 W  ]: a" T
微信图片_20231108140950.png 9 b! N: ]4 z. |& d
1 k8 w/ T; d# E8 u+ I) [& b
二、通用I/O(GPIO)
7 g; t4 I3 n2 ^0 w# J复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:: X, [; O+ t# t5 D
PA15:JTDI置于上拉模式
' j2 G: u- d: ~4 z9 B6 Q& ~% pPA14:JTCK置于下拉模式
! H) i' S5 w$ v* P9 p/ I/ c! vPA13:JTMS置于上拉模式2 Z! P  P- U$ F$ A. Y3 d- f
PB4:JNTRST置于上拉模式  F  h" A4 N6 t" t
: ^0 ^5 G$ [. T. y3 H* q" V4 n
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。; X: J5 D! E) e/ R  j! F1 t
0 \, u' n! }* T1 b$ q$ [
输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。! Z" u! z5 T* F8 T7 H: V/ L) G

. G- F. H5 J: U; E; T所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。+ ^5 l7 J# m0 z: P
6 |- |% ?( S/ y7 l& J0 ~
- B3 ]" b& Y* D) K4 q9 {
三、单独的位设置或位清除5 c+ ~& Y0 w( O' y) d
当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。
) x6 K1 |- w  x5 I* e; [+ ?1 }0 U+ h) l5 [& l5 Z
这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。: }7 M7 a* T: c, b* y, ?& }; b4 g

! W5 i1 r0 X4 K

9 P  I- b+ p6 \& F四、外部中断/唤醒线
9 s4 N1 O) y6 w- L+ u# J所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
# G# c# c6 e0 c
' T; ]' o  x4 `

7 E! O9 k. _1 [4 i: b" [$ }五、复用功能(AF)
6 g4 {$ x" [; w7 U使用默认复用功能前必须对端口位配置寄存器编程。
8 S) z  p" @8 Y8 c对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动
: i9 n0 f7 x% M) ]1 s对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
8 _/ \, V  L# T' @对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。# x% {( h0 v* A7 n5 J

9 ?8 o) _) e0 j  W' M. S4 Z
六、软件重新映射I/O复用功能
+ ~; b. p9 w+ w5 C1 V+ i为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。5 W7 l$ L- ~' q3 I5 H# T

7 a5 ]0 X+ f% k: b3 l七、GPIO 锁定机制% e- V# r. T3 E% K6 r  B
锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。+ m" N6 h$ R  s7 c

- V2 L- Y* f3 P八、输入配置
6 h" A$ V0 ]6 ?9 K当I/O端口配置为输入时:、( Q  ^' D6 e+ V2 _7 H9 X
输出缓冲器被禁止
+ F+ t4 v6 C. u* T施密特触发输入被激活
9 z7 U- K0 O/ c6 N: _根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接: ~, `0 A1 ~* S: a
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
! o  M/ B+ }$ B; d% s6 j: a: J3 {5 i% [对输入数据寄存器的读访问可得到I/O状态
& F: s6 p: r" J2 u. N
( w; o5 f: I% y! ^+ o/ x
下图给出了I/O端口位的输入配置. O% j1 J. t8 P. `" |5 V

8 y+ i8 ~$ v: e$ p: ?
微信图片_20231108140946.png
- b& K* S+ _. _1 t7 S; W* `/ v- a! I
九、输出配置- ^  P: }1 A! j. `; }" l- m
当I/O端口被配置为输出时:
" c% J- F- Y" B. k; Q输出缓冲器被激活
0 ^/ x3 }" K6 X" {( B' G( v7 }开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。0 K' ^! g8 J. s7 B
推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。! j. T, v& n6 Q
施密特触发输入被激活# `5 V/ ~" q* I- {. ~
弱上拉和下拉电阻被禁止2 r5 }  I7 Y  W  |# d# f
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
7 {9 t$ e0 ]4 C4 [/ W" ?在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
+ M/ G5 x8 b7 U$ `$ r7 z在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值0 W/ h9 w) f" {3 `1 O1 X4 l
7 _* G; D" G/ T; x3 \1 A( i5 F
下图给出了I/O端口位的输出配置
% k4 S) }6 |; `+ ]* N: E' ]. @/ K7 z5 Y% K5 w2 Y2 G
微信图片_20231108140922.png : `, q6 {6 ?8 N

4 ^; D7 l( r; O' Z' p+ M十、复用功能配置
. |3 t7 w2 j/ _' _$ H, w+ N当I/O端口被配置为复用功能时:
; N3 I9 [2 k" @3 s在开漏或推挽式配置中,输出缓冲器被打开、
, W& `4 p9 A! g, Y' r1 Q4 y7 ]内置外设的信号驱动输出缓冲器(复用功能输出). n. P! ]: M% F# d9 O: a
施密特触发输入被激活9 U% f% O4 j( L- Q( e. f, d
弱上拉和下拉电阻被禁止; Z9 @1 x4 d5 [( n
在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器! k! b' K1 J: q4 v: G$ k6 h
开漏模式时,读输入数据寄存器时可得到I/O口状态# D4 U  {* A& _1 G* ]
在推挽模式时,读输出数据寄存器时可得到最后一次写的值0 ?* @' R" t6 O: z/ r% [: h; Z
: u; o* Q" T! c! ^! x7 e

! d3 C: z- |: _9 O下图给出了复用功能配置图片
% Z# f7 M4 i/ H; J5 R1 h- O- |  u6 a3 u" r( Z% l6 ?/ j( R
微信图片_20231108140919.png % K% j+ l8 s; d- R9 n: }

* {- ]! j$ l8 @; ]8 Q( n十一、模拟输入配置
2 l2 b7 K& H) L; W: e6 \当I/O端口被配置为模拟输入配置时:
; f- `$ W4 I$ ^1 x4 w% |输出缓冲器被禁止;
  m0 `2 ^$ S8 H; b禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;+ D/ U; b$ N$ Q/ M( L
弱上拉和下拉电阻被禁止;# e+ M4 v2 b1 [2 a- ]6 ^9 O* q
读取输入数据寄存器时数值为’0’。
0 K$ w( e1 Y# T  M+ d4 O下图示出了I/O端口位的高阻抗模拟输入配置:: Y4 s( v* B5 D" i% |

( S& W3 Q' O/ F$ ~0 n
  ~# ^3 D2 c" N% f
转载自: 嵌入式产品侠
! b3 H! a7 b3 Z# m$ h如有侵权请联系删除
% V( [$ {5 [# N# ?# B; V* `% Z* F5 G1 L4 K  h/ e; _5 |2 x

( J2 M2 S; M5 d8 t( u, b' a% h/ r' j  l* [& `6 }$ j  U2 y$ c8 h8 x
微信图片_20231108140915.png
收藏 评论0 发布时间:2023-11-8 14:10

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版