文章目录
一.概要
GPIO(general porpose intput output):单片机通用输入输出端口的简称。可以通过单片机烧录的程序代码控制单片机引脚输出高电平或者低电平,也可以读取引脚电平信号为高电平还是低电平。STM32单片机的GPIO引脚与外部设备连接起来,从而实现与外部模块通信,控制以及数据采集的功能。
输出电压:高电平:3.3V,低电平:0V
输入电压:高电平:3.3V,低电平:0V,部分管脚容忍5V输入
引脚图中的 GPIOA—GPIOH口 等均属于 GPIO 引脚。从引脚图可以看出,GPIO 占用了 STM32 芯片大部分的引脚。比如GPIOA端口,它有 PA0-PA15。
二.STM32F407VET6单片机GPIO口特点
每组端口包含有16个GPIO,总共有82个GPIO:80%的IO口利用率
标准的I/O口可承受5V;
IO口可以吸收25mA;
最快的I/O可设置输出速度达到84MHz;
多达16路模拟输入(ADC);
可改变功能引脚(如:USARTx、TIMx、I2Cx、SPIx、CAN、USB等),;
每个IO口可以设置为外部中断(同时可最多可有16个);
所有的IO口被分成6个端口(GPIOA—GPIOH);
GPIOx_AFR寄存器就可配置端口复用功能;
使用BSRR和BRR寄存器可对IO口的位进行位设置或清除;
二.STM32单片机GPIO内部结构图
如下图所示,GPIO口可以通过寄存器配置成各种模式:
模拟输入(Analog Input)则用于 ADC 电压采集,一般是采集0~3.3V的电压信号。
浮空输入(Input floating)就是读取引脚高低电平信号,完全由外部的输入决定,一般接按键的时候使用这个模式。
上拉下拉输入(Input Pull-Up,Input Pull-Down)就是读取引脚高低电平信号,但开启上拉时引脚默认电压为高电平,开启下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响,上下拉电阻的值在40K欧姆左右。
推挽模式输出(Output Push-Pull),推挽模式时双 MOS 管以推挽方式工作,配置寄存器可控制 I/O 输出高电平或者低电平。
开漏模式输出(Output Open-Drain)开漏模式输出时,只有 N-MOS 管工作,配置寄存器可控制 I/O 输出高阻态或低电平,没法输出高电平,要输出高电平得外部上拉。
复用功能推挽开漏模式(AF Push-Pull,AF Open-Drain),一般I/O口需配置成通讯外设引脚的都时候都需要配置成这个模式。在这个模式下,输出和输出速度都可配置,可工作在开漏及推挽模式,输出信号由外设接口(比如USART,SPI等)决定。一般直接用外设接口的寄存器来获取引脚输入电平信号。
模拟模式(Analog Input),此模式下,上下拉电阻断开,施密特触发器关闭,双MOS管也关闭,该模式用于ADC采集或者DAC输出。
三.单片机GPIO推挽输出信号流向
如下图,1~4就是一个GPIO推挽输出的信号流向:
输出数据寄存器输出一个高电平时,P-MOS 管导通,N-MOS 管截止,对外输出高电平(3.3V)。
输出数据寄存器输出一个低电平时,P-MOS 管截止,N-MOS 管导通,对外输出低电平(0V)。
四.单片机GPIO浮空输入信号流向
如下图,1~4就是一个GPIO浮空输入的信号流向:
从单片机I/O引脚进来就连接到TTL施密特触发器就把电压信号转化为0、1的数字信号存储在输入数据寄存器。
施密特触发器,当输入电压高于正向阈值电压,输出为1,当输入电压低于负向阈值电压,输出为0,当输入在正负向阈值电压之间,输出不改变。
五.STM32F407VET6单片机GPIO引脚的复用
STM32有很多的外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为外设的功能引脚,那么当这个GPIO作为外设使用的时候,就叫做复用。
例如串口2的发送接收引脚是PA2,PA3,当我们把PA2,PA3不用作GPIO,而用做串口2的发送接收引脚的时候,叫端口复用,如手册,对PA2,PA3描述,需要配置GPIOx_AFRL为AF7,这样PA2,PA3就是串口的收发引脚了。
六.CubeMX配置一个GPIO输出驱动LED灯例程
硬件准备:
STLINK接STM32F407VET6开发板,STLINK接电脑USB口。
打开STM32CubeMX软件,新建工程
Part Number处输入STM32F407VE,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
可以查看STM32F407VET6开发板原理图,PB4连接LED灯,所以配置PB4为GPIO输出
配置系统主频168Mhz,使用外部晶振
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加代码
编译代码
下载程序到单片机
进入调试模式
查看GPIOB端口的寄存器,PB4输出高电平的时候,查看GPIOB寄存器ODR4为1
主要代码如下:
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
/*Configure GPIO pin : PB4 */
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/**
* @brief Toggles the specified GPIO pins.
* @param GPIOx Where x can be (A..K) to select the GPIO peripheral for STM32F429X device or
* x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices.
* @param GPIO_Pin Specifies the pins to be toggled.
* @retval None
*/
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
//BSRR低16位用于设置 GPIO 口对应位输出高电平,高16位用于设置 GPIO 口对应位输出低电平
if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin)
{
GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER;
}
else
{
GPIOx->BSRR = GPIO_Pin;
}
}
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();//初始化1毫秒 Tick
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();//外部8M晶振,系统168M主频
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();//PB4配置成输出
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);//PB4引脚翻转输出
HAL_Delay(100);//等待100ms
}
/* USER CODE END 3 */
}
七.CubeMX工程源代码下载
通过网盘分享的文件:1.GPIO输出驱动LED.zip
链接: https://pan.baidu.com/s/1Rg_Nxhh5TpHBi9JpWKRqWQ 提取码: wcz5
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
八.小结
GPIO是STM32单片机开发中的最基本操作,学会了GPIO,可以驱动继电器,LED灯等基本控制。