GPIO寄存器概述
GPIO作为STM32F103VET6中最基础的功能模块,分布在GPIOA~GPIOE的五个端口组中,每个小组有16个引脚,每个GPIO引脚都可以用作外部中断源的输入,每个GPIO引脚可配置为8种模式,不同引脚有对应的复用功能、复用功能重映射等功能。
控制GPIO的功能寄存器如下图所示:
图1-1 CPIO寄存器描述
将上图所示7种寄存器可以归纳为4类,分别为:
1. 配置寄存器:选定GPIO的特性功能,配置为不同模式的输入输出口;
GPIOx_CRH(32位):配置GPIOx端口高8位引脚模式;
GPIOx_CRL(32位):配置GPIOx端口低8位引脚模式;
每个引脚的模式由寄存器的4个位控制,2位配置引脚为输出或输出,2位配置引脚输出输出模式。
GPIO的输入输出模式总共有8中,包括4中输入模式,4中输出模式:
1) 4中输入模式
i. 上拉输入:配置引脚为高电平,读出引脚数据为1;
ii. 下拉输入:配置引脚为低电平,读出引脚数据为0;
iii. 浮空输入:引脚电平不固定,输入阻抗大,一般用于标准的通信协如I2C、USART的接收端。
/*配置PA9、PA10为串口功能引脚
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//USART-RX
GPIO_Init(GPIOA,&GPIO_InitStructure);
iv. 模拟输入:将电压信号传送到片上外设,如传送至ADC模块进行电压信号采样。
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //ADC in
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOC,&GPIO_InitStructure);
2) 4种输出模式
i. 推挽输出:输出高/低3.3/0伏电平。
ii. 开漏输出:无法直接输出高电平,正常使用时在外部接上一个上拉电阻,由上拉电阻提供高电平,一般应用在电平不匹配的场合,如由上拉电阻和电源向外输出5V的电平。
iii. 复用推挽输出:GPIO复用功能时,如USART的输出:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //USART-TX
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
iv. 复用开漏:“线与”特性,很多歌开口模式引脚连接在一起时,只有当所有引脚都输出高阻态,才有上拉电阻提供搞定平,否则输出低电平0V。
2. 数据寄存器:保存了GPIO的输入电平和输出电平;
GPIOx_IDR:对应IO口状态读入;
GPIOx_ODR:对应IO状态读入和写出;
3. 位控制寄存器:控制某个引脚为高/低电平;
GPIOx_BSRR:控制引脚输出,一个引脚的输出和输出由两个位来控制,BRY位用于写1清零使引脚输出低电平,Bsy位用于写1置1使引脚输出高电平。
GPIOx_BRR:清除某引脚位。
4. 锁定寄存器:固定某引脚功能,不能修改其配置。
GPIOx_LCKR:锁定配置功能。
GPIO配置实例如下:
1) GPIOA->CRL&=0X000FFFFF; //清除PA5、PA6、PA7原来的设置,同时也不影响其它位的设置。端口的复位值为0X44444444,复位值其实就是配置端口为浮空输入模式。
2) GPIOA->CRL|=0XBBB00000;//配置PA5、PA6、PA7为复用推挽输出,比较常用的配置为0X4表示模拟输入模式(ADC用)、0X3表示推挽输出模式(做输出口用, 50M速率)、0X8表示上/下拉输入模式(做输入口用)、0XB表示复用推挽输出(使用IO口的第二功能,50M速率)。
3) GPIOA->ODR|=0X7<<5;//配置PA5、PA6、PA7输出为高电平