论坛风格切换切换到宽版
发帖 回复
返回列表  提醒:不能用迅雷等P2P下载,否则下载失败标(二级)的板块,需二级才能下载,没二级不要购买,下载不了
  • 1571阅读
  • 4回复

[技术文章]GPIO内部结构/工作原理/相关寄存器讲解 [复制链接]

上一主题 下一主题
离线shuszhao
 

性别:
帅哥
发帖
18081
金币
36758
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看楼主 倒序阅读 使用道具 0楼 发表于: 2018-03-20
STM32-GPIO工作原理及相关寄存器内容 U4XW Kwq  
@O"7@%nu  
一,STM32F103ZET6介绍
Jr!^9i2j'  
C?qRZB+W#  
BN*:*cmUl  
i'f w>-0  
cSL6V2F  
mTe3%( LD  
1. STM32实物图:  8}n< 3_  
6 Bq_<3P_  
i(~DhXz*T  
  .7Mf(1:  
BU -;P  
 2. STM32引脚分布图:
\,S |>CPQ  
]zx%"SUM  
?/|Xie  
   $J1`.Q>)4  
  STM32F103ZET6:共144个引脚,7组IO口,每组16个IO口
`v -[&  
"Enb   
SkuR~!  
7*16=112个IO口(这7组IO口分别为GPIOA,GPIOB…GPIOG) =g+}4P  
ebA95v`Vms  
Pmv@  
例如:PGIOA包含PA0,PA1,PA2…PA15,每组16个IO口 bM?gAY]mB8  
U["0B8  
TcZ.5Oe6h#  
二,IO口的基本结构和工作方式 py;p7y!gxA  
Gz&}OO  
[8T{=+k  
1. STM32F1系列 !!\}-r^y%  
UZ<K'H,q  
)j;^3LiV3  
IO口的基本结构(IO口内部电路结构)  <7P[)X_  
s{b\\$Rb  
9#9 UzKX#  
  jPSVVOG  
^E^`"  
右侧I/O引脚部分为芯片暴露在外部的引脚 _}R9!R0O  
$0$sM/%  
!E$$ FvL  
每个引脚在数据手册都有说明是否支持(识别)5V电压 5L3+KkX@  
*2 Pr1U  
W>#yXg9  
三,PGIO的8种工作方式 &tH?m;V  
QIiy\E%  
qfsPX6]  
4种输入模式   输入浮空   输入上拉   输入下拉   模拟输入 z}E_ wg  
4种输出模式   开漏输出   开漏复用功能   推挽输出   推挽复用功能 &nIu^,.  
可配置3种最大翻转速度   2MHz   10MHz   50MHz Sf S3}Tn[  
]5'$EAsuW  
四,八种工作方式讲解 ~N!HxQ  
Au,oX2$  
1,GPIO输入工作模式1-输入浮空模式  
@1CXc"IgA  
-,bnj^L  
1)外部通过IO口输入电平,外部电平通过上下拉部分(浮空模式下都关闭,既无上拉也无下拉电阻)
JP4DV=}L  
}JFTe g  
UDEGQ^)Xz|  
2)传输到施密特触发器(此时施密特触发器为打开状态) ^;EhKG  
Ef]Hpjvp  
?=&; A  
3)继续传输到输入数据寄存器IDR 6+$2rS$1V  
@HS*%N"*  
G(t:s5:  
4)CPU通过读输入数据寄存器IDR实现读取外部输入电平值 f\_RW;y|m  
N,TV?Q5l7  
CyIlv0fd}  
在输入浮空模式下可以读取外部输入电平 Gd!-fqNa'x  
'dwW~4|B  
*I 1H  
2,GPIO输入工作模式2-输入上拉模式   ~xd?y*gk;  
s#Dj>Fej  
:7K a4  
(fpz",[  
和输入浮空模式相比较,不同之处在于内部有一个上拉电阻连接到VDD(输入上拉模式下,上拉电阻开关接通,阻值约30-50K) )'kpO>_G  
;MN$.x+  
m|q,i xg  
外部输入通过上拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取 I/7!5Z*  
F CYGXtc  
2iNLm6"  
3,GPIO输入工作模式3-输入下拉模式   -$8ew+  
* BM|luYL  
Dck/Ea  
`N\ ^JAGW  
 和输入浮空模式相比较,不同之处在于内部有一个下拉电阻连接到VSS(输入下拉模式下,下拉电阻开关接通,阻值约30-50K)
P}4&J ^  
外部输入通过下拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取 [|:{qQyD  
Ze V@ X  
DvH-M3  
4,GPIO输入工作模式4-输入模拟模式  D_lRYLA+  
R&cT Md  
%"`p&aE:  
  =d8Rij-  
上拉和下拉部分均为关闭状态(AD转换-模拟量转换为数字量)
4o#]hB';ni  
施密特触发器为截止状态 k3bQ32()  
通过模拟输入通道输入到CPU B''yW{  
IO口外部电压为模拟量(电压形式非电平形式),作为模拟输入范围一般为0~3.3V r(r(&NU  
k>ErD v8  
O1v)*&NAI  
5,GPIO输出工作模式1-开漏输出模式   }<WJR Y6j  
eDpi0htm  
KSs1EmB  
&%fcGNzJQ  
|5vcT, A  
1,CPU写入位设置/清楚寄存器BSRR,映射到输出数据寄存器ODR (m3hD)!+y  
2,联通到输出控制电路(也就是ODR的电平) D|OGlP  
3,ODR电平通过输出控制电路进入N-MOS管 %gmx47  
-ODR输出1:    N-MOS截止,IO端口电平不会由ODR输出决定,而由外部上拉/下拉决定 !` 1h *}  
在输出状态下,输出的电平可以被读取,数据存入输入数据寄存器,由CPU读取,实现CPU读取输出电平 d>f;N+O%  
所以,当N-MOS截止时,如果读取到输出电平为1,不一定是我们输出的1,有可能是外部上拉产生的1 xVPSL#>  
-ODR输出0:    N-MOS开启,IO端口电平被N-MOS管拉倒VSS,使IO输出低电平 xCZ_x$bk  
此时输出的低电平同样可以被CPU读取到 lfAy$qP"}  
<.)=CK  
SNqSp.>-U"  
6,GPIO输出工作模式2-开漏复用输出模式  Ubu&$4a  
Z8=?Hu  
kZF]BPh.  
  CzV;{[?~;  
与开漏输出模式唯一的区别在于输出控制电路之前电平的来源
Qm[((6}  
开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的 p&Qb&nWk<  
开漏推挽输出模式的输出电平是由复用功能外设输出决定的 Kyh6QA^  
其他与开漏输出模式相似: w9Yx2  
控制电路输出为1:N-MOS截止,IO口电平由外部上拉/下拉决定 Ij(dgY  
控制电路输出为0:N-MOS开启,IO口输出低电平 `p\%ha!,w  
l-w4E"n3  
E6GubU  
7,GPIO输出工作模式3-推挽输出模式   ZSNbf|ldiE  
b=Nsz$[  
CRo'r/G  
).kU7;0  
9we];RYK  
与开漏输出相比较: -=lm`X<:  
输出控制寄存器部分相同 W $D 34(  
输出驱动器部分加入了P-MOS管部分 B <s+I#  
当输出控制电路输出1时:    P-MOS管导通N-MOS管截止,被上拉到高电平,IO口输出为高电平1 KJFQ)#SW!  
当输出控制电路输出0时:    P-MOS管截止N-MOS管导通,被下拉到低电平,IO口输出为低电平0 gp9O%g3'  
同时IO口输出的电平可以通过输入电路读取 DAq H  
q-t%spkl  
lSR\wz*Fk  
8,GPIO输出工作模式4-复用推挽输出模式  d*+}_EV)Y3  
^U~Er'mT  
MLr L"I"  
  v Z10Rb8  
与推挽输出模式唯一的区别在于输出控制电路之前电平的来源 J.rS@Z`~7  
开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的 ^(&2  
开漏推挽输出模式的输出电平是由复用功能外设输出决定的 W4 q9pHQ  
cPIyD?c  
GYw/KT~$  
9,推挽输出和开漏输出的区别: eQQVfEvS  
IRM jL.q  
ybJa:  
推挽输出:    可以输出强高/强低电平,可以连接数字器件 "|i1A R:I  
开漏输出:    只能输出强低电平(高电平需要依靠外部上拉电子拉高),适合做电流型驱动,吸收电流能力较强(20ma之内) Rb<| <D+  
M}jl \{  
|g7)A?2J~  
五,STM32-IO口相关寄存器 5M\0t\uEn  
QqL?? p-S>  
"Io-%S u+  
每组GPIO包含系列7个寄存器(7组GPIO共包含7*7=49个寄存器) 2;]tItd1  
blz#M #  
IF>v -Z  
两个32位配置寄存器  GPIOx_CRL     低16位  GPIOx_CRH     高16位 rREev  
两个32位数据寄存器  GPIOx_IDR     输入数据寄存器  GPIOx_ODR   输出数据寄存器 Uj 3{c  
一个32位置位/复位寄存器  GPIOx_BSRR I-.? qcy~  
一个16位复位寄存器  GPIOx_BRR 一个32位锁定寄存器  GPIOx_LCKR .aZB?M W  
/_fZ2$/  
$_ $%L0)5  
六,STM32-IO口相关寄存器讲解 WV}pE~  
RW>F %P  
PmId #2f  
1,端口配置寄存器: O'S xTwO  
STM32每组GPIO位16个IO口,每4位控制一个IO口,所以32位控制8个IO口 i_6wD  
分为低16位:GPIOx_CRL和高16位:GPIOx_CRH共32位控制一组GPIO的16个IO口   Z[+Qf3j}o6  
FlS)m`  
@TKQ_7BcB  
hQSJt[8My  
如图:以端口配置寄存器低16位为例,每四位控制一个IO口(高16位同理)
TuMZHB7h;  
MODEx的2位 : 配置IO口输出/输出模式(1种输出+3种不同速度的输出模式) kH=~2rwm  
CNFx的2位 : 配置IO口输入/输出状态下(由MODEx控制)的输入/输出模式
  
以GPIOA_CRL为例,配置IO口PA0 -> MODE0=00(输入模式) CNF0=10(上拉/下拉输入模式) P\c0Q;){h"  
  此种配置下到底是上拉还是下拉输入模式还需由ODR寄存器决定 nkkGJV!  
   kGq<Zmy|  
  关于上拉/下拉的控制我们将在下面-数据寄存器-中介绍ODR输出寄存器时详细说明 2,数据寄存器(以输入数据寄存器GPIOx_IDR为例)  每一组IO口都具有一个GPIOx_IDR的32位寄存器(实际只使用低16位,高16位保留),即16位控制16个IO口,每一位控制一个   _}Gs9sHr0K  
  如图:IDR寄存器共32位,0~15位代表一组IO口16个IO当前值  这里我们已经了解了输入/输出数据寄存器,现在说下上面提到的问题:
QqY42hR  
HV3wUEI3  
e ]>{?Z  
当IO口配置为输入模式且配置为上拉/下拉输入模式(即MODEx=00 CNFx=10时),ODR决定到底是上拉还是下拉 '.&,.E&{$  
1)当输出模式时,ODR为输出数据寄存器 F7x< V=4{  
2)当输入模式时,ODR用作区分当前位输入模式到底是上拉输入(ODRx=0)还是下拉输入(ODRx=1) s|!b: Ms`  
3,端口位设置/清除寄存器(GPIOx_BSRR)   uuh vd h=  
;LT#/t)}<  
of<>M4/g4y  
N~arxe (K  
6a`_i  
BSRR寄存器作用: FHH2  
BSRR寄存器为32位寄存器,低16位BSx为设置为(1设置0不变),高16位BRx为重置位(1:清除0:不变) `|JQ)!Agx  
当然,最终的目的还是通过BSRR间接设置ODR寄存器,改变IO口电平 P3XP=G`E  
`V ++})5v  
Z42v@?R.!W  
4,端口位清除寄存器(GPIOx_BRR)   d>4e9M "  
>BQF<  
  GPIOx_BRR寄存器作用同GPIOx_BSRR寄存器高16位
Ah2XwFg?  
一般我们使用BSRR低16位和BRR的低16位(STM32F4系列取消了BSRR的高16位) Ip0@Q}^  
.J\U|r  
f4T-=` SO  
5,锁存寄存器:使用较少暂不分析七,端口的复用和重映射 a( {`<F  
J>Rt2K  
*t|j+*c}  
1,端口的复用:大部分IO口可复用为外部功能引脚,参考芯片数据手册(IO口复用和重映射)   +XRv iHA`  
CM's6qhQnn  
k0D&F;a%  
XY QUU0R  
R QO{fC  
例如:STM32F103ZET6的PA9和PA10引脚可复用为串口发送和接收功能引脚,也可复用为定时器1的通道2和通道3 Y.*lO  
qaGIU`}:$A  
.r*b+rc;]  
端口复用的作用:最大限度的利用端口资源 +#H8d1^5  
$kz5)vj "  
ptq{$Y{_  
2,端口的重映射:   }w]xC  
qK1V!a2  
S@"=,Xj M  
!<6wrOMaO  
E:E &Wv?r  
串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7 QBn>@jq  
端口重映射的作用:方便布线 _0j}(Q>|H#  
Sf'5/9<DW+  
tB3CX\e  
3,STM32所有的IO口都可作为中断输入(51单片机只有2个端口可以作为外部中断输入)


评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

一般

差劲
离线wangy2000

性别:
人妖
发帖
6747
金币
283
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 1楼 发表于: 2018-03-21
很详细,清晰,谢谢 ,楼主辛苦。


离线kenxjy

性别:
帅哥
发帖
2304
金币
2158
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 2楼 发表于: 2018-03-21


离线ghyfb

性别:
人妖
发帖
1100
金币
1545
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 3楼 发表于: 2018-03-21



性别:
帅哥
发帖
54
金币
23
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 4楼 发表于: 2021-09-19


快速回复
限150 字节
 
上一个 下一个