1.可配置为8种输入输出模式(输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽式输出、推挽式复用功能、开漏复用功能)
2.引脚电平:0V~3.3V(CMOS端口),部分引脚可容忍5V(STM32引脚定义中I/O口带FT就是可以容忍5V),TTL端口兼容5.5v。
3.输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
4.输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
5.所有的GPIO都是挂载在APB2总线上的,每一个GPIO总共有16个引脚,编号0-15(PA0-PA15)
6.快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以到50Mhz)
7.每个IO口都可以做中断
如果输入电压比3.3V还要高上方的二极管就会导通,输入电压产生的电流就会直接流入VDD,如果输入电压比0V还要低,相对于VSS就会产生负电压,下方二极管导通,电流会从VSS流出,不会从内部电路汲取电流
一个端口可以有多个输入,但是只能有一个输出,配置成输出模式,也是可以读取引脚的高低电平
复用开漏输出:例如IIC它要配置成开漏输出模式,其次要将GPIO的引脚控制权给外设所以是复用
1.LED:发光二极管,正向通电点亮,反向通电不亮(长脚是正极,短脚是负极,内部小的是正极,大的是负极)
2.有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
3.无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音
4.按键:常见的输入设备,按下导通,松手断开,由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动(按键消抖)
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
主要是上面的三个函数分别对应的使能和失能不同的外设,可以在函数功能查看
void GPIO_DeInit(GPIO_TypeDef* GPIOx);//复位GPIOx
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);//用结构体初始化GPIO
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);//给GPIO赋一个默认值
//GPIO读取函数
//读取输入电平
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//返回端口的高低电平
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
//读取输出电平
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
//GPIO写入函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//可以将指定端口设置成高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//可以将指定端口设置成低电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//可以对16个端口进行输入输出
//点灯
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA0
GPIO_ResetBits(GPIOA,GPIO_Pin_0); //将PA0处的电平置低,点亮LED0
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);//将PA1处的电平置低,点亮LED1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
while (1)
{
for(int i=0;i<=4;i++)
{
GPIO_Write(GPIOA,~(0x0001<
void GPIO_AFIODeInit(void);//复位AFIO外设
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//锁定GPIO配置,防止意外更改
//配置AFIO事件功能
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);//引脚重映射
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//配置AFIO
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);//以太网
IO端口的输入输出是由GPIO外设控制,我们称之为通用。
O端口的输入或输出是由其它非GPIO外设控制,我们称之为复用