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

基于STM32 GPIO 经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-8 14:10
一、GPIO功能描述2 d. I( T4 o8 K4 k1 h
每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。
. T. m3 P# Q; {# e" A' @3 T输入浮空  W  q8 b3 L" F5 d3 h0 ?$ E
输入上拉
/ k  f( i8 Y5 f4 _输入下拉
: U7 ?: H  |; t/ ]& Y: `模拟输入$ _+ e' G" t* t: G
开漏输出' H9 F; ^$ _7 h' L' A' k( w
推挽式输出' j& V4 ^: V/ e9 J. W* Q- R
推挽式复用功能; G" K- Z& k4 K) t. e1 o: C2 W
开漏复用功能

3 E# x6 B0 M! d/ X3 g& _3 _0 ?5 \
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。# g& U" n' `) q' x& E* I, H

. I; _6 a% G+ C; ?- T# `4 I图1 I/O端口位的基本结构图片
# \* q# h1 ]7 B7 l7 }
! H: j( M0 x5 _3 X! ]6 C) X
微信图片_20231108141014.png
( ?& q' \+ P" K/ v

3 y: S0 b7 H; y* v8 {图2 端口位配置表图片
7 U" T" y+ e& N. W5 _6 s1 C, T6 a! m5 R4 ~9 w% j* E- }" L! M
微信图片_20231108141004.png # y! E: t9 W/ @3 p7 M# @, w0 J
+ v9 N$ Q- s, q2 T0 S! n+ Q
图3 输出模式位
* Z4 [3 ]* t5 r$ |6 E) O5 m+ J( |! l; N
微信图片_20231108140950.png / o8 T4 l0 `$ F+ w5 T1 @# I1 j

" y' W/ ?* c, q. _$ q% R二、通用I/O(GPIO)2 g- U2 ~0 L# ^2 E7 o$ d0 v  f- `
复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:7 w% ~  S5 l. X3 Y* \2 w% c. _1 f
PA15:JTDI置于上拉模式
+ w/ f, `2 J  ^" i9 LPA14:JTCK置于下拉模式
* R. P- q( j9 S* }3 B4 _PA13:JTMS置于上拉模式
0 [, |% `8 [7 c3 x+ N% APB4:JNTRST置于上拉模式: p3 N; g1 `2 }2 N
9 {) m1 c" g) X+ w5 }; d
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。* L) a& J0 @8 K
0 I' T$ W6 w# O# T/ }+ E0 `
输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
8 R+ t( ?  T$ X1 ~! X* ^
$ n. p$ a, z! j0 b) Y所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。* Q' C8 u4 n% [+ J

. I5 O3 r/ L( O: g- @, V7 ~9 m% I
3 u( ]; D1 ?! T% v! Q$ g
三、单独的位设置或位清除
5 r, _( k7 I, Y- F# n( t3 @; z* v当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。0 h7 I$ B0 S# j$ m+ z! d" I1 j% L

' E' E/ s1 @: j4 L这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。* @6 H# V; {$ P0 h; I

* s* \5 K% @* W1 o% Y0 y) C9 k
4 D$ Q+ n/ G0 F; z! [+ a
四、外部中断/唤醒线# i( p! r# x; W
所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
' @8 z8 \" z- N1 w. h+ a8 r, _' M5 q1 ^; @% P7 m( a: x3 l

- x4 S+ t& K/ X  v/ H五、复用功能(AF)6 f# p. g) r7 h/ f/ i0 x" g! `
使用默认复用功能前必须对端口位配置寄存器编程。
7 f$ s  ?( u8 Q+ X+ n! g$ X对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动
# v7 M6 ^7 y1 M4 r8 l# d7 k对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。' s: o5 o0 ?6 u+ N1 r. ?
对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。
2 c% g1 Z) ^$ `. y3 R' k
! z8 Z* D6 r9 }. c/ s4 ?& z
六、软件重新映射I/O复用功能2 j: K; @! V- X4 m9 Y
为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。
) z7 S; z6 W# I6 B( N# i6 G
6 N# }5 A" _- q/ h
七、GPIO 锁定机制6 E8 D  u+ a* M3 M
锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。
1 S2 Z( J9 h3 a$ k
1 i2 E* c2 A7 {! X) l3 c
八、输入配置
4 S4 j5 @. f; U6 j( N1 N4 S. V当I/O端口配置为输入时:、
- B- o4 Z8 g$ Q* \& Q3 R$ N2 F输出缓冲器被禁止5 U* c& ~4 S7 `1 K+ Y0 S* \% J
施密特触发输入被激活
8 \5 W% K( T* q* p5 `根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
' ~/ Y$ g( w; n: L1 A; a; `出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器+ S2 y6 T- ^! A, W$ g( U. t- z
对输入数据寄存器的读访问可得到I/O状态
- ~( @6 _& s3 a1 \9 ~4 j6 p4 m% Q- f$ y2 D( d& \. R
下图给出了I/O端口位的输入配置, ~4 Y8 t* @$ t" T
/ T! N+ p; T7 w: A2 k
微信图片_20231108140946.png ; Z& ~) i0 F! m% z1 i3 H+ G

2 X2 p8 t0 R+ ^8 S9 f6 J2 s4 u) a0 j9 h九、输出配置
! U  ~2 V3 K/ v/ C' W7 f) w当I/O端口被配置为输出时:' S- C& C9 W1 e3 a" L
输出缓冲器被激活
; T8 k4 Z2 i( D- k8 z9 [' v  k开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。
1 @' ~7 P4 o  T' G* L推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
7 U  t; b" y4 R! _' f2 E施密特触发输入被激活0 u- T1 C: ^3 D% U
弱上拉和下拉电阻被禁止
2 Y3 @3 v  @9 y2 b' B出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器1 g6 |# r# j  U& W
在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
: l+ n- {* D$ R% d9 G+ N在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值
/ W1 d' \% D1 {! {
0 i# ^1 x$ D- u$ g
下图给出了I/O端口位的输出配置
% G& `, \. N- Z$ N3 s: E  I' {) L  {8 K
微信图片_20231108140922.png ; g8 a3 i7 r4 |1 e, \- u
2 {- e% d: }) \5 m
十、复用功能配置; N+ m5 ~+ X2 e. I# g# e
当I/O端口被配置为复用功能时:$ T6 T* h$ O/ v+ P! C1 ?! u
在开漏或推挽式配置中,输出缓冲器被打开、
$ y6 O% N8 a! m6 @5 C内置外设的信号驱动输出缓冲器(复用功能输出)+ L( Y  i& |; r- b1 L
施密特触发输入被激活5 \. u! N6 t" \' c, F
弱上拉和下拉电阻被禁止
% `) O  R7 O8 {- s3 t在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
( g, c- i& d0 f6 T. E4 e5 n0 X开漏模式时,读输入数据寄存器时可得到I/O口状态
  H. X+ g3 n: P0 B3 T; F/ f, c在推挽模式时,读输出数据寄存器时可得到最后一次写的值
$ B3 R3 d6 A  R0 T) X: C
% j1 R" s* @2 h
+ p+ L5 h; |5 n$ j" C& h( ^5 V5 \; h
下图给出了复用功能配置图片0 c# l6 `1 V  {6 I% P! ]

* K$ n. |% x* A( _
微信图片_20231108140919.png   P7 h% a: k1 ]

* U- f6 w# b2 ~+ v4 v十一、模拟输入配置8 R9 K! A4 S# F$ J) P
当I/O端口被配置为模拟输入配置时:' v, h$ O7 A% P) F
输出缓冲器被禁止;# L7 |4 ]- F/ o6 t& \2 T, Q
禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;
4 N6 e, U  D1 p0 w5 W弱上拉和下拉电阻被禁止;
" t6 S& J* v, n6 z读取输入数据寄存器时数值为’0’。
- m8 j4 v  I( }下图示出了I/O端口位的高阻抗模拟输入配置:! J! \+ }: G% q

% P, k( m: X$ s

# \2 ^7 h1 [- _, O# |2 [$ R转载自: 嵌入式产品侠, }' j1 l. [- T& M
如有侵权请联系删除
3 E& {2 v8 n$ F0 `6 E2 W# }: K4 F. _: j9 H

. {6 \& H' r/ j7 ~& D2 ^# Y# o: c0 z7 ?
微信图片_20231108140915.png
收藏 评论0 发布时间:2023-11-8 14:10

举报

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