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

基于STM32 GPIO 经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-8 14:10
一、GPIO功能描述
/ z4 b, @( N0 J# D每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。
! R, V7 H5 b/ w+ C! E* q7 c+ o输入浮空
8 d' [8 E/ u, X: U: j& X+ F输入上拉
/ A9 B) P; D2 v% j# F6 u+ q" Y输入下拉" k5 q( n8 W- R$ @1 k0 S" y" `2 g
模拟输入7 E2 q# p5 A& \* D
开漏输出4 C- ?8 P9 x+ v# ]2 P2 T' B
推挽式输出6 x- M9 o; T- c( e; @. y- b0 {' G
推挽式复用功能) D3 U  x6 F) x2 y) L1 r8 B8 o
开漏复用功能

9 ?5 [+ g: ^) A7 j# o0 j0 U
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。& O8 F9 Z  k2 J9 j4 Z. `$ T
: K! p; K7 V0 i0 x- |
图1 I/O端口位的基本结构图片
6 q2 B/ g% w# _# L! N* F- w: B% \( Z( W0 j5 ?& ~% Z
微信图片_20231108141014.png 0 C+ e0 N5 s: h9 D8 z" H: ?( n
3 j9 s/ i  w. K: q% L+ w" R
图2 端口位配置表图片5 i. ~; C; \. j  \6 r- V

3 j; ^7 z' ~5 i, ?# O0 g' q/ W
微信图片_20231108141004.png + U6 W+ ~: [  c1 f
) t% ~, y% L7 o0 T7 J+ d
图3 输出模式位
5 Q  X/ a# C1 a( v- G4 H+ b2 _
- z+ [9 S: M; i' P6 q, a
微信图片_20231108140950.png : w. p1 p- f" I
- j+ K. Y) }" ~2 S7 ?
二、通用I/O(GPIO)
  R$ F3 l/ |, U3 l5 [3 z# A2 M: j复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:0 ]- ^2 Z! _, J2 p
PA15:JTDI置于上拉模式) U8 D" `, }; N* v: Y
PA14:JTCK置于下拉模式
6 G1 U) e, n& O$ o! v& [$ sPA13:JTMS置于上拉模式, F5 x) p+ T3 D* m# U
PB4:JNTRST置于上拉模式0 O/ o4 l' ~: p% O  ^

) l  H( C- r. _4 B
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。8 z6 @  B, u$ W, U# a! d
7 l5 Q9 H! x2 Z% Y
输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。6 {- u6 C  B* ]( g& a5 ]
( ~; i8 x& [8 M( }0 E$ D$ @" s
所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。
7 Q) L) N& B" Z9 N5 p$ Q
6 ^; s- P5 y/ A1 S
# g4 y( P- x* l/ [+ F6 B1 e6 k
三、单独的位设置或位清除
" Z! n. [3 I4 p7 q, A当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。  k( Z' W' X9 O

1 q1 U4 n. g$ d6 e这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。
0 \# l! K$ o9 s6 }
3 t" b+ a) W; x6 h& V  J; ?
% U  o; Q; i7 m. a
四、外部中断/唤醒线
* \" r/ M0 T- T# _8 B5 v4 I所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。' |8 H8 m9 H. V" L7 p
% V, R8 l$ C# p6 U# n; R" i
! }4 I# _% \  e
五、复用功能(AF)7 X! {# F1 C4 _/ R
使用默认复用功能前必须对端口位配置寄存器编程。
( B: {& |# a$ i对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动9 F4 M0 x, ]6 n# F* \6 f% x% N
对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
$ \, f7 P: A7 p' u" W" r9 w' x对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。
3 K+ t. l, A; ]- C
2 R% a# R$ `( o$ E9 d
六、软件重新映射I/O复用功能
2 ?4 i8 s, Z6 O5 S为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。
& N( `( X4 L7 D) W' O' {

+ O7 i+ l- n9 Z/ C$ i+ g  p2 o七、GPIO 锁定机制
6 l# {; \  l; t- ^9 ]% ~+ A! e+ a锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。$ m3 Z! m+ K: ?

5 M" Y/ ]3 t9 {. }3 \3 f" b8 Q八、输入配置& t5 c4 V, L  l7 Y, R
当I/O端口配置为输入时:、
9 [+ }: N- B$ f$ P' s& g5 [8 u9 h输出缓冲器被禁止
0 Y3 L7 i1 I2 N6 M& I施密特触发输入被激活* Q: ]1 ~7 K% y+ u
根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接$ m0 @1 H, Z6 U, B" d) o
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器6 o  n, E, v# X$ z. m( v1 Y! m
对输入数据寄存器的读访问可得到I/O状态0 O3 E2 k  R. E! G# ]# ^* W8 |
6 k7 Q$ q5 @* z7 R: ?
下图给出了I/O端口位的输入配置
6 c: P. P& _/ i6 n9 I) f8 ~2 R3 O5 [& E, D  P  e
微信图片_20231108140946.png
& u" G; j9 z+ B. ?, t" P5 ?7 p6 h: A9 ^& h0 W6 ?5 X
九、输出配置' o% P6 m9 D7 ~' s
当I/O端口被配置为输出时:
8 j/ _5 p) c# Z$ d4 M% u$ B输出缓冲器被激活: ^7 I6 S7 g4 h- J% G; p8 d
开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。& A2 J- ^1 A* Z6 y
推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
( F: l( B! A9 Z" L" @! f. R施密特触发输入被激活( Y+ P1 |2 a- Y% v9 K
弱上拉和下拉电阻被禁止
$ B4 ]4 `& e6 Y9 U出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
+ ?; t% T& {* O- |- D在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
+ h$ P  M* i4 d; o+ b; Q; S2 I# W在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值7 u" J* C7 E/ r/ a

* x- e- p1 e) w3 P1 x
下图给出了I/O端口位的输出配置
% c3 C- u% D. P4 e
5 x+ q. k7 L% n; W8 R0 o6 U  C* {1 H
微信图片_20231108140922.png 6 v$ h+ E1 ~+ d5 f1 c1 Q. @
+ M  v0 B% y* k# a+ a5 f  j& l3 [
十、复用功能配置7 s4 T% q, X1 n: i
当I/O端口被配置为复用功能时:3 L& G9 x/ H0 Q4 U$ _) m
在开漏或推挽式配置中,输出缓冲器被打开、
: y0 P# G6 T3 X1 Q2 c, t内置外设的信号驱动输出缓冲器(复用功能输出)
4 }2 K/ n, L4 I7 F% e施密特触发输入被激活/ K1 U& u9 P3 K. ~# @0 i9 Y4 P
弱上拉和下拉电阻被禁止
9 Y3 ], c8 R( U在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器/ f3 c: Q5 |9 p9 p' T
开漏模式时,读输入数据寄存器时可得到I/O口状态
5 z& e' y4 v/ B1 [. \* ~: ]在推挽模式时,读输出数据寄存器时可得到最后一次写的值
, _: U2 `5 X9 ^( ^7 z+ j, M1 k7 _2 [/ G6 Y+ Y( B/ S

. E2 m$ D) c6 l$ x下图给出了复用功能配置图片
; I4 V8 B8 j' _: c. i$ Q- S9 r! @( u% U
微信图片_20231108140919.png # h8 P* p0 `* O5 k: |0 ~
( v+ {7 U& H# ?5 Z4 L# p
十一、模拟输入配置4 P" q8 K5 D! W7 ~2 }
当I/O端口被配置为模拟输入配置时:- o: _, e+ m7 T; B$ O
输出缓冲器被禁止;
3 b9 r6 x' Y) _' `+ [6 j' }$ ]禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;& f, \$ a' X5 ?7 _" u$ j
弱上拉和下拉电阻被禁止;5 x6 q3 ~8 ?$ l, l! Q
读取输入数据寄存器时数值为’0’。, H- G! \" a' C* i% H' d* Z
下图示出了I/O端口位的高阻抗模拟输入配置:
' \* F/ R& P/ y7 S: p$ ?- P' F2 I; X4 I

! c) a! I; C. w% i, y+ h: P* j4 V转载自: 嵌入式产品侠
6 J4 a8 T& r* R如有侵权请联系删除
- p2 P* T- D* U: n4 E9 q3 B0 a) A/ {- P! o3 F$ F3 M7 C

( s2 b1 j, z3 J2 D! y3 c7 V9 u) {  m3 N
微信图片_20231108140915.png
收藏 评论0 发布时间:2023-11-8 14:10

举报

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