STM32F103RCT6一共有4组IO口,一共有16*3+3=51个IO口
GPIOA0~A15
GPIOB0~B15
GPIOC0~C15
GPIOD0~D2
每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
STM32 的 IO 口可以由软件配置成如下 8 种模式:
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、推挽式复用功能
8、开漏复用功能
每个 IO 口可以自由编程,但 IO 口寄存器必须要按 32 位字被访问。(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。
VCC:C=circuit 表示电路的意思, 即接入电路的电压;
VDD:D=device 表示器件的意思, 即器件内部的工作电压;
VSS:S=series 表示公共连接的意思,通常指电路公共接地端电压。
对于数字电路来说,VCC是电路的供电电压,VDD是芯片的工作电压(通常Vcc>Vdd),VSS是接地点。例如,对于ARM单片机来说,其供电电压VCC一般为5V,一般经过稳压模块将其转换为单片机工作电压VDD = 3.3V。
TTL肖特基触发器:将模拟信号转化为数字信号,这里有一个阈值电压的概念,比如从低到高达到多少才会导通,从高到底多少才会关闭。
二、GPIO工作方式(重要)
4种输入模式:
输入浮空
输入上拉
输入下拉
模拟输入
4种输出模式:
开漏输出
开漏复用功能
推挽式输出
推挽式复用功能
3种最大翻转速度:
-2MHZ
-10MHz
-50MHz
①输入浮空模式(GPIO_Mode_IN_FLOATING)
输入浮空的时候走的是黄色的部分,顺序为①——④。再输入浮空的时候上拉和下拉的两个开关(即②和①之间的开关)是断开的,输入电平从①处输入进去,经过施密特触发器(这时施密特触发器是打开的),电平直接传到输入数据寄存器,然后CPU就可以通过读取输入数据寄存器得到外部输入电平的值。即在输入浮空模式下,我们可以读取外部的电平。
输入浮空一般多用于外部按键输入,在浮空输入状态下,IO状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。
②输入上拉(GPIO_Mode_IPU)
输入上拉和输入浮空的区别就是上拉电阻(30-50K)是接通的。
CPU通过读取输入数据寄存器的值来得到输入高低电平的值。
上拉电阻的目的是为了保证在无信号输入时输入端的电平为高电平,而在信号输入为低电平时输入端的电平应该也为低电平。如果没有上拉电阻,在没有外界输入的情况下输入端是悬空的,它的电平是未知的无法保证的,上拉电阻就是为了保证无信号输入时输入端的电平为高电平。
③输入下拉(GPIO_Mode_IPD)
输入下拉就是下拉电阻是接通的。
下拉电阻就是为了保证无信号输入时输入端的电平为低电平。
④模拟输入(GPIO_Mode_AIN)
将外部的模拟量转换成数字量。外部的输入是模拟的,将其转换成数字量。 作为模拟输入一般是0-3.3v。
应用于ADC模拟输入,或者低功耗下省电。
⑤开漏输出(GPIO_Mode_Out_OD)
MOS管部分可看作如下电路:
开漏输出模式下,CPU可以写寄存器(位设置/清除寄存器),比如写1,最终会被映射到输出数据寄存器,输出数据寄存器连通的是输出控制电路,如果我们的输出是1,N-MOS管就处于关闭状态(P-MOS从不被激活),这时IO端口的电平就不会由我们输出的1来决定,因为N-MOS管已经截止了,所以IO口的电平是由外部的上拉或下拉决定。在输出模式下,输出的电平也可以通过输入电路读取到输入数据寄存器,然后被CPU读取。
所以,当我们输出1时,我们读取的输出电平可能不是我们输出的1,读取的值是由外部的上拉或下拉决定的。当我们的输出是0,这时N-MOS管处于开启状态,IO口的电平就会被N-MOS管拉到Vss,这时IO口的电平输出就为0,CPU通过输入电路读取IO口的电平也就为0。
输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般 20mA以内)。
开漏形式的电路有以下几个特点:
①利用外部电路的驱动能力,减少 IC (集成电路)内部的驱动。当 IC 内部 MOSFET(金属-氧化物半导体场效应晶体管,简称金氧半场效晶体管,可分为“N型”与“P型”,通常又称为NMOSFET与PMOSFET,其他简称尚包括NMOS、PMOS) 导通时,驱动电流是从外部的VCC 流经 R pull-up(上拉电阻) ,MOSFET 到 GND。IC 内部仅需很下的栅极驱动电流。
②一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻。
③开漏输出提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。
⑥复用开漏输出(GPIO_Mode_AF_OD)
复用开漏输出和开漏输出的区别就是输出1和0的来源不同,开漏输出是由CPU写入的,映射到输出数据寄存器连通到输出电路,而复用开漏输出是由复用功能输出决定的,即来自片上的外设,其他的地方都一样。
复用开漏输出、复用推挽输出可以理解为GPIO口被用作第二功能时的配置情况(比如串口USART),即并非作为通用IO口。
推挽输出控制输出的寄存器和开漏输出是一样的,当输出为1,这时P-MOS管被导通,N-MOS管截止,输出的1就被传输到IO端口,当输出为0,P-MOS管截止,N-MOS管导通,输出的0就被传输到IO口。同样,我们也可以通过输入电路读取IO口的输出。
推挽输出:可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由 IC 的电源低定。
推挽电路是两个参数相同的三极管或 MOSFET, 以推挽方式存在于电路中, 各负责正负半周的波形放大任务, 电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
⑧复用推挽输出(GPIO_Mode_AF_PP)
复用推挽输出和推挽输出的区别也输出1和0的来源不同,其它的地方都一样。
复用开漏输出、复用推挽输出可以理解为GPIO口被用作第二功能时的配置情况(比如说串口),即并非作为通用IO口。
上电复位后,GPIO默认为浮空状态,部分特殊功能引脚为特定状态。
复位后,JTAG引脚被置于输入上拉或下拉模式:
─ PA15:JTDI置于上拉模式
─ PA14:JTCK置于下拉模式
─ PA13:JTMS置于上拉模式
─ PB4: JNTRST置于上拉模式
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。