-
目录
寄存器:程序与电路间的桥梁 - PA14,PB3,PB4为调试端口
一. GPIO介绍
- 1.通用输入输出口
- 2.电平:0~3.3v
- 3.输出模式:控制端口高低电平-LED,蜂鸣器,串口通信I2C,SPI
- 4.输入模式:读取端口高低电平-按键输入,外界模块电平信号输入,ADC电压采集
二.GPIO基本结构
三.GPIO位结构
-
输入模式
- 上拉输入:默认高电平
- 下拉输入:默认低电平
- 浮空输入:输入输出易受干扰,电平不确定
- 模拟输入:接入ADC,模拟量
- 复用功能输入:接入串口输入引脚
-
输出部分
推挽输出(N/P都开启) | 开漏输出(N开启) | N/P都关闭 | |
高电平 | P激活N断开(3.3V) | N/P断开,断路由外部电路决定高电平 | 外部电路决定高低电平 |
低电平 | N激活P断开 | N激活 | |
优点 | 内部输出3.3V | 配合外部电路更灵活 | |
缺点 | 只能输出3.3V | 不能输出高电平 |
四.GPIO八种模式
- 一个端口只能有一个输出,可以有多个输入
五.操作GPIO
Ⅰ 输出
- 用RCC开启GPIO时钟
- 使用Init函数初始化GPIO
- 使用输出输入函数控制GPIO
- RCC函数(APB1~3总线)
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);
/**
* @brief Enables or disables the High Speed APB (APB2) peripheral clock.
* @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock.
* This parameter can be any combination of the following values:
* @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
* RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
* RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
* RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
* RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
* RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
* RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11
* @param NewState: new state of the specified peripheral clock.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- 初始化函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
GPIO_InitTypeDef GPIO_InitStructure;//结构体指针
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//第13口
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出频率
GPIO_Init(GPIOC, &GPIO_InitStructure);//调用函数
- 输出函数
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);//根据第3个参数设置端口
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//同时对16个端口写入
六.示例.
- LED闪烁
GPIO_SetBits(GPIOC, GPIO_Pin_13);//0
Delay_ms(500);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);//1
Delay_ms(500);
GPIO_WriteBit(GPIOC, GPIO_Pin_13,Bit_SET);//0
Delay_ms(500);
GPIO_WriteBit(GPIOC, GPIO_Pin_13,Bit_RESET);//1
- 流水灯
GPIO_Write(GPIOA, ~0x0001);//0000 0000 0000 0001 Delay_ms(500); GPIO_Write(GPIOA, ~0x0002);//0000 0000 0000 0010 Delay_ms(500); GPIO_Write(GPIOA, ~0x0004);//0000 0000 0000 0100 Delay_ms(500); GPIO_Write(GPIOA, ~0x0008);//0000 0000 0000 1000 Delay_ms(500); GPIO_Write(GPIOA, ~0x0010);//0000 0000 0001 0000 Delay_ms(500); GPIO_Write(GPIOA, ~0x0020);//0000 0000 0010 00000 Delay_ms(500); GPIO_Write(GPIOA, ~0x0040);//0000 0000 0100 00000 Delay_ms(500); GPIO_Write(GPIOA, ~0x0080);//0000 0000 1000 0000 Delay_ms(500);
- 蜂鸣器
Ⅱ.输入
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);//读取输出寄存器所有位