|
STM32-GPIO工作原理及相关寄存器内容 9C$b^wHd E*7B5 一,STM32F103ZET6介绍 w]UYD;f p(%7|' <m`HK.|~ 9]VUQl9gh FsY}mql R(=Lhz6R4 1. STM32实物图: #DwTm~V0" B=7bQli} `z-4OJ8~ %z J)mOu f3|ttUX 2. STM32引脚分布图: kW4/0PD N/TUcG|m\ @YMef`T: d%81}4f: STM32F103ZET6:共144个引脚,7组IO口,每组16个IO口 .Frc:Y{ h5U@Ys m-dne/%_ 7*16=112个IO口(这7组IO口分别为GPIOA,GPIOB…GPIOG) 234OJ? 3@J0-w ?zQ\u{]= 例如:PGIOA包含PA0,PA1,PA2…PA15,每组16个IO口 o
<0 f X7?p$!M6;B K\nN2y 二,IO口的基本结构和工作方式 4g b2$" ! \ZigG{ VThcG(
NF 1. STM32F1系列 1<fS&)^W =;7gxV3; n%"q> IO口的基本结构(IO口内部电路结构) d `>M-:dF 75r>~@)* 'LpJ:Th dd@^e)VZB 1% ]|O 右侧I/O引脚部分为芯片暴露在外部的引脚 U>IllNd
mFjX a57Y9.H`o 每个引脚在数据手册都有说明是否支持(识别)5V电压 U,LW(wueT <h4"^9hL 1Zx|SBF 三,PGIO的8种工作方式 XpdDIKMmE z~L''X7g sD7Qt 4种输入模式 输入浮空 输入上拉 输入下拉 模拟输入 T(MS,AyD] 4种输出模式 开漏输出 开漏复用功能 推挽输出 推挽复用功能 {2vk< 可配置3种最大翻转速度 2MHz 10MHz 50MHz gYA|JFi am{f<v,EI 四,八种工作方式讲解 OKNA36cU' c$rkbbf~V 1,GPIO输入工作模式1-输入浮空模式 S 3Tp__ UQ:H3 1)外部通过IO口输入电平,外部电平通过上下拉部分(浮空模式下都关闭,既无上拉也无下拉电阻) 8;ke,x KoRJ'WW^ Yc3\NqQM 2)传输到施密特触发器(此时施密特触发器为打开状态) a*$to/^r 7*^-3Tt83 x9Fga _ 3)继续传输到输入数据寄存器IDR _7'9omq@ n .ZLR=P4 ];Z)=y,vM 4)CPU通过读输入数据寄存器IDR实现读取外部输入电平值 Tz4,lwuWX7 = I,O+^ !Y>lAx d 在输入浮空模式下可以读取外部输入电平 +>/ariRr .+MJ' bW |!E>I 2,GPIO输入工作模式2-输入上拉模式 CL.JalR`b mEfI2P)#| lqn7$ DZ92;m 和输入浮空模式相比较,不同之处在于内部有一个上拉电阻连接到VDD(输入上拉模式下,上拉电阻开关接通,阻值约30-50K) G#gUd'=M `E+)e?z FRd!UqMXY 外部输入通过上拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取 T6h-E^Z '9c`[^ NUbw]Y90~ 3,GPIO输入工作模式3-输入下拉模式 )Fx"S.Ok LSQWveZz C,~wmS )@ ,yus44w[ 和输入浮空模式相比较,不同之处在于内部有一个下拉电阻连接到VSS(输入下拉模式下,下拉电阻开关接通,阻值约30-50K) zI$^yk-vn 外部输入通过下拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取 eQu%TZ(x-$ N-`Vb0;N dE19_KPm[j 4,GPIO输入工作模式4-输入模拟模式 k4fc5P :,gnOfV= ("Z;)s4q 'kb5pl~U 上拉和下拉部分均为关闭状态(AD转换-模拟量转换为数字量) ;*1bTdB5a 施密特触发器为截止状态 G6(kwv4 通过模拟输入通道输入到CPU 'N^\9X0 IO口外部电压为模拟量(电压形式非电平形式),作为模拟输入范围一般为0~3.3V ^`~M f >}Qj|05G }P(RGKQZ" 5,GPIO输出工作模式1-开漏输出模式 3[I; 3=O :f%FM&b (XA=d
4 <k?ofE1o K~ ,|~ 1,CPU写入位设置/清楚寄存器BSRR,映射到输出数据寄存器ODR j[l6&eX 2,联通到输出控制电路(也就是ODR的电平) f2Zi.?``H 3,ODR电平通过输出控制电路进入N-MOS管 `q|&;wP. -ODR输出1: N-MOS截止,IO端口电平不会由ODR输出决定,而由外部上拉/下拉决定 xxkUu6x# 在输出状态下,输出的电平可以被读取,数据存入输入数据寄存器,由CPU读取,实现CPU读取输出电平 Wt5x*p-!C 所以,当N-MOS截止时,如果读取到输出电平为1,不一定是我们输出的1,有可能是外部上拉产生的1 U"$Q$ OFs -ODR输出0: N-MOS开启,IO端口电平被N-MOS管拉倒VSS,使IO输出低电平 nX4R 此时输出的低电平同样可以被CPU读取到 DTmv2X JwCv(1$GM {6{y"8 6,GPIO输出工作模式2-开漏复用输出模式 D^Ahw"X) \Zc$X^}vN F x,08 io:g]g 与开漏输出模式唯一的区别在于输出控制电路之前电平的来源 7jvy]5y8&~ 开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的 N<lejZ}!q 开漏推挽输出模式的输出电平是由复用功能外设输出决定的 dv=y,q@W 其他与开漏输出模式相似: j,%@%upM 控制电路输出为1:N-MOS截止,IO口电平由外部上拉/下拉决定
)Y%>t 控制电路输出为0:N-MOS开启,IO口输出低电平 ^kZfE"iE2 (t&]u7Atr =|>CB 7,GPIO输出工作模式3-推挽输出模式 :$k':0 n @(>XSTh9
aEUC s2f95<B b`"E(S / 与开漏输出相比较: Q#C;4)e 输出控制寄存器部分相同 272j$T 输出驱动器部分加入了P-MOS管部分 kk]f*[Zi5 当输出控制电路输出1时: P-MOS管导通N-MOS管截止,被上拉到高电平,IO口输出为高电平1 nk.Y#+1) 当输出控制电路输出0时: P-MOS管截止N-MOS管导通,被下拉到低电平,IO口输出为低电平0 z ogtIn) 同时IO口输出的电平可以通过输入电路读取 1'ne[@i^/ i`[5%6\"& C!Cg.^; 8,GPIO输出工作模式4-复用推挽输出模式 E)==!T@E GC?X>AC: [ZwZGAP OLXkiesK{ 与推挽输出模式唯一的区别在于输出控制电路之前电平的来源 &8'.Gwm} 开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的 V]b1cDx{ 开漏推挽输出模式的输出电平是由复用功能外设输出决定的 yXU-@~ NGYliP,.6 ,w~0U 9,推挽输出和开漏输出的区别: Bvzu{B% '[#a-8-JY_ .G[y^w)w} 推挽输出: 可以输出强高/强低电平,可以连接数字器件 :}d`$2Dz 开漏输出: 只能输出强低电平(高电平需要依靠外部上拉电子拉高),适合做电流型驱动,吸收电流能力较强(20ma之内) y*2R#jTA z0J$9hEg89 6BIP;, M= 五,STM32-IO口相关寄存器 d,=Kv 0_yE74i 8
v NgePn 每组GPIO包含系列7个寄存器(7组GPIO共包含7*7=49个寄存器) ( Lj{V}^ (]wi^dE b *IJ + 两个32位配置寄存器 GPIOx_CRL 低16位 GPIOx_CRH 高16位 i^P@? 两个32位数据寄存器 GPIOx_IDR 输入数据寄存器 GPIOx_ODR 输出数据寄存器 xsK{nM6g 一个32位置位/复位寄存器 GPIOx_BSRR * d6[kY 一个16位复位寄存器 GPIOx_BRR 一个32位锁定寄存器 GPIOx_LCKR l@`D;m MLg<YL kN uDoo]z 六,STM32-IO口相关寄存器讲解 1|Y(XB^os( 6cof Zc$ }*Qd]\fy 1,端口配置寄存器: 'Z2:u!E STM32每组GPIO位16个IO口,每4位控制一个IO口,所以32位控制8个IO口 EM/NT/ 分为低16位:GPIOx_CRL和高16位:GPIOx_CRH共32位控制一组GPIO的16个IO口 f])?Gw h}xUZ: uY0V!W ^}; 4r 如图:以端口配置寄存器低16位为例,每四位控制一个IO口(高16位同理) VlW#_. MODEx的2位 : 配置IO口输出/输出模式(1种输出+3种不同速度的输出模式) 3_=~7B)
8 CNFx的2位 : 配置IO口输入/输出状态下(由MODEx控制)的输入/输出模式 以GPIOA_CRL为例,配置IO口PA0 -> MODE0=00(输入模式) CNF0=10(上拉/下拉输入模式) ln.kEhQ3B 此种配置下到底是上拉还是下拉输入模式还需由ODR寄存器决定 GF~^-5
*Yv"lB8 关于上拉/下拉的控制我们将在下面-数据寄存器-中介绍ODR输出寄存器时详细说明 2,数据寄存器(以输入数据寄存器GPIOx_IDR为例) 每一组IO口都具有一个GPIOx_IDR的32位寄存器(实际只使用低16位,高16位保留),即16位控制16个IO口,每一位控制一个 !-
f>*|@ 如图:IDR寄存器共32位,0~15位代表一组IO口16个IO当前值 这里我们已经了解了输入/输出数据寄存器,现在说下上面提到的问题: PpMZ-f@ 8>x.zO_.c> 2=ZR}8}9Q: 当IO口配置为输入模式且配置为上拉/下拉输入模式(即MODEx=00 CNFx=10时),ODR决定到底是上拉还是下拉 q0WW^jwQ 1)当输出模式时,ODR为输出数据寄存器 hT6:7_UD 2)当输入模式时,ODR用作区分当前位输入模式到底是上拉输入(ODRx=0)还是下拉输入(ODRx=1) ZCPK{Ru QE 3,端口位设置/清除寄存器(GPIOx_BSRR) gd<8RVA }@yvw*c Hxr2Q]c?u aKs!*uo0H hTI8hh BSRR寄存器作用: BOJh-(>I BSRR寄存器为32位寄存器,低16位BSx为设置为(1设置0不变),高16位BRx为重置位(1:清除0:不变) \Ekez~k{` 当然,最终的目的还是通过BSRR间接设置ODR寄存器,改变IO口电平 :NU-C!eT
N>`+{ wo2^,Y2z+ 4,端口位清除寄存器(GPIOx_BRR) [i[G" %Q x( w <U1 GPIOx_BRR寄存器作用同GPIOx_BSRR寄存器高16位 etf ft8 一般我们使用BSRR低16位和BRR的低16位(STM32F4系列取消了BSRR的高16位) Wq)'0U;{$ %u }|4BXoh DGY#pnCu 5,锁存寄存器:使用较少暂不分析七,端口的复用和重映射 L*tXy>&b. ?>MD /l(l uZZ[`PA( 1,端口的复用:大部分IO口可复用为外部功能引脚,参考芯片数据手册(IO口复用和重映射) e<5+&Cj Bir}X Y^LFJB|b4 r0G#BPgdR F$r8hj` 例如:STM32F103ZET6的PA9和PA10引脚可复用为串口发送和接收功能引脚,也可复用为定时器1的通道2和通道3 wlqV1.K ^FgNg'"[3 ^a; V-US 端口复用的作用:最大限度的利用端口资源 + WPi} {#QFDA `Q26Dk 2,端口的重映射: UEo,:zeN[ 7 g ]]> Z.6`O1OY}? 7i{Rn K6* d!8q+FI 串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7 z+" :,# 端口重映射的作用:方便布线 W3UK[_qK M0Z>$Az]t UShn)3F 3,STM32所有的IO口都可作为中断输入(51单片机只有2个端口可以作为外部中断输入)
|