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

基于STM32 GPIO 经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-8 14:10
一、GPIO功能描述$ A' ?# {2 B7 u8 E6 z- n; q
每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。5 M6 a# a# K* A+ ]: i
输入浮空
& q. L) e- [; \' e+ D% s输入上拉
& n% W: S9 ]* o输入下拉7 U6 n" c  R* U( _5 G7 J
模拟输入* \8 w7 I: G1 W
开漏输出
& k! g1 j0 N* \0 g! J推挽式输出
  }% z; T0 m8 @+ ]% O8 f$ `& i推挽式复用功能
9 X7 H  h; v/ s/ w' I" a/ p开漏复用功能
( p; w( r( y8 i9 j( D1 L% c" O
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。2 g0 q7 P9 `1 W6 B8 z1 {6 p

) A: r3 l# S. M! W8 r图1 I/O端口位的基本结构图片- L8 r$ X+ ~( S2 _& C& Q0 H
2 _  x+ Z) E( M* W& O: B0 C
微信图片_20231108141014.png 9 _8 N. U# a) t: w; n9 g6 A" Z
3 b0 o4 l) a' f0 ]3 }& _  g
图2 端口位配置表图片
; ~0 f2 E  b0 }7 J
1 p$ j- V  b7 I/ W; J* f9 {
微信图片_20231108141004.png + r+ ]# J; L- K! r4 H
8 \, Q0 ]. }$ K" N
图3 输出模式位
& T" t! N% M9 R1 n4 }
, ^7 U7 [7 D8 o" R7 t* Y! {1 j
微信图片_20231108140950.png / h' X+ P- s/ n% e0 x
5 k. f2 }, r( m2 O# |% l
二、通用I/O(GPIO)" J8 W7 }3 B3 A% S- A) R
复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:' {, S$ L$ B) |, Q, O! X& ?& e* r
PA15:JTDI置于上拉模式
8 c' p0 d  h- p6 P# t* J" NPA14:JTCK置于下拉模式
* {2 n% U, a' `! G: T* aPA13:JTMS置于上拉模式
' J, u7 ]1 E9 U$ VPB4:JNTRST置于上拉模式
5 j+ b5 {2 Q3 D( z2 h
# S; o  m3 e; u  H; t
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。
: r% b9 ^8 E6 f- g" Z9 e

' H& w" A. r5 Y: V) ?  f& T( F输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
3 |0 E2 s5 F; i9 H) K
/ Z! B% O4 c4 S' o所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。
7 H' W; O1 a' a$ w+ b1 J: I' j
1 a  y; s  [9 X) g% E

% H' O) @# D7 a4 X. l+ S三、单独的位设置或位清除
# b  @0 a) x/ a, ~! f* y% I% p当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。9 U: X- {; H5 f( o% L8 \9 F

9 P+ M- V; H& M- |# V4 F9 g这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。
0 I4 N- ?6 S/ v) Q
8 A1 p6 ]* F; f+ ^
' j. g/ I$ m0 Y- n. {; c
四、外部中断/唤醒线0 o1 Y4 C% b2 ]% C1 F! z8 c
所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。- [( Y2 c7 l* a) E2 x
2 K- z9 Y) k" p( J: W, t
/ q% O& o  x7 d8 `6 l/ Y
五、复用功能(AF)$ H8 y; W2 Z+ ]2 `
使用默认复用功能前必须对端口位配置寄存器编程。
* o% h: ?7 E  R, e& H对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动
" O  U) j$ w' o; `- B, M" M+ h4 I$ ~, {对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。4 N9 G7 \8 I" d
对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。
8 p" P3 U1 b% x+ \& Q' v, \/ E9 ]& W$ W
六、软件重新映射I/O复用功能
! P( q1 @! p6 X1 Y- C为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。
9 T7 {- e. {' M+ j, Q
$ ?- ]/ X( J( x5 O, F
七、GPIO 锁定机制* ]9 v" A0 W+ k/ J) B" ]
锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。
2 }8 p& P* y$ y5 p

  L5 H; i3 G0 d+ Q* P八、输入配置
" `" x: G* s  s* q* ^8 B2 t- h, y当I/O端口配置为输入时:、9 A8 R7 `$ e6 b' W8 P
输出缓冲器被禁止! d( `' {- [8 [+ j/ J
施密特触发输入被激活5 g$ A2 ^* Y/ @/ d: j
根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接5 D  T3 o& \/ y2 {8 O
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
- }+ ?/ G$ F( u7 ~, j7 }对输入数据寄存器的读访问可得到I/O状态
" n$ H& Y: Z* A/ J$ H/ W0 b: L$ R' I1 X" A
下图给出了I/O端口位的输入配置
$ K5 l; V2 O; o' I+ j# \, J5 I
! P0 U. _2 p, V$ [! F6 P3 b1 d6 ^
微信图片_20231108140946.png 2 P& g  L# V! ]2 I/ T/ o
3 j1 b- e" Z) p
九、输出配置
! x5 J2 N7 [( K. @5 z& _当I/O端口被配置为输出时:
7 C# Q3 `4 o0 j# r6 M3 Z输出缓冲器被激活$ Z/ E4 G' C& a$ r# D( m0 t% b: a
开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。; w8 E& Q  ~# A$ b
推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
0 u( ~  a% O& z4 W) J! m施密特触发输入被激活
6 M" t; y8 T+ t& J弱上拉和下拉电阻被禁止- Q) y$ \7 k6 Y4 L
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器3 O' K# J" H; E' {4 g$ Q# ?4 B
在开漏模式时,对输入数据寄存器的读访问可得到I/O状态! ]8 |5 [9 L! y1 E* ]* U
在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值* P% {3 ~- A3 N, r* ~

' ^2 Y2 ^7 i/ d7 r. t
下图给出了I/O端口位的输出配置0 a/ R3 o" V. ]' M0 o
2 v- k; b! ^. [5 E0 E6 ?
微信图片_20231108140922.png
) u( ?9 A4 c+ n+ Y0 r) N, l# r( F3 \
6 M. g: r- w- p, J1 H! v% L$ m十、复用功能配置# n5 Z8 w0 f% g$ ?
当I/O端口被配置为复用功能时:
: R0 u! d0 `% D2 I9 ^, M+ }  K) Q在开漏或推挽式配置中,输出缓冲器被打开、/ ]2 M! m" I4 Y
内置外设的信号驱动输出缓冲器(复用功能输出)
1 F! M# I; s( u/ ?4 a% K施密特触发输入被激活% L; F  _% |0 ]4 _! h) o
弱上拉和下拉电阻被禁止6 C& E, q/ L. [! ^7 g- P: ?
在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器/ z, b4 {) A, m: w4 [
开漏模式时,读输入数据寄存器时可得到I/O口状态
% r2 c% i: e% b在推挽模式时,读输出数据寄存器时可得到最后一次写的值
7 }% V4 g' H5 G  v0 ^; [8 d1 x* X8 V0 p& A, U5 K) V; I! L7 w

! k4 c) p) J2 [) m8 P9 j& {下图给出了复用功能配置图片
+ u) Z/ D6 X1 ~6 k. C) {8 f" f3 Y; @0 b) A& F. V  Y
微信图片_20231108140919.png , J$ x7 B  }; N% f$ Y( R) B

8 B, o8 k: o3 a; A十一、模拟输入配置
  C/ f" c4 }: Z* O7 k# I当I/O端口被配置为模拟输入配置时:
- V7 ^  o1 i5 b' m6 h1 G输出缓冲器被禁止;! _$ E; q9 g! t% e& q2 y' h
禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;
: n% F; M- }/ I! l$ A3 t弱上拉和下拉电阻被禁止;! h) v& }% S( I, W! L+ P8 O9 [
读取输入数据寄存器时数值为’0’。
# ~$ v# c) m8 O: J# R$ n下图示出了I/O端口位的高阻抗模拟输入配置:2 E" T- |! {$ K2 i# N  ]
5 Z5 S& r3 Q/ h6 l3 h. B

# u$ a4 x2 k# M4 r$ L# X' x转载自: 嵌入式产品侠; D, G$ m4 s! q
如有侵权请联系删除) ~6 Q4 @: z+ A8 M5 a- q
, Z0 Z( D! C9 L2 d/ K

/ V/ d4 B! R' A* U$ p+ ]9 V: U: z8 {
微信图片_20231108140915.png
收藏 评论0 发布时间:2023-11-8 14:10

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版