|
STM32-GPIO工作原理及相关寄存器内容 iR!]&Oh 4wN5 x[vp 一,STM32F103ZET6介绍 ~>H,~</` D/VEl{ba- s f.z(o MH|F<$42 [1Aoj| !rF1Remw 1. STM32实物图: &ty-aB=F EOZ 6F-': id9 XwWV ULhXyItL 1G6 \}El95 2. STM32引脚分布图: jz~#K;3=, ,c-*/{3 A0Q`Aqs >& 4) : STM32F103ZET6:共144个引脚,7组IO口,每组16个IO口
LJ;&02w@ %JH/|mA&| !x:{" 7*16=112个IO口(这7组IO口分别为GPIOA,GPIOB…GPIOG) !C|Z+w9Y DgK*>A %#o@ c 例如:PGIOA包含PA0,PA1,PA2…PA15,每组16个IO口 ]imVIu vcCNxIzEG $)nPj_h 二,IO口的基本结构和工作方式 C4qK52'2s omGzyuPF =1k%T {> 1. STM32F1系列 5rf Dm Q@W!6]*\
KxD/{0F IO口的基本结构(IO口内部电路结构) ~]#-S20 f _$hK9I |h%HUau tSux5yV # S/n3 右侧I/O引脚部分为芯片暴露在外部的引脚 :?j=MV YXZP-=fB>i +$#<gp" 每个引脚在数据手册都有说明是否支持(识别)5V电压 NMfHrYHbh J<0d"' A'rd1"K 三,PGIO的8种工作方式 H3*]}= z5oJQPPi $U.| 4种输入模式 输入浮空 输入上拉 输入下拉 模拟输入 S~ Z<-@S 4种输出模式 开漏输出 开漏复用功能 推挽输出 推挽复用功能 /t`,7y3T 可配置3种最大翻转速度 2MHz 10MHz 50MHz 1pg#@h[|t |/H?\]7 四,八种工作方式讲解 gOe!GnO S[2?,C<2= 1,GPIO输入工作模式1-输入浮空模式 qjh k#\y *r[V[9+y-D 1)外部通过IO口输入电平,外部电平通过上下拉部分(浮空模式下都关闭,既无上拉也无下拉电阻) gKl9Nkd!R =+K?@;? ,`RX~ H=C 2)传输到施密特触发器(此时施密特触发器为打开状态) cD6 ^7QF j{r@>g;3 .)$MZyo 3)继续传输到输入数据寄存器IDR pDYJLh-C }eW<P079 54Rp0otv 4)CPU通过读输入数据寄存器IDR实现读取外部输入电平值 +v
3:\# wggB^ }~ >qOG^{&x 在输入浮空模式下可以读取外部输入电平 Axns #) :.1Z? .{c7 I!8 2,GPIO输入工作模式2-输入上拉模式 W90!*1 qzJ<9H w&p(/y UO&$1rV 和输入浮空模式相比较,不同之处在于内部有一个上拉电阻连接到VDD(输入上拉模式下,上拉电阻开关接通,阻值约30-50K) tuIZYp8tIN J,) ytw] ]vB\yQE 外部输入通过上拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取 Li}5aK BCe'J! "FA.T7G 3,GPIO输入工作模式3-输入下拉模式 |u?VlRt G 3,v'D5 _qf39fM;\ ZSK_Lux> 和输入浮空模式相比较,不同之处在于内部有一个下拉电阻连接到VSS(输入下拉模式下,下拉电阻开关接通,阻值约30-50K) d8vf
kVB 外部输入通过下拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取 mi<Q3;m "r_wgl% 0&|0l>wy. 4,GPIO输入工作模式4-输入模拟模式 3p&T?E% 0y,w\'j WYTqQqQk x1#>"z7 上拉和下拉部分均为关闭状态(AD转换-模拟量转换为数字量) Uzzm2OS` 施密特触发器为截止状态 tF}^ 通过模拟输入通道输入到CPU :K]7(y7> IO口外部电压为模拟量(电压形式非电平形式),作为模拟输入范围一般为0~3.3V z8ZQL.z%h j;y~vX b lTqlQ<`V 5,GPIO输出工作模式1-开漏输出模式 1J"9Y81 ^@AyC"K lP`BKc, B8T$< ; $80}TY ' 1,CPU写入位设置/清楚寄存器BSRR,映射到输出数据寄存器ODR =?.oH|&\h 2,联通到输出控制电路(也就是ODR的电平) NT*r7_e 3,ODR电平通过输出控制电路进入N-MOS管 9;U?_ -ODR输出1: N-MOS截止,IO端口电平不会由ODR输出决定,而由外部上拉/下拉决定 ]5S`y{j1 在输出状态下,输出的电平可以被读取,数据存入输入数据寄存器,由CPU读取,实现CPU读取输出电平 aim\3y~ 所以,当N-MOS截止时,如果读取到输出电平为1,不一定是我们输出的1,有可能是外部上拉产生的1 &Q~W{. -ODR输出0: N-MOS开启,IO端口电平被N-MOS管拉倒VSS,使IO输出低电平 k*fU:q1
此时输出的低电平同样可以被CPU读取到 WM
?a1j Icrnu}pl_ 4)8VmCW 6,GPIO输出工作模式2-开漏复用输出模式 %r(WS_%K| kaekH*m~ i>YQ<A1 tj@(0}pi4 与开漏输出模式唯一的区别在于输出控制电路之前电平的来源 0dC5
-/+ 开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的 YP_L~zZ 开漏推挽输出模式的输出电平是由复用功能外设输出决定的 PmE)FthdP( 其他与开漏输出模式相似: vlbZ5 控制电路输出为1:N-MOS截止,IO口电平由外部上拉/下拉决定 )/::i
O&$: 控制电路输出为0:N-MOS开启,IO口输出低电平 `2s@O>RV ]q%r2 (y,k (4L/I 7,GPIO输出工作模式3-推挽输出模式 Y)X7*iTi'j Q!1 ;xw~ }<A.zwB<i 0Xh_.PF ,O5X80'.g 与开漏输出相比较: *pJGp:{6V? 输出控制寄存器部分相同 w7U]-MW6A* 输出驱动器部分加入了P-MOS管部分 ja_8n["z 当输出控制电路输出1时: P-MOS管导通N-MOS管截止,被上拉到高电平,IO口输出为高电平1 XJ4f;U 当输出控制电路输出0时: P-MOS管截止N-MOS管导通,被下拉到低电平,IO口输出为低电平0 $gBQ5Wd 同时IO口输出的电平可以通过输入电路读取 S"Cz.
bv QE(.w
dHP eTx9fxw 8,GPIO输出工作模式4-复用推挽输出模式 M@A3+v%K JkAM:,^( .Az36wD U8Y%rFh1 与推挽输出模式唯一的区别在于输出控制电路之前电平的来源 yQ[;y~W 开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的 46 A sD 开漏推挽输出模式的输出电平是由复用功能外设输出决定的 R#d~a;j
l!|c_ `uMEK>b 9,推挽输出和开漏输出的区别: /e '3\,2_ ^Q s}2% /88s~= 推挽输出: 可以输出强高/强低电平,可以连接数字器件 n(F!t,S1i 开漏输出: 只能输出强低电平(高电平需要依靠外部上拉电子拉高),适合做电流型驱动,吸收电流能力较强(20ma之内) Q*smH-Sw !uEEuD# X,|8Wpi= 五,STM32-IO口相关寄存器 lnZ{Ryo( LlQsc{Ddf QO'Hyf t 每组GPIO包含系列7个寄存器(7组GPIO共包含7*7=49个寄存器) i?6&4 ,&t+D-s<f i<Vc~!pT 两个32位配置寄存器 GPIOx_CRL 低16位 GPIOx_CRH 高16位 *DF3juf~ 两个32位数据寄存器 GPIOx_IDR 输入数据寄存器 GPIOx_ODR 输出数据寄存器 YP2VSK2Q 一个32位置位/复位寄存器 GPIOx_BSRR EjR(AqZY 一个16位复位寄存器 GPIOx_BRR 一个32位锁定寄存器 GPIOx_LCKR Nn. 9J FQ<-Wc D|LO!,=b 六,STM32-IO口相关寄存器讲解 >
{*cW ~R!1{8HP DK4yAR,g 1,端口配置寄存器: 3B&A)&pEO STM32每组GPIO位16个IO口,每4位控制一个IO口,所以32位控制8个IO口 F(G..XJQ 分为低16位:GPIOx_CRL和高16位:GPIOx_CRH共32位控制一组GPIO的16个IO口 &uNec(c 7*5B /Y7^!3uM Ma^jy. 如图:以端口配置寄存器低16位为例,每四位控制一个IO口(高16位同理) xE1?) MODEx的2位 : 配置IO口输出/输出模式(1种输出+3种不同速度的输出模式) 7OV^>"S CNFx的2位 : 配置IO口输入/输出状态下(由MODEx控制)的输入/输出模式 以GPIOA_CRL为例,配置IO口PA0 -> MODE0=00(输入模式) CNF0=10(上拉/下拉输入模式) tDK@?PfKz 此种配置下到底是上拉还是下拉输入模式还需由ODR寄存器决定 v ccH(T
')uYI;h9 关于上拉/下拉的控制我们将在下面-数据寄存器-中介绍ODR输出寄存器时详细说明 2,数据寄存器(以输入数据寄存器GPIOx_IDR为例) 每一组IO口都具有一个GPIOx_IDR的32位寄存器(实际只使用低16位,高16位保留),即16位控制16个IO口,每一位控制一个 TjW!-s?S 如图:IDR寄存器共32位,0~15位代表一组IO口16个IO当前值 这里我们已经了解了输入/输出数据寄存器,现在说下上面提到的问题: uwNJM \<LCp;- K fzSkl`K} 当IO口配置为输入模式且配置为上拉/下拉输入模式(即MODEx=00 CNFx=10时),ODR决定到底是上拉还是下拉 /G||_Hc 1)当输出模式时,ODR为输出数据寄存器 -/Q5?0z 2)当输入模式时,ODR用作区分当前位输入模式到底是上拉输入(ODRx=0)还是下拉输入(ODRx=1) D#g-mqar: 3,端口位设置/清除寄存器(GPIOx_BSRR) 6>vR5pn :R;w<Tbz" 8?yIixhw 7H6Ts8^S -c`xeuzK' BSRR寄存器作用: *[Hp&6f BSRR寄存器为32位寄存器,低16位BSx为设置为(1设置0不变),高16位BRx为重置位(1:清除0:不变) n1-p/a. 当然,最终的目的还是通过BSRR间接设置ODR寄存器,改变IO口电平 @ st>#]i4 t;8)M$
p h,{m{Xh 4,端口位清除寄存器(GPIOx_BRR) 1WUSp;JMl W{6QvQD8 GPIOx_BRR寄存器作用同GPIOx_BSRR寄存器高16位 MP%#)O6 一般我们使用BSRR低16位和BRR的低16位(STM32F4系列取消了BSRR的高16位) ng1E'c]0@ B>2=IZ x93@[B*% 5,锁存寄存器:使用较少暂不分析七,端口的复用和重映射 VI!
\+A 3lUVDNbZ ?%O>]s 1,端口的复用:大部分IO口可复用为外部功能引脚,参考芯片数据手册(IO口复用和重映射) +:KZEFY?< T^A(v(^D s9?mX@>h LO`0^r =E-x0sr? 例如:STM32F103ZET6的PA9和PA10引脚可复用为串口发送和接收功能引脚,也可复用为定时器1的通道2和通道3 529;_| (XZ[-M7 e{)giJY9 端口复用的作用:最大限度的利用端口资源 1c$pz:$vX $fb%?n{ !wYN",R- 2,端口的重映射: ,ri&zbB ^twyy9VR 9ihg[k ql?w6qFs] <a R 串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7 bmT%?it 端口重映射的作用:方便布线 (j8*F Bq Kzev] er _H| )g*]t 3,STM32所有的IO口都可作为中断输入(51单片机只有2个端口可以作为外部中断输入)
|