1、,GPIO寄存器描述 一、端口配置低寄存器(GPIOx_CRL) (x=AE) 偏移地址:0x00 复位值:0x4444 4444,二、端口配置高寄存器(GPIOx_CRH) (x=AE) 偏移地址:0x04 复位值:0x4444 4444,三、端口输入数据寄存器(GPIOx_IDR) (x=AE) 地址偏移:0x08 复位值:0x0000 XXXX,端口输出数据寄存器(GPIOx_ODR) (x=AE) 地址偏移:0Ch 复位值:00000000h,端口位设置/清除寄存器(GPIOx_BSRR) (x=AE) 地址偏移:0x10 复位值:0x0000 0000,四、 端口位清除寄存器(GPI
2、Ox_BRR) (x=AE) 地址偏移:0x14 复位值:0x0000 0000,端口配置锁定寄存器(GPIOx_LCKR) (x=AE) 当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。位15:0用于锁定GPIO端口的配置。在规定的写入操作期间,不能改变LCKP15:0。当对相应的端口位执行LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。,每个锁定位锁定控制寄存器(CRL, CRH)中相应的4个位。 地址偏移:0x18 复位值:0x0000 0000,位31:17 保留。 位16 LCKK:锁键 该位可随时读出,它只可通过锁键写入序列修改。 0:端口配
3、置锁键位激活 1:端口配置锁键位被激活,下次系统复位前GPIOx_LCKR寄存器被锁住。 锁键的写入序列: 写1 - 写0 - 写1 - 读0 - 读1 最后一个读可省略,但可以用来确认锁键已被激活。 注:在操作锁键的写入序列时,不能改变LCK15:0的值。 操作锁键写入序列中的任何错误将不能激活锁键。,位15:0 LCKy: 端口x 的锁位y (y = 015) 这些位可读可写但只能在LCKK位为0时写入。 0:不锁定端口的配置 1:锁定端口的配置,一、GPIO的各种模式 GPIO管脚可以被配置为多种工作模式,其中有3种比较常用:高阻输入、推挽输出、开漏输出 1 高阻输入(Input)输入模
4、式的结构比较简单,就是一个带有施密特触发输入的三态缓冲器(U1),并具有很高的输入等效阻抗。,GPIO高阻输入模式结构示意图,施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。 执行GPIO管脚读操作时,在读脉冲(Read Pulse)的作用下会把管脚(Pin)的当前电平状态读到内部总线上(Internal Bus)。在不执行读操作时,外部管脚与内部总线之间是隔离的。,2 推挽输出(Output),U1是输出锁存器,执行GPIO管脚写操作时,在写脉冲(Write Pulse)的作用下,数据被锁存到Q和/Q。T1和T2构成CMOS反相器,T1导通或T2导通
5、时都表现出较低的阻抗,但T1和T2不会同时导通或同时关闭,最后形成的是推挽输出。在推挽输出模式下,GPIO还具有回读功能,实现回读功能的是一个简单的三态门U2。注意:执行回读功能时,读到的是管脚的输出锁存状态,而不是外部管脚Pin的状态。,3 开漏输出(OutputOD) 开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管T1而没有上拉晶体管。同样,T1实际上也是多组可编程选择的晶体管。,开漏输出结构没有内部上拉,因此在实际应用时通常都要外接合适的上拉电阻(通常采用4.710k)。开漏输出能够方便地实现“线与”逻辑功能,即多个开漏的管脚可以直接并在一起 。 开漏输出的另一种用途是能够方便地实
6、现不同逻辑电平之间的转换(如3.3V到5V之间),只需外接一个上拉电阻,而不需要额外的转换电路。典型的应用例子就是基于开漏电气连接的I2C总线。,4 钳位二极管 其作用是防止从外部管脚Pin输入的电压过高或者过低。,二、GPIO配置 (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mod
7、e_AF_PP 复用推挽输出,1. I/O口速度 GPIO_Speed_10MHz 最高输出速率10MHz GPIO_Speed_2MHz 最高输出速率2MHz GPIO_Speed_50MHz 最高输出速率50MHz 1I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关 。,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声 控制和降低功耗的目的。 高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。 当然如果要输出较高频率的
8、信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。,关键是GPIO的引脚速度跟应用匹配 对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。 对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。 对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。,2. GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。 3. 在复位期间和刚复位后,复用功能未开启,I/O端口被配置
9、成浮空输入模式。 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。,4.推挽输出与开漏输出的区别 推挽输出:可以输出高,低电平,连接数字器件;开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内).,三、在STM32中选用IO模式 (1) 浮空输入_IN_FLOATING 浮空输入,可以做KEY识别,RX1 (2)带上拉输入_IPUIO内部上拉电阻输入 (3)带下拉输入_IPDIO内部下拉电阻输入 (4) 模拟输入_AIN 应用ADC模拟输入,或者低功耗下省电。 (5)开漏输出_OUT_
10、OD IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变 。可以读IO输入电平变化,实现C51的IO双向功能。,(6)推挽输出_OUT_PP IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的。 (7)复用功能的推挽输出_AF_PP 片内外设功能(I2C的SCL,SDA) (8)复用功能的开漏输出_AF_OD片内外设功能(TX1,MOSI,MISO,SCK,SS),实例 (1)模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和
11、1;读值时先 GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读IO的值;使用GPIO_ReadInputData Bit(GPIOB, GPIO_Pin_0); (2)如果是无上拉电阻,IO默认是高电平;需要读取IO的值,可以使用 (3)带上拉输入_IPU和浮空输入_IN_FLOATING和 开漏输出_OUT_OD;,四、通用IO端口(GPIO)初始化 基本步骤步骤一 声明GPIO的结构GPIO_InitTypeDef GPIO_InitStructure; 步骤二 为变量GPIO_InitStructure 的成员赋值,如果只设置其中的一部分成员,我们需要如下
12、代码:,GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOB,步骤三 调用函数GPIO_Init()来初始化外设GPIO,代码如下: GPIO_Init(GPIOC,步骤四使能。注意,在固件库中GPIO 没有GPIO_Cmd 的函数,因此这个步骤省略。,4.1 GPIO初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B | C, ENABLE):使能APB2总线外设时钟 RCC_ APB2PeriphResetCmd (RCC_AP B2Periph_GPIOA | B | C,DISABLE):释放GPIO复位。,