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

基于STM32 GPIO 经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-8 14:10
一、GPIO功能描述
2 n5 n$ |8 Q8 K3 k6 H每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。# H2 w4 z4 H8 L& b5 S& ?; N
输入浮空& t6 k1 a' B+ w4 {5 Y0 z
输入上拉
# t. F# V' R8 h3 N- T输入下拉
: ~( e; H7 |: `* v6 p0 A( @1 M模拟输入2 Q- @' S1 L4 N' V1 s+ u, H
开漏输出
0 ^* I& d" y7 Z1 o' E: f6 K' R) L# o推挽式输出
- Y: k- y& B, c: y2 \推挽式复用功能
; ?% U7 H8 d) k/ n3 e开漏复用功能

3 v+ M7 ?# W+ E2 }5 p
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。
* b$ S! n0 H) W  d
3 J% y; Q2 A! I: H图1 I/O端口位的基本结构图片
! \  w: m) ?+ {5 M5 q8 |. f
) \, _: k( P2 K7 G$ m* |
微信图片_20231108141014.png
8 [; g0 V5 {$ d# S: |

" p# \% t7 B# y! R& v3 {! A5 \图2 端口位配置表图片# l0 K: W- V7 L6 F5 Y& b8 n
6 Y) E1 A- x4 r" O4 z* p1 \4 I
微信图片_20231108141004.png
* H$ n% o2 U8 @, D! m; ?5 u* ]5 C
9 _: @4 p, C' E  z# d  q2 d% L
图3 输出模式位$ |# f8 s/ v8 h/ W: u3 T1 b

3 R% c% J1 c" O# F: a6 ?
微信图片_20231108140950.png
5 G4 Y2 Q7 L0 K7 n4 t9 }+ n& D' n
- I9 x8 [/ v  d$ b
二、通用I/O(GPIO)
! Y# o+ g( N1 u1 q2 a$ q" R0 v复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:  e( i; r  J% {- W3 G' z! `) r
PA15:JTDI置于上拉模式# M! o" `8 e5 c
PA14:JTCK置于下拉模式& P$ P, J. E) Z6 g/ n! V( N) N
PA13:JTMS置于上拉模式
; [2 F5 u9 _. |1 ?" YPB4:JNTRST置于上拉模式. |! O6 ^& y8 c* y/ D! L
) z  r1 O: w$ o6 }, B' i- d- b0 I
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。, C' D' D, i4 K& u+ Y! @% G
% l, t. W6 @! b2 X1 C
输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
+ n5 ?7 f; i$ v4 o3 W$ j
& c& U. O( m- X* {0 o" w, C所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。
6 e0 Z/ J+ c' R' T% n  j2 |
% Y  ~6 D$ _/ n- [
9 A, d! A% h$ y5 a8 W
三、单独的位设置或位清除
, l$ _& g/ K7 s. ?. ]: D  _6 W- s当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。
9 b6 Q; I# Z' H* D" @
& j+ [+ J# \( t% w4 W2 U0 {这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。
* q& R- ?& W3 i  q. f6 }/ v+ N
/ \& Z* h4 ^8 b# M9 F( @
四、外部中断/唤醒线9 ~' z  U' s0 v9 r! b0 c' B
所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
4 M; s+ I+ T: u. ^$ z* c; c, b% y, r7 V& s/ v6 J" G4 ?& x

5 q' w" c: r& b& {4 F. M4 w) U五、复用功能(AF)
. C' b3 J& i6 m; u7 t使用默认复用功能前必须对端口位配置寄存器编程。4 N0 s# O$ P, q& {+ G
对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动
) A5 |3 {3 U& s1 }. P对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
, E5 ]7 @0 j8 g" m8 Z! O; i, Y对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。4 m/ }' |1 H: ]' E5 \

! F2 S8 S3 t/ v& s! v$ o( B
六、软件重新映射I/O复用功能
9 f) |5 ^& W0 u$ @+ w) d! O9 E4 i为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。. S, F  b- W+ D4 O( _7 D2 g: [

7 W2 k5 J- X' H  p% D: d, a七、GPIO 锁定机制9 G, Z8 K) D1 K" W& N9 j- U6 J/ M
锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。
/ k' Z6 K8 s9 ^" O4 Z# ?7 q, r" Z

) N5 k9 [3 l0 r! z- Y# d( _八、输入配置/ u9 @' `$ w! b; P
当I/O端口配置为输入时:、
$ _) n7 L1 @7 N" Z% V6 V输出缓冲器被禁止: }/ E5 x: R! Y6 T* |. s
施密特触发输入被激活
2 M; _% U) U# {根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
, F, K) K: i) w& D出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器! u- M0 j$ `) W. I$ X
对输入数据寄存器的读访问可得到I/O状态
( D1 K" o4 `( R' D9 C! v$ x, z- T1 s! y
下图给出了I/O端口位的输入配置
& Q! `, R) |+ R, v( Y
; _4 p+ h. k4 h  s. a) U- T
微信图片_20231108140946.png * C& U% y3 D, h& R2 A2 f4 Q

2 z1 X, ~4 l; e. ^$ n九、输出配置
6 |& f" f# G/ [. f当I/O端口被配置为输出时:( C9 ?$ s/ V  l$ d% G
输出缓冲器被激活; N" s% s% j2 L; j/ t0 n- I
开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。
/ j% ?4 |6 A1 i推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
3 ~& b( T, k$ J" F) f2 T& P( y施密特触发输入被激活
- U# j1 J# r# Y& R弱上拉和下拉电阻被禁止
5 }# h: m4 D& T! v% t出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器$ V5 y' f9 T6 z$ B
在开漏模式时,对输入数据寄存器的读访问可得到I/O状态6 f' I( ?( g7 H8 u# D4 q
在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值4 v$ m6 _5 o- q2 @/ S) h

2 w. I0 v( C6 P  k7 O
下图给出了I/O端口位的输出配置" w* a5 d6 }( Z4 _9 j4 N

% k0 Z% m: ?! E6 b$ Z1 a; e
微信图片_20231108140922.png - h2 Z0 `" @+ o+ p- }$ L
2 U5 X* X" l- w+ K( {1 V" k0 V
十、复用功能配置2 i5 l* J2 H, v6 g, g/ a0 _7 V
当I/O端口被配置为复用功能时:/ n7 q6 n% E4 l4 q3 s3 h1 ?+ a
在开漏或推挽式配置中,输出缓冲器被打开、
9 t. I0 e" }9 f# D. K2 x( k内置外设的信号驱动输出缓冲器(复用功能输出)
2 M, ?9 c/ S, r; [施密特触发输入被激活
+ x0 C# p( Y$ @+ X0 e2 h' x1 M弱上拉和下拉电阻被禁止
& @- y1 z( }6 R3 b在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
2 o" j  X& x0 l  e" d开漏模式时,读输入数据寄存器时可得到I/O口状态4 k% g/ p' W! [- W1 J6 b) d  H
在推挽模式时,读输出数据寄存器时可得到最后一次写的值
; a. x; e& \- F% Y6 T: {. J5 r2 W, ]( h; \3 a0 I- \* S$ H- o
1 p8 @7 D$ l/ l  p
下图给出了复用功能配置图片1 _3 g) a; h2 k' W3 ^' `
7 B) G+ M- Y* T, X. Z+ M5 c
微信图片_20231108140919.png
" T7 x9 Y0 v" Z

6 U% e" f9 w) K+ l十一、模拟输入配置
8 d! ]) j; u1 b  ]1 |当I/O端口被配置为模拟输入配置时:! s& \/ N: d# t' y/ Z: e
输出缓冲器被禁止;
) J& ^% D3 w0 k. q6 G  q禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;9 _; Y1 f9 O- [+ z  E
弱上拉和下拉电阻被禁止;3 v9 n9 C  C2 ]& Y5 G
读取输入数据寄存器时数值为’0’。
: J- R2 H, Q+ _7 k( |, Z6 ?1 X下图示出了I/O端口位的高阻抗模拟输入配置:
. O, f7 [# V3 j, q+ l& h2 O7 B  M% @) X
* o2 t) A+ _3 K( f
8 \0 d3 f9 ^- b  k
转载自: 嵌入式产品侠  @! Z2 Q  W4 O0 {
如有侵权请联系删除
! q6 p# W1 f5 j) x
, y8 ^+ w1 i' p0 Y+ r/ x

3 S! Y/ ?# }/ I! i
% p- [+ u( s, h" C
微信图片_20231108140915.png
收藏 评论0 发布时间:2023-11-8 14:10

举报

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