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

基于STM32 GPIO 经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-8 14:10
一、GPIO功能描述
- N6 d! i. M, p& s/ \每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。8 s, h- c7 d1 Y5 j3 C  n5 t8 E# b
输入浮空' l) s& y) k  o; \; ^& E
输入上拉
% u% P$ R2 l5 V: H8 U/ D输入下拉/ e9 e/ R  R/ T5 e( i
模拟输入
6 `6 \" `& r/ k  M% v开漏输出
7 @' S% O2 G5 O2 I6 L5 \! G6 c推挽式输出
; U  O* z  |+ x, X# \推挽式复用功能
: s7 y9 G% j$ M/ ^' `& t4 d开漏复用功能
: W5 p# ?! x5 D  V8 @
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。* h: R3 t- M3 U

- q3 l+ ^% a4 z2 u- K! W图1 I/O端口位的基本结构图片
$ N& n) H; G8 k$ \  v( g+ \! H9 L- |7 C$ ~
微信图片_20231108141014.png 7 I5 r% x8 @. j, c1 h

, q( s: ^, ?; P, j- G图2 端口位配置表图片5 z* c$ L8 q' u) _

7 e" ^; s: W, Y  B! z
微信图片_20231108141004.png
" |3 S( j$ }1 \3 c. {
& I# }# m; R+ @9 m; M( P
图3 输出模式位  T" K: n, h/ o$ F

6 A9 y8 G! G% J4 E- @, B8 ^
微信图片_20231108140950.png
  P) w( U  o6 R0 R' H

3 w5 q( G& u7 ?二、通用I/O(GPIO)% n) m1 V3 G  o0 I; E
复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:% }8 z" d9 W# e: ^$ v6 V$ L
PA15:JTDI置于上拉模式8 o+ G# e% s! B0 H) s% l/ I
PA14:JTCK置于下拉模式4 w+ Y  a8 \2 M. i* h) x  i
PA13:JTMS置于上拉模式
0 C) F5 @5 `- XPB4:JNTRST置于上拉模式
# `; B) J) b, Q/ a( G
; s. W; Y/ w6 D$ \  J& f3 M
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。. G5 n: y5 d: m  x, P9 X

$ n' v; x5 D9 Q输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
* v2 {% @: h9 E# G* ~* [2 L7 R! N- c, M. d  ~' n5 D1 c) {
所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。$ T1 X. r5 g, r7 `; y" ^
* b+ J* ?$ z# p0 Q) _* {

8 D; ?6 q& r; ~& m2 n6 d# Z三、单独的位设置或位清除
6 m% d& ~# O' O3 E+ E1 y当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。6 ~% R: }: n# r9 e9 C2 n; ?

2 d4 V* R4 {/ {6 X  @0 ^这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。! }7 c/ l3 E" u# w
9 Y5 m8 ?) u! B7 _- y) l
9 L6 e+ B4 O) U9 i7 ~$ p
四、外部中断/唤醒线8 ^2 z, @" A" k
所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
+ E# Y: f4 S3 F' a1 Q2 i/ `) W
9 Z, D2 O( O* o8 R

7 [0 p0 x4 I4 g% k4 l五、复用功能(AF)
/ E4 a; s7 V' W: Y使用默认复用功能前必须对端口位配置寄存器编程。
. \  P& H$ C  C9 H/ ?对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动' E. E1 \& p5 V7 f, u  P% ^8 \
对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
2 A/ K3 D. D9 A& }对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。
5 t! y! U4 M6 E2 A1 a' h0 R; G
9 o& W# e/ ?) e3 h6 D2 u! H2 @
六、软件重新映射I/O复用功能3 n9 t% T- V1 }- Y) Q# v9 o$ n  z
为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。) v, Y% t+ V, C. N' z

7 U* T' |6 r! i0 d七、GPIO 锁定机制4 n" E) L9 F/ [* W. h5 h2 {
锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。- T  L3 `* `9 d& N% p
0 F+ t7 @1 A! \; t3 s1 a
八、输入配置
: g* K. ?  [" _当I/O端口配置为输入时:、
3 H9 {9 F% E# V; N2 j输出缓冲器被禁止2 Y/ _5 N7 @) I
施密特触发输入被激活: E' V1 M1 N- ^, C, j6 H* V
根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接7 l* L' k) e- W5 q' D1 K% z
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
: r1 d2 l  I3 P- ?& y  P对输入数据寄存器的读访问可得到I/O状态# s- h. ?7 Y( ~4 x- i( h5 E
- j. b; O- X! p! \3 D" z- w' a
下图给出了I/O端口位的输入配置3 {) @. J+ _" o6 I7 i2 ]  {$ l

1 K  \1 g7 K% X3 s2 x; w  i' T
微信图片_20231108140946.png 1 o8 ~) C+ ]; E9 y) V0 z

: j; Q, E  F( j+ n九、输出配置+ a5 h& [6 N3 G' d, p6 w. A
当I/O端口被配置为输出时:
- h* @) q, L5 E& [8 ]; j7 C输出缓冲器被激活; A3 I6 J! N0 x+ b( c/ ^: y2 d
开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。
/ S- v+ O8 I- ?6 m1 K8 l$ O' A推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
8 B7 L" U! [$ y5 f$ y4 ~施密特触发输入被激活  {# C4 h) e) S+ q+ ~8 P
弱上拉和下拉电阻被禁止; i# z. S0 K4 q" c& P- I3 u
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器5 [- V2 P. i7 P8 a6 R- H: i! S
在开漏模式时,对输入数据寄存器的读访问可得到I/O状态1 ~9 c# p1 }- k# i. P
在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值
+ n- J* Z& f- x+ p0 [, X, f# ?' l) W; j/ R1 l* X5 ]  }, e
下图给出了I/O端口位的输出配置' c8 Q2 C1 E4 P0 o4 f! l  l- h; n. `$ W
5 s5 E5 P% u: U6 ~$ o
微信图片_20231108140922.png 7 l8 G6 R" s$ ^% K# S) g$ R! D
9 {$ g% |1 B; j: ^7 ]0 m
十、复用功能配置4 a' h: x$ O# G! ^) p! c, J! z
当I/O端口被配置为复用功能时:% q( p- D( p# q! w
在开漏或推挽式配置中,输出缓冲器被打开、" o- ~0 k. w, V6 V1 [  x1 D
内置外设的信号驱动输出缓冲器(复用功能输出)
; C7 W- |+ u1 P, e# X. q" j施密特触发输入被激活0 r! f& ~2 ~0 p. O9 w2 G+ D
弱上拉和下拉电阻被禁止" i. b2 i; }- q% x
在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
! q* k3 N+ y" C  t8 Z; P& ]* F开漏模式时,读输入数据寄存器时可得到I/O口状态
' C8 M& z: T. U8 H; F$ p在推挽模式时,读输出数据寄存器时可得到最后一次写的值3 n4 K  W$ j( r# Z1 n7 l7 R

$ X' G5 M! z: E3 a9 _/ {, T* I

  j8 k$ h) \) n$ [' l$ ?& h; Q, j7 v1 e下图给出了复用功能配置图片( s2 ^! Y' }2 x( K
7 K8 q" h. M! a8 }' S) x
微信图片_20231108140919.png
" z! |/ s$ J% D( L
4 y* p( u. |" x1 m0 n5 y
十一、模拟输入配置5 P9 |0 i# d' ~( X! H
当I/O端口被配置为模拟输入配置时:$ ^; z2 U( \  M& B- w# h5 z  I; [
输出缓冲器被禁止;1 }0 G; e( w# i7 j: i; Q* ^$ \0 i
禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;
) q5 _1 Q8 n2 Z4 X8 {, a# ~弱上拉和下拉电阻被禁止;
8 {; p) z$ P$ L/ z% e读取输入数据寄存器时数值为’0’。& R0 w/ k% _0 ]) h
下图示出了I/O端口位的高阻抗模拟输入配置:
; t& b; n. z) \2 W5 t& D
7 {: l. d- w! K* q$ A$ |5 f
3 r5 [/ W& V4 f. o! U
转载自: 嵌入式产品侠9 b, z6 e/ E8 Q6 ]9 e% q, j
如有侵权请联系删除+ C3 m8 @5 g4 {% U, p6 ^' u

% |6 `( A  e  Y. ?& F1 @. r, ~8 C
+ X% f* f$ s+ W1 b* |
$ r* m4 o: [2 ~- n) w5 t! G& t
微信图片_20231108140915.png
收藏 评论0 发布时间:2023-11-8 14:10

举报

0个回答

所属标签

相似技术帖

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