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

基于STM32 GPIO 经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-8 14:10
一、GPIO功能描述( x6 T  |2 Z2 Z
每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。
9 S7 N% F% b6 E9 E0 X0 U输入浮空  p. e, a! x- s2 B: J0 _
输入上拉$ i5 }2 \$ C$ B1 }& v+ ^
输入下拉3 V% n- h# v# n# z& P9 o/ I9 [
模拟输入9 Q3 @6 E5 I1 z* R$ n$ @2 A4 g
开漏输出) ?7 g$ T! _. P  `2 S
推挽式输出: `" x/ k- p* \) m7 v* U7 X
推挽式复用功能
1 N: k& y/ H- a+ @开漏复用功能
! P" a. {2 G$ c* E
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。
( ]5 @# C) b. [/ |8 o
9 q! [4 V  X4 M0 e- S图1 I/O端口位的基本结构图片
) R: v* b) T1 E4 i" T
& Q3 X! I' b4 r1 X0 L+ V( ^5 Q
微信图片_20231108141014.png
' F% E( }9 V8 r. O4 g
; A, I0 C% T8 g1 |  ?
图2 端口位配置表图片
6 m! \5 v' {' T" |* [
! K  e7 u) V" x1 ]( E( P
微信图片_20231108141004.png
7 D* N& ~# v) R0 m% z$ W! o- r
3 T5 ], H# @9 M
图3 输出模式位: Q% p6 r" m7 e& M9 z! G

. _6 `$ g. _1 j- x6 N0 R
微信图片_20231108140950.png
# |- i  u, `# B6 b
3 Z: e" n: h4 w5 x( c9 i2 y
二、通用I/O(GPIO). P" U% I( {  I5 L& y
复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:% O7 o9 B2 m/ V
PA15:JTDI置于上拉模式5 ~' F* R, |1 b" r% w
PA14:JTCK置于下拉模式& t2 y5 P- a5 @, _! A$ U# v
PA13:JTMS置于上拉模式
, s. _, N1 j8 ~/ EPB4:JNTRST置于上拉模式
  c' O$ \* `8 p0 j- J) q! |; c1 S0 Y0 _- O4 p- v
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。
9 i5 p' d. I' |7 G8 T

3 e  ~$ ?. U. }4 p: M输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。' X; r' a! l2 [0 {0 f( [8 e  J

0 q: s& x8 x% m; R- S# j所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。4 d) E0 }. X" Z, ~  t# [0 p! U0 ~  w
) n3 Z0 s1 V& J7 c9 N( E: Y0 l
5 r& A" V) ^( F/ M/ x- C4 D+ ~
三、单独的位设置或位清除. H7 t' o: G% e) G- s$ \4 @
当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。" w  D8 R/ N9 z- e2 `, k! e3 N
6 a9 e% T4 A$ G; W8 X4 i) y
这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。
3 U4 |" }+ W, l9 ?' x) Z% Q
3 M$ Z* X( H" Z! A1 @4 v  Z1 M6 A
! x3 E6 ]' S2 N: D* ~; s3 H: V
四、外部中断/唤醒线3 [+ W0 x! L2 G5 G0 V
所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。  d) e- F: z9 t1 _
; P8 b$ ^1 H7 J; H1 N6 b
8 D4 H7 V# b6 M. ]
五、复用功能(AF)
* v6 c) M/ Q9 o& b) |使用默认复用功能前必须对端口位配置寄存器编程。6 P3 n" ~( f/ q- |5 f' \
对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动
$ e: [( P* c: a对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。# r& }! \9 p8 }
对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。) F/ v% A& H* k
/ T, a  Q$ u* S) J7 S
六、软件重新映射I/O复用功能
5 I' M1 R) K2 K为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。; e) [& n- ]: S; G8 J6 }

) y; t! Z, n( c0 B1 A; r, T七、GPIO 锁定机制. u3 A- ^# p" n& F2 E* w
锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。
" y' r3 C. \+ m. @& g" K8 W# V: W' ]
8 ]! m9 _4 n* ], j1 S  o% W
八、输入配置: t2 O* K3 y' P0 x% w3 E1 U
当I/O端口配置为输入时:、
4 n+ A" w% k$ k, ~! x: K输出缓冲器被禁止3 _, |7 h3 N, t+ B" Y$ C! L
施密特触发输入被激活* W1 s  m" ?* O) n  p3 v; ^
根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接# a7 c# A+ [$ A/ z3 e: u: n8 h( ]
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
& w$ T5 @4 w3 T对输入数据寄存器的读访问可得到I/O状态+ Y5 j3 N$ L$ @! Z
( D; m* D! \) ?# Y( T7 O
下图给出了I/O端口位的输入配置  b& T; C0 w8 d+ Z5 x: l* g( O

: G1 L* S3 U- L! B4 ]: ^/ `3 r) \
微信图片_20231108140946.png 5 x# Z, }: E6 k; [
& Z5 l+ I4 q4 k; C" s
九、输出配置
5 V, V$ x5 Y# }3 w$ k& c当I/O端口被配置为输出时:( B  ~+ \8 ?$ }( y2 T
输出缓冲器被激活  B' S$ J# u. Y) D. {
开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。
4 v& K( }# [8 \" i% {. W# ~4 T推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
8 r* R" |4 u% a/ v3 z1 M施密特触发输入被激活9 ?$ N3 ^) a  G, }' h3 H" d/ Z
弱上拉和下拉电阻被禁止  n% `2 e/ X; \8 r; ]7 D
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器3 Z4 t3 O- o. V1 @9 U! P
在开漏模式时,对输入数据寄存器的读访问可得到I/O状态4 D! o& A, {% r% n
在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值# q: ^$ m  k& o7 v1 F  i7 S
$ i! g; W& b$ s7 H' R
下图给出了I/O端口位的输出配置
. j8 V  `; x2 O" _1 l+ t, ^
6 H- m( w( n& Q! M
微信图片_20231108140922.png
" c1 G- ?# V3 r: K0 G" f4 \1 C0 g$ x5 j. ]. v& O+ G
十、复用功能配置
. j( M$ n. {0 j1 W, H; ]当I/O端口被配置为复用功能时:
; {# |0 \% `* ^7 p+ _* @+ H' e在开漏或推挽式配置中,输出缓冲器被打开、, y5 k6 p4 P' C3 a5 |2 e' K) H  Z
内置外设的信号驱动输出缓冲器(复用功能输出)
: q7 d6 F1 I$ D+ `施密特触发输入被激活2 Q5 y4 x6 f+ K& M" h1 t
弱上拉和下拉电阻被禁止: Z5 B8 W9 l+ _8 W, i6 _4 c2 [
在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
+ M3 Y! ~/ O+ z7 F, U开漏模式时,读输入数据寄存器时可得到I/O口状态6 S5 N& M3 b! L6 `2 Q2 g
在推挽模式时,读输出数据寄存器时可得到最后一次写的值
# f" ~+ u1 B: \" a8 @
+ M% P+ t! F9 I, @2 U
# Z, \! l3 F5 }( v
下图给出了复用功能配置图片# S) }# j0 v1 e9 }5 f* u* y: G' ~+ u
6 q3 a) d* Z" w8 ~
微信图片_20231108140919.png 4 V7 f( Y) J* v6 Z, K* p

9 L/ e7 ?6 k1 E* @$ _十一、模拟输入配置: ^! w# [$ n  r0 n# l: U
当I/O端口被配置为模拟输入配置时:/ t1 x) g2 U( _: y0 P
输出缓冲器被禁止;
' z  @8 A" b; N6 d' L# I禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;& s( O, P% m! k+ _& a6 {# _
弱上拉和下拉电阻被禁止;
8 O3 ]2 |) V+ a+ H读取输入数据寄存器时数值为’0’。
0 ^, \& ~9 K! f: b下图示出了I/O端口位的高阻抗模拟输入配置:
+ J. v0 A3 Q. \. a5 Z8 ^7 d: W' }6 @. K  M4 W2 T3 {+ @

0 y) x+ {- `6 S1 h$ f, W4 t转载自: 嵌入式产品侠0 F5 f1 T' h& J0 J3 }: Q
如有侵权请联系删除! ~+ M! X" u7 |8 c/ @' {/ R0 V

, `/ }9 ?- J- ?/ E7 W3 ?% e6 S

, y) L# u4 P8 `+ L
' L6 e7 A7 U% ~* @2 _. x
微信图片_20231108140915.png
收藏 评论0 发布时间:2023-11-8 14:10

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版