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

基于STM32 GPIO 经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-8 14:10
一、GPIO功能描述
; A1 y. s' e8 [1 W) q每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。
8 D( {  y$ h6 h# ?, q+ s输入浮空
1 ]3 c2 u3 u( h0 m$ }输入上拉0 v% Y# S0 o, U$ B' y3 y
输入下拉  O0 A& q  i" @  ~- Y( X. \
模拟输入
/ F2 s! Y. e. G& m+ [开漏输出6 E' s% y3 f5 D/ `- c) R  e
推挽式输出
3 D3 x5 i. Y! o" Y- h- V推挽式复用功能+ e1 w& h: }1 [* q4 `# ~
开漏复用功能

2 L9 E! P# x, R6 B6 z9 \$ S
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。# X: f* Y! f% f
# B& E7 b5 H2 t( j5 D2 l
图1 I/O端口位的基本结构图片
2 B; j% Q5 h2 \4 @' f
, K, ]$ |( c$ D8 f
微信图片_20231108141014.png
; w" X& h- S4 j) K! u

5 O4 y0 w1 Z) [0 r# z2 @图2 端口位配置表图片& G0 \0 H% Z' b# d- G" w2 F% z

1 x, X) v3 G% ^1 `  h4 ^
微信图片_20231108141004.png
1 ~2 h, j% o5 ?" T
. a, `) @" T  ?2 r6 f
图3 输出模式位
5 |6 P( S, `! ?8 U
3 Z% W1 S- b0 \1 f
微信图片_20231108140950.png
0 U0 n- U7 a; H- K: F: p: a5 m6 A

1 I5 w0 P3 [& ?3 ^) r1 y二、通用I/O(GPIO)
' i$ Z" n( t! B" ?6 E复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:
+ i' C7 F* L# d! i; ^PA15:JTDI置于上拉模式
$ Y0 ?7 b/ `; H2 IPA14:JTCK置于下拉模式
( I! ~+ }" x' p# nPA13:JTMS置于上拉模式
6 N3 o$ _2 S: t+ u/ o7 G8 NPB4:JNTRST置于上拉模式* ^% n0 Y! ]4 ^/ _: u- [
% x5 o: U" J+ `+ G/ r1 @
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。% v- i  n7 [8 ~( ~: S
2 u! [% S6 J- j; @' [8 S8 E0 b
输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。; [# b9 N; p* k0 V* h. Y! B' @# ]

" f) W0 m! X" Z. [所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。$ f! e& U3 b2 G% _
; L8 [! {; V3 C4 @2 Q# ]' Y) Q6 p6 {

1 r. c0 z4 R7 g$ m6 h* m! G三、单独的位设置或位清除8 a+ \) I7 q# q* }( J+ m
当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。
) S5 J8 v: l2 W5 t; @; m2 n4 }$ D% {4 N$ R" _: W
这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。
: V" Q$ B. {' w; U5 ~( _  b1 ?$ L: o, I& [. |! ~) x4 k* I

6 L3 p7 s6 f. s! I1 Z四、外部中断/唤醒线
/ l) B. y6 v( G- w) O6 I+ l: N$ F所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
  p0 W7 Q3 x3 F. v  ~  F. w) k  L9 g* _% s! J

' P: Y) B2 g: ~! |/ |" K五、复用功能(AF)
. g: l/ C1 w3 [2 Z* W, U使用默认复用功能前必须对端口位配置寄存器编程。
( d. p1 U, A' ^$ E% z; j; F对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动3 E- e5 B* d# X8 ?7 v
对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
; i- x) o" M0 h9 R; j* y对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。. g& y2 G; j0 W, A3 o0 {
& r4 k& d8 E/ ?0 E
六、软件重新映射I/O复用功能" W+ X5 c6 f) Y1 _& N: g1 b6 @7 J
为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。: Q) }( G" u" k

/ S* D; f" J0 g6 a七、GPIO 锁定机制" [5 Q1 P: O: I7 c' `. h  k9 f
锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。
& I% W8 S3 V& }0 S5 G0 y

1 T. S" e: m) o8 W八、输入配置
, G; Q$ ~( |* ]6 m7 G- j当I/O端口配置为输入时:、
/ V; [1 @1 {+ k输出缓冲器被禁止# c  E0 g& ^9 ~9 m+ L! c' o+ g
施密特触发输入被激活
# y2 W+ R5 u( f1 [$ H根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
" n2 x- a6 q/ P/ w9 ]4 @出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器- c4 `7 |+ Z+ m7 S& Q: H  M& k! u5 l
对输入数据寄存器的读访问可得到I/O状态4 Q7 s) f' v" Z% f- t/ {
% R* w  |9 h, T$ N0 T
下图给出了I/O端口位的输入配置( P& s0 B' w8 f: F: q

" }. x0 m* X$ \3 |3 o2 q! V1 P
微信图片_20231108140946.png + S' U5 c; q: `5 k% I6 W
. w, B* G/ u. a; [
九、输出配置* _" F; F2 E  ?: ?/ `
当I/O端口被配置为输出时:  R3 C: s4 p  s% E; H
输出缓冲器被激活+ ?. o1 [! B. M' D1 B1 i+ m
开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。1 C6 k$ C/ M3 `2 _4 h
推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。2 E! o/ u9 k; Y9 H# r
施密特触发输入被激活/ i; t! M& O8 w7 D
弱上拉和下拉电阻被禁止: B7 @, z2 l6 r
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
) I% M& D/ g& E" y/ N" z9 k' R1 R6 I! A在开漏模式时,对输入数据寄存器的读访问可得到I/O状态1 @! f6 l. n* }0 k5 r9 U
在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值
, P8 y' ?8 M& S1 `0 u- F2 u1 [/ T3 l" d$ r4 _" ^$ v% L3 e& v
下图给出了I/O端口位的输出配置- G8 f+ Z3 G! V9 v1 P0 d6 ?& a

" @1 {* @9 ]( ]( C/ l+ s7 j' N
微信图片_20231108140922.png
0 k: L, B9 p( j# H) O5 d. [
2 H7 q# q( D4 T* ^* B/ J: [十、复用功能配置; Z( ?9 E4 e  @) w$ T& n  Z
当I/O端口被配置为复用功能时:
2 D% ]0 K2 j7 L( U9 G( K1 b在开漏或推挽式配置中,输出缓冲器被打开、
' ^3 f& c* v* j# n* E2 n内置外设的信号驱动输出缓冲器(复用功能输出); N( ~- T0 K6 v" @. j/ ^' e
施密特触发输入被激活2 G, m, L$ q% Z" \5 H) G
弱上拉和下拉电阻被禁止% B) S; q# q% i( Q2 @" r
在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
; I# _5 D' \; z7 x  Z1 s1 Y4 w$ l开漏模式时,读输入数据寄存器时可得到I/O口状态* u0 \! w$ l+ {  W7 t+ ?- F
在推挽模式时,读输出数据寄存器时可得到最后一次写的值
% ^$ Y: H. q! Q% e# {# l( U! V7 @& x# \5 S. {; s) j8 H& l
& q( N3 C4 f) C7 H
下图给出了复用功能配置图片* r6 T2 m' v) Y6 }5 r8 `3 f9 }' M2 [
' }* s& z& ?9 H0 R
微信图片_20231108140919.png
7 e- f0 J& x1 @/ u6 ]' R% @

- @  F- J7 a; C6 D, {十一、模拟输入配置& d+ z! B+ x: I* Z+ I2 E: _
当I/O端口被配置为模拟输入配置时:4 q7 Q3 x+ N( s. L6 k; E
输出缓冲器被禁止;; u3 _1 o4 m# n" a8 P% {0 r9 Q
禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;" G- @  }3 [. h- K7 N! ]* k
弱上拉和下拉电阻被禁止;3 B* f/ T$ _& C3 `% Q
读取输入数据寄存器时数值为’0’。
  |) B: c( B, o' u) \' _, x* Z下图示出了I/O端口位的高阻抗模拟输入配置:3 c) r  P( {" \. h

+ U) T; c: Q, ~# U# a

( Q& c: [8 q7 J% ]( W0 z转载自: 嵌入式产品侠
( O$ L+ n& V# u6 P9 k  P% m如有侵权请联系删除
% H6 I# r, S/ S8 w3 S8 ?% T- e2 `9 |+ {, K

  Z1 G4 Q+ L: X; G2 C4 O1 B6 }+ e& R! A" W
微信图片_20231108140915.png
收藏 评论0 发布时间:2023-11-8 14:10

举报

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