一、GPIO基本结构和工作方式
1)I/O端口位的基本结构如下图所示:
2)GPIO的工作方式:
四种输入模式:
- 输入浮空模式,经过下图所示①、②、③、④通道,同时Vdd 和 Vss 所接的开关是断开的。
- 输入上拉,与输入浮空的区别就是上拉电阻的开关闭合了。
- 输入下拉,与浮空输入的区别就是下拉电阻的开关闭合了。
- 模拟输入,此处一般用外部的模拟量通过I/O端口输入,这里是以电压的形式输入,而不是电平的形式。通过模拟输入转化为数字量进入单片机
四种输出模式:
- 开漏输出,输出控制电路之前来自于输出数据寄存器,NMOS的漏级直接接到IO口作为输出引脚。
- 开漏复用功能,输出控制电路的输入来自于片上的外设模块。
- 推挽输出
- 推挽式复用功能
推挽输出:
可以输出强高低电平,连接数字器件。
开漏输出:
只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。
三种最大翻转速度:
- 2MHz
- 10MHz
- 50MHz
二、GPIO寄存器说明
每组GPIO端口的寄存器包括:
-
两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),用来配置上面所提到的8种输入 / 输出模式和三种翻转速度。(一个IO口占四位)
IO的端口位配置表如下图所示:
由上图可以看出,当我们给CRL寄存器配置为输入,上拉 / 下拉模式的时候,我们脑子里想到的是,具体到底配置的是输入上拉还是输入下拉呢,这里需要注意的是,在输入模式下,GPIOx_ODR寄存器用来配置输入模式下的上拉还是下拉,写0配置为输入下拉,写1配置为输入上拉。当IO作为输出模式下的时候,GPIOx_ODR就作为输出数据寄存器来输出高电平或低电平。 -
两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)
-
一个32位置位/复位寄存器(GPIOx_BSRR),这里需要注意的是这个寄存器与输出数据寄存器的区别,以开漏输出模式为例:
上图①处,我们在CPU写寄存器的时候,先写位设置 / 清除寄存器,通过它来间接控制设置输出数据寄存器的目的,当然可以看到输出数据寄存器也能直接被读 / 写。所以先写位设置 / 清除寄存器,通过它来间接控制设置输出数据寄存器只是其中一种方式,但是这种方式有一个好处,就是这里如果需要设置PA0为高电平,只需要设置GPIOA_BSRR的第0位为1,其他位都设置为0就行。其它位的电平写0,是不影响ODR的输出的。
但是对于直接设置ODR寄存器的话,你对ODR寄存器的每一位设置的是什么,这个引脚实际输出的就是什么电平。这里设置BSRR间接控制ODR寄存器与直接写ODR寄存器相比的好处是,如在实时操作系统里,时常要先把ODR寄存器的值读进来,去分析他,再去写ODR寄存器输出,为的是不影响ODR寄存器的其他位被改变。
对于GPIOx_BSRR的16-31位用来设置引脚输出为低电平,GPIOx_BSRR的0-15位用来设置引脚输出为高电平,高位和低位的作用是相反的。 -
一个16位复位寄存器(GPIOx_BRR)
-
一个32位锁定寄存器(GPIOx_LCKR)
三、STM32F10x GPIO引脚说明
1)端口复用功能
- STM32的大部分端口都具有复用功能,所谓复用就是一些端口不仅仅可以作为通用的IO口,还可以复用为一些外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚。
2)端口重映射
- 就是可以把某些功能引脚映射到其他引脚,比如串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7,重映射的作用一般是为了方便布线。