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

基于STM32 GPIO 经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-8 14:10
一、GPIO功能描述
' B/ ~0 f; t$ _7 U  L每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。
: F' q4 e% c  S: \8 ]( E) G输入浮空: }4 ~% h9 A. b
输入上拉6 h, z% r9 ~/ X& E) ^, C9 \
输入下拉2 I+ G% Y) l/ x$ C
模拟输入
) `/ C+ ?# a8 S: l! I2 n" C& j; j! O开漏输出4 f- M! ^" j" t6 |2 x( z
推挽式输出4 v; L. Z+ ?$ M0 ~2 S! }# b( y
推挽式复用功能/ |4 T7 x1 _$ T" W
开漏复用功能

! k) `! I3 l$ K5 b2 R( n3 N, L6 E* l
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。
7 ]) h! w- Y2 y* w/ N# [0 ^2 Y, V7 d! }1 O. h3 H  ?9 z, H
图1 I/O端口位的基本结构图片: M- M% u& A3 y. H9 A

5 l, z. n  O4 P0 G, b
微信图片_20231108141014.png
7 R& N9 j- S- a4 s/ x  |& c  B

7 Q! p! ~5 S& b& G, Y4 T图2 端口位配置表图片
' a  s* c- L# \' U; F) a" X. A: q3 Q/ c! C
微信图片_20231108141004.png - `' K2 b4 S3 m5 i: }' U
7 |6 w  ?4 w; n/ J" c) Q. {
图3 输出模式位
" b0 z7 P8 S2 [1 D0 P" s2 }" R  s/ Z, U' g; ^/ Q9 A1 _3 B1 r
微信图片_20231108140950.png " i1 m- n: \1 N/ _2 A( s4 O

9 L7 p# C& e' D6 O- Y0 [* v0 w+ [二、通用I/O(GPIO)
! t5 a4 W8 R! ?. z复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:, ?2 l& R' w& ?5 u% [% n0 f1 y0 i
PA15:JTDI置于上拉模式
0 w* p" \- c/ h' ]( \' @9 UPA14:JTCK置于下拉模式, X; s2 K& t9 Z
PA13:JTMS置于上拉模式
/ _% }- c, e; x, G. [PB4:JNTRST置于上拉模式& a5 L! Y$ e; b, H

. G) A' M. G' j; R
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。
/ c: `* }/ O( [! `' \" Y( G

9 Y) h" H" e' e# L9 M. {输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
( I, F, c" d* a7 _
+ V" k: U, P8 G; W0 ^. J6 {所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。
" ?+ y+ c. `  ~, c( R0 w+ G+ ]% N5 x2 m, N! h
6 d6 E+ x9 d$ Y4 ?/ X5 A
三、单独的位设置或位清除
5 O% [) L( ?) x1 }, h当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。, y' I/ V  H  ^2 t# l
5 r5 y3 F% N" t! l% H
这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。6 R7 b5 a8 y+ W; F" Z, V  {
; U; v* I7 |' P

: S& N; C2 A% [/ w! s& f四、外部中断/唤醒线
8 }9 w! r7 D2 I$ l) f& U所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
  q7 O) Z7 b" c" K& V+ p/ r: Y( E$ h' b# i$ F+ `# Q, b: G) h2 v

, c  n  j# R2 |! T; p) G五、复用功能(AF)0 G) m/ S/ {2 G$ `2 v3 s* b
使用默认复用功能前必须对端口位配置寄存器编程。9 S1 ?* p- r$ W  ?# s) E% a
对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动
6 I& m# |8 ]! \& |对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
  q5 k5 `2 y8 g- W对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。/ c( m3 h! O! \; S6 Q! j; A

# K) m5 y. N* k' J
六、软件重新映射I/O复用功能+ w- ?6 T. L# j/ Q) J
为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。" ]: {' S: g3 m9 p8 ?* e8 ~

( W! R+ P) w! x4 T2 G8 {七、GPIO 锁定机制5 ^* L7 @' _2 G5 ~3 ?! [
锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。
% \. k  n" Y- K# e( E4 Q! q6 T
; e+ ~  g# d; Y/ r" u0 x' W" |( p
八、输入配置
9 S- v; [3 d0 v- g) |* K+ [当I/O端口配置为输入时:、
& u( K& |8 e* E5 d- l# a输出缓冲器被禁止
, ^4 F: W4 V5 X# L- o施密特触发输入被激活
8 y! K  \, u2 k1 P6 D根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接" ~2 e* Z/ c# r
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
) W  g8 b* X) O/ V对输入数据寄存器的读访问可得到I/O状态
! O0 k, Q7 R; B: r. ~# x" z$ k( X$ O9 W! G0 ?) |1 S
下图给出了I/O端口位的输入配置
7 v5 g# o4 Q& n
/ A/ l0 O- ]4 C
微信图片_20231108140946.png
8 \: s2 @/ n; L/ K! @. j6 t) F8 R7 c" E7 q$ c8 J
九、输出配置
0 E  R3 w) W; ?, \9 T  E$ w当I/O端口被配置为输出时:' x, O: d1 E, n% N+ J- e
输出缓冲器被激活
# M8 x' l) M1 V4 m% A1 j/ e开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。
3 N9 \6 G, ]% H" R+ s/ x推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。1 x4 g5 r1 h2 r4 R# O4 T
施密特触发输入被激活/ x' I' {; L3 i+ L" n' ?( t
弱上拉和下拉电阻被禁止
% e' P5 \. e& ?9 D, m- \" w出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
$ S1 p# g% y  ?5 w" B在开漏模式时,对输入数据寄存器的读访问可得到I/O状态- z( V* X" ^& |2 ]0 b5 {
在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值
! W8 o4 q2 O2 c' k1 ?1 t4 j( X# g, F  I) g" N
下图给出了I/O端口位的输出配置+ ]. \# h0 @5 P# _0 w6 j. l4 Z; ~
6 ?- i/ x- @, i* z( r0 a
微信图片_20231108140922.png
3 l8 L) c1 r9 P. ~; g9 h0 \
# p- l# e  i. B# o- M十、复用功能配置
4 k5 N; Y! X- K8 `+ G% q% X; U/ r当I/O端口被配置为复用功能时:5 Q! X/ X% j& b4 S: {* @( Z
在开漏或推挽式配置中,输出缓冲器被打开、
. j: C7 R7 s! h) U& u! h  x% @内置外设的信号驱动输出缓冲器(复用功能输出)
/ C( s" q7 q9 J+ O  o  Q施密特触发输入被激活( N6 O6 S% C0 W# W& t  t9 u
弱上拉和下拉电阻被禁止
- x& S' i, h4 w. q在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
! B( D) Y: d. a* {. o9 ?; Q/ p; A开漏模式时,读输入数据寄存器时可得到I/O口状态$ ^. p& n: Q) X# c4 C& x7 k1 x
在推挽模式时,读输出数据寄存器时可得到最后一次写的值
" |* V4 f- B2 J6 i( L3 R
  O2 L# R1 U0 g% Y) X7 Z

' N6 z3 }; A1 v下图给出了复用功能配置图片
9 i$ |  z4 H2 r, x# l; u# x0 p; t' _
微信图片_20231108140919.png
) M5 n. E- i. J
/ I& V# s4 k8 t  J5 n2 U
十一、模拟输入配置
! f1 r5 y+ I( P- I. I7 J* A" D当I/O端口被配置为模拟输入配置时:% ]9 B5 T: H9 _+ u+ V+ ~& d# N
输出缓冲器被禁止;  U2 U7 h4 H' }# Y) R, q
禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;
9 v3 v/ ^( \4 J5 [% }弱上拉和下拉电阻被禁止;
1 h$ E) \6 T3 ~7 w读取输入数据寄存器时数值为’0’。  e8 j. z6 W0 _/ P
下图示出了I/O端口位的高阻抗模拟输入配置:# [) b& G0 o) {! \9 V! ?
) }/ J% i* @- t5 }' l) u, }

$ C+ X3 D+ l1 ^8 K% X& n) _: G转载自: 嵌入式产品侠
- S1 D( E5 R2 m+ ~如有侵权请联系删除3 w; F$ J8 W/ J3 u, x

/ x2 V& f: [4 f' ?/ D
3 n- T5 s7 y8 n6 ]) V
; c% p6 R, P" T( t4 F7 y+ q
微信图片_20231108140915.png
收藏 评论0 发布时间:2023-11-8 14:10

举报

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