1、什么是GPIO?
1.1、定义
GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯,控制以及数据采集的功能。
简单来说我们控制GPIO引脚的电平变化,达到我们的各种目的。
1.2、命名规则
组编号:GPIOA , GPIOB , GPIOC , GPIOD ... GPIOG
引脚编号:0 , 1 , 2 , 3 , 4 …15
组合起来: PA0 , PA1 , PA2 … PA15
PB0 , PB1 , PB2 … PB15
PC0 , PC1 , PC2 … PC15
…
有一些特殊功能的引脚不能用作IO口。
1.3、内部框架图
1.4、推挽输出与开漏输出
推挽输出:
开漏输出:
推挽输出:可以真正的输出高电平和低电平
开漏输出:无法输出真正的高电平,既高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动
2、点亮LED灯
2.1、PCB原理图接线
将PB8或PB9置低电平,实现LED灯的点亮。
3、编程实现
3.1、常用的GPIO HAL库函数:
/* HAL_GPIO_Init函数:初始化GPIO口 */
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
/* HAL_GPIO_WritePin函数:给对应GPIO口引脚写低电平或高电平 */
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState
PinState);
/* HAL_GPIO_TogglePin函数:翻转GPIO口状态 */
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
结构体 GPIO_InitTypeDef定义:
typedef struct
{
uint32_t Pin; //表示GPIO引脚
uint32_t Mode; //输出模式,选择推挽输出还是开漏输出
uint32_t Pull; //引脚设置(拉高,拉低,既不拉高也不拉低)
uint32_t Speed; //引脚传输速度
} GPIO_InitTypeDef;
3.2、点灯实现
3.2.1、配置STM32CubeMX
3.2.2、代码分析
mian.c文件
#include "main.h"
#include "gpio.h"
void SystemClock_Config(void);
int main(void)
{
HAL_Init(); //初始化HAL库
SystemClock_Config(); //初始化时钟
MX_GPIO_Init(); //初始化GPIO口
while (1)
{
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif
gpio.c文件
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file gpio.c
* @brief This file provides code for the configuration
* of all used GPIO pins.
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "gpio.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/*----------------------------------------------------------------------------*/
/* Configure GPIO */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE(); //GPIO相关的时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
/* 给GPIO引脚写函数 */ /* 函数参数:引脚组 , 引脚号 , 写入状态(SET高,RESET低) */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_SET);
/*Configure GPIO pins : PB8 PB9 */
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
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);
}
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */