eg:STM32F407ZGT6
目录
1:引脚说明
一共有7组IO口;
每组IO口有16个IO;
SO 一共16*7=112个IO,外加两个PH0和PH1一共114个IO口
GPIOA~G,PH0,PH1;
2:GPIO工作方式
4钟输入模式:
- 输入浮空 //一般多用于外部按键输入,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定
- 输入上拉 //上下拉这个很好理解,不多说
- 输入下拉
- 模拟输入 //应用ADC模拟输入,或者低功耗下省电
4钟输出模式:
- 开漏输出 (带上拉或下拉) //输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合做电流型驱 动。其吸收电流的能力相对强(一般20MA以内)
- 开漏复用功能 (带上拉或下拉) //可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)
- 推挽式输出 (带上拉或下拉) //能提高电路的负载能力,又提高开关速度
- 推挽式复用功能(带上拉或下拉)
4钟最大输出速度
- 2M
- 25M
- 50M
- 100M
/*操作GPIOx_MODER寄存器*/ typedef enum { GPIO_Mode_IN = 0x00, //输入(复位状态) GPIO_Mode_OUT = 0x01, //通用输出模式 GPIO_Mode_AF = 0x02, //复用输出模式 GPIO_Mode_AN = 0x03 //模拟模式 }GPIOMode_TypeDef; /*操作GPIOx_OTYPER寄存器*/ typedef enum { GPIO_OType_PP = 0x00,//推挽输出(复位状态) GPIO_OType_OD = 0x01 //开漏输出 }GPIOOType_TypeDef; /*操作GPIOx_PUPDR寄存器*/ typedef enum { GPIO_PuPd_NOPULL = 0x00, //无上拉或下拉 GPIO_PuPd_UP = 0x01, //上拉 GPIO_PuPd_DOWN = 0x02 //下拉 }GPIOPuPd_TypeDef; /*操作GPIOx_OSPEEDR寄存器*/ typedef enum { GPIO_Low_Speed = 0x00, /*!< Low speed 2M */ GPIO_Medium_Speed = 0x01, /*!< Medium speed 25M */ GPIO_Fast_Speed = 0x02, /*!< Fast speed 50M */ GPIO_High_Speed = 0x03 /*!< High speed 30pf时为100M(高速) 15pf时为80M输出(最大速度)*/ }GPIOSpeed_TypeDef; /* Add legacy definition */ #define GPIO_Speed_2MHz GPIO_Low_Speed #define GPIO_Speed_25MHz GPIO_Medium_Speed #define GPIO_Speed_50MHz GPIO_Fast_Speed #define GPIO_Speed_100MHz GPIO_High_Speed
比如现在我要配置PA9,10为串口1 --推挽复用上拉输出,速度为50M则
//USART1端口配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10
3:GPIO端口的寄存器
- 一个端口模式寄存器(GPIOx_MODER)
- 一个端口输出类型寄存器(GPIOx_OTYPER)
- 一个端口输出速度寄存器(GPIOx_OSPEEDR)
- 一个端口上拉下拉寄存器(GPIOx_PUPDR)
- 一个端口输入数据寄存器(GPIOx_IDR)
- 一个端口输出数据寄存器(GPIOx_ODR)
- 一个端口置位/复位寄存器(GPIOx_BSRR)
- 一个端口配置锁存寄存器(GPIOx_LCKR)
- 两个复位功能寄存器(低位GPIOx_AFRL & GPIOx_AFRH)
前4个为32位的配置寄存器,5,6为2个32位的数据寄存器
详细的自己去看数据手册吧~~~~~~
4:GPIO复用功能
STM32大部分引脚除了当GPIO使用以外,还可以复用为外设功能引脚
FT表示该引脚可以复用
复用功能实际上就是操作的AFRL\H寄存器
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
{
uint32_t temp = 0x00;
uint32_t temp_2 = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
assert_param(IS_GPIO_AF(GPIO_AF));
temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
/************操作AFR寄存器************************/
temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
}
5:注意事项
- PD0,PD1用于输出的时候仅能用于50M的输出速度
- PC13,PC14,PC15只能用于2M的输出模式,最多只能带30PF的负载,并且同时只能使用一个引脚!!!