|
STM32-GPIO工作原理及相关寄存器内容 U4XW
Kwq @O"7@%nu 一,STM32F103ZET6介绍 Jr!^9i2j' C?qRZB+W# BN*:*cmUl i'fw>-0 cSL6V2F mTe3%( LD 1. STM32实物图: 8}n<3_ 6Bq_<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@ *2Pr1U W>#yXg9 三,PGIO的8种工作方式 &tH?m;V QIiy\E% qfsPX6] 4种输入模式 输入浮空 输入上拉 输入下拉 模拟输入 z}E_wg 4种输出模式 开漏输出 开漏复用功能 推挽输出 推挽复用功能 &nIu^,. 可配置3种最大翻转速度 2MHz 10MHz 50MHz SfS3}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 1 H 2,GPIO输入工作模式2-输入上拉模式 ~xd?y*gk; s#Dj>Fej :7K
a4 (fpz",[ 和输入浮空模式相比较,不同之处在于内部有一个上拉电阻连接到VDD(输入上拉模式下,上拉电阻开关接通,阻值约30-50K) )'kpO> _G ;MN$.x+ m|q,ixg 外部输入通过上拉电阻,施密特触发器存入输入数据寄存器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 ZeV@ X DvH-M3 4,GPIO输入工作模式4-输入模拟模式 D_lRYLA+ R&cTMd %"`p&aE: =d8Rij- 上拉和下拉部分均为关闭状态(AD转换-模拟量转换为数字量) 4o#]hB';ni 施密特触发器为截止状态 k3bQ32() 通过模拟输入通道输入到CPU B''yW{ IO口外部电压为模拟量(电压形式非电平形式),作为模拟输入范围一般为0~3.3V r(r(&NU k>ErDv8 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: 推挽输出: 可以输出强高/强低电平,可以连接数字器件 "|i1 AR:I 开漏输出: 只能输出强低电平(高电平需要依靠外部上拉电子拉高),适合做电流型驱动,吸收电流能力较强(20ma之内) Rb<|
<D+ M}jl\{ |g7)A?2J~ 五,STM32-IO口相关寄存器 5M\0t\uEn QqL?? p-S> "Io-%Su+ 每组GPIO包含系列7个寄存器(7组GPIO共包含7*7=49个寄存器) 2;]tIt d1 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?MW /_fZ2$/ $_
$%L0)5 六,STM32-IO口相关寄存器讲解 WV}pE~ RW>F %P PmId #2f 1,端口配置寄存器: O'SxTwO STM32每组GPIO位16个IO口,每4位控制一个IO口,所以32位控制8个IO口 i_6 wD 分为低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寄存器决定 nkk GJV!
kGq<Zmy| 关于上拉/下拉的控制我们将在下面-数据寄存器-中介绍ODR输出寄存器时详细说明 2,数据寄存器(以输入数据寄存器GPIOx_IDR为例) 每一组IO口都具有一个GPIOx_IDR的32位寄存器(实际只使用低16位,高16位保留),即16位控制16个IO口,每一位控制一个 _}Gs9sHr0K 如图:IDR寄存器共32位,0~15位代表一组IO口16个IO当前值 这里我们已经了解了输入/输出数据寄存器,现在说下上面提到的问题: QqY42hR HV3wU EI3 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) uuhvd h= ;LT#/t)}< of<>M4/g4y N~arxe(K 6a`_i BSRR寄存器作用: FH H2 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 !<6wrOMa O 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个端口可以作为外部中断输入)
|