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

基于STM32 GPIO 经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-8 14:10
一、GPIO功能描述
# v3 w# W( }+ ~' R6 C' C8 ]! w每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。) H5 o# ?7 T1 W% Z
输入浮空
& D% y5 B. {# g- @9 v! g  ?6 @# J6 q输入上拉
/ N0 ~! l( d: |) k4 R& z4 b& o输入下拉
) R6 g. G; j3 |模拟输入9 I1 K6 R' H4 I& @/ E
开漏输出
+ c+ {5 L3 d5 G推挽式输出
- @6 |0 k" i3 I4 [% R6 t' G推挽式复用功能
8 U$ E4 k; Z5 h- Q开漏复用功能

$ w& _  }$ y6 B# X  I
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。
7 i8 l% |, D0 C
0 }+ n; j3 P2 R, P3 K, _- ]图1 I/O端口位的基本结构图片
" e# K- K* p9 B8 U& X: x3 J
. G7 L% x- _/ f; ?: F6 x
微信图片_20231108141014.png , V9 A* }+ g# x" U/ C2 w" d
" t0 [8 K+ N8 R5 @# E0 ]1 M
图2 端口位配置表图片
# w  _/ H0 A+ Q0 Q! z+ t! b1 j4 Z7 W
5 o) G' r/ ^- w9 K
微信图片_20231108141004.png 9 M) _) B8 J" v& s

9 [& v1 a! B% I图3 输出模式位
: U- A. x8 N# M: S% {
) f. q% C5 v6 b) ]8 E& X6 E6 j
微信图片_20231108140950.png - ~8 g. Z: B( o" D% `; I$ d; Q3 T. S

( a& f0 |$ Y+ b8 R: u二、通用I/O(GPIO)
) y! {0 S' n7 A5 }$ a! p复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:
1 \$ y& L# _& u. UPA15:JTDI置于上拉模式
2 w! ]! p7 \/ B9 o, gPA14:JTCK置于下拉模式4 L' a6 S! o: b" T, N5 O4 y
PA13:JTMS置于上拉模式
1 W5 W: {6 ]; u! {  Z+ }8 L8 o5 `PB4:JNTRST置于上拉模式
: ]1 g9 K  X: Y0 T$ _5 d7 B: x2 F: o
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。+ V# W7 D* k& p: A/ b+ k
0 Z# I' u: V9 k3 p
输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
! r; Z) _5 @# d7 d% T. e: K( {' n8 t- t; l; R% k" d( d
所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。5 |( C* t7 L! S

* _' n) z7 F; k0 E$ u/ @
( w* R' S( O* y( v/ j
三、单独的位设置或位清除+ H2 s' Y; K) T9 ?8 A
当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。( W* R3 s! _0 C3 G, g/ [$ b3 R; u! Y
+ y* c$ N! k: L0 x$ g) w
这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。
+ R& U+ m- Z, _' J/ X- v( e7 j" @& M: N0 s/ B- V
3 J$ X3 ~) R/ q
四、外部中断/唤醒线
& O, l5 E$ \: F7 L- o7 k所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
4 z! s1 x( [0 p# i& |* F# `9 d/ G1 Z, u8 v# [

7 ]- }; \, `; A; ]8 j( T. j- k五、复用功能(AF)
0 ]  v6 o$ k( C0 N使用默认复用功能前必须对端口位配置寄存器编程。' @9 ~. f0 R- a& }: }, ]1 @
对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动
% [  C& B# Y; T. h9 p* M, S* R% ]对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
9 h, e  Y- O; G6 d9 K/ H! g# X' s, Q对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。
! I& K% Q5 J( d9 a( a5 a/ ]- O7 O9 ~' B, y$ b5 S7 b* s- _
六、软件重新映射I/O复用功能; r) }8 ?( j/ v5 q6 X
为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。
6 W, e; [6 g) D: o# l

6 ^# N. Z2 J- _七、GPIO 锁定机制
1 c0 B* y3 L: H3 L' Z8 J锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。2 l/ j0 I; @2 e/ b
) k. h7 n' c3 F6 @1 v# Y
八、输入配置# k1 _9 k8 P9 d- {
当I/O端口配置为输入时:、
' o+ R" r8 m4 l3 o9 D% J; f+ L" _9 [输出缓冲器被禁止
  ?8 z+ l7 Z# `0 i施密特触发输入被激活
; T/ d; r2 Z: n1 L$ G1 S, X根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接2 I  `4 k; T- b9 P: C
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
, q) Z; D* ~! v' n: N$ w2 X! h8 U对输入数据寄存器的读访问可得到I/O状态9 n5 g$ b) I( i7 `
, G8 A2 ]% t$ ?+ u# q
下图给出了I/O端口位的输入配置
1 U( t- |; f2 ?
  Q3 g  ?' G7 A! {% E! S2 o! D
微信图片_20231108140946.png 8 E) {0 b% q- d, |% t# T! x

" {9 g$ g) W( B; R' {九、输出配置
. J. o# }+ g$ Z$ r/ @/ V/ |当I/O端口被配置为输出时:
7 ?* r& {% Q) M; A/ `3 C- o8 B5 B输出缓冲器被激活
. j' N& T: t; {6 ^, S8 \开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。+ I9 S& p. k# P# k8 ?* Y( Z
推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
' j+ Q! i, ~( c3 y施密特触发输入被激活7 f1 I9 ?  L3 s$ B* e2 s$ C
弱上拉和下拉电阻被禁止9 X$ q8 D, `( p: D8 u
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器  G& k8 N, v: ]2 W
在开漏模式时,对输入数据寄存器的读访问可得到I/O状态4 T9 t* _; w4 y, r
在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值
* y8 ]; q6 S: V. P9 w0 H
' b; K0 b/ j8 Q) n
下图给出了I/O端口位的输出配置
, W) d7 g7 ^6 J
. z7 H( ]+ l+ \; ?/ Z7 K
微信图片_20231108140922.png
2 c2 @3 k1 t" t2 e! x
  |% ^1 {- `) V3 x, ?" C十、复用功能配置2 d0 |" s6 J' N  D
当I/O端口被配置为复用功能时:
+ @5 @$ i9 o! d7 E2 G% @4 P在开漏或推挽式配置中,输出缓冲器被打开、% P# D2 x, x4 y8 s( @
内置外设的信号驱动输出缓冲器(复用功能输出)# x) L" d" X! V: p3 w" Q
施密特触发输入被激活) \) W$ [) U' q# a8 a; W$ @* H
弱上拉和下拉电阻被禁止
9 h" m& O7 I! Z: p' V在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
8 b* l& a8 _; X7 Y% x6 \) g开漏模式时,读输入数据寄存器时可得到I/O口状态3 \& W5 s; r/ |
在推挽模式时,读输出数据寄存器时可得到最后一次写的值& W" h+ R9 I5 }: ^% s

4 |- V5 m, s1 U3 O5 b, f8 C; F
6 E. m# W3 [, M  d9 S, d
下图给出了复用功能配置图片9 k6 L+ j# ~; `9 f. b
* L" A. T( S+ _  H# o
微信图片_20231108140919.png 7 H' Z; O5 r  P  |& A0 s
2 Q6 f2 A( ?% P1 ]2 k( @1 O
十一、模拟输入配置
! U" Q% }5 A* u& m' y- @当I/O端口被配置为模拟输入配置时:- Z5 j9 X: T5 @/ a6 |8 A# R. O
输出缓冲器被禁止;
6 ]' Z# h7 x9 ]禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;! Q+ V/ d; _0 x$ s2 `9 A8 P
弱上拉和下拉电阻被禁止;3 i% K& w' r- h
读取输入数据寄存器时数值为’0’。; ]# e0 `* r3 q% D
下图示出了I/O端口位的高阻抗模拟输入配置:6 p% \! x' t0 G1 _0 ]/ _+ H; p
# ?; G, ~3 W& {1 H8 L/ w

, V1 G& z& n$ v  m3 t- l4 P+ S3 ?转载自: 嵌入式产品侠) V$ l3 D- T1 R+ E. |. t2 x
如有侵权请联系删除3 v1 ~; ]$ t7 ?" j

1 w5 y8 g2 w# u/ @: I0 O" k2 s

8 Y; R, R! v, W& _; x
' R! e* P9 L, _
微信图片_20231108140915.png
收藏 评论0 发布时间:2023-11-8 14:10

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版