问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32F407单片机编程入门:GPIO详解及驱动LED灯实战

创作时间:
作者:
@小白创作中心

STM32F407单片机编程入门:GPIO详解及驱动LED灯实战

引用
CSDN
1.
https://m.blog.csdn.net/zy2232652/article/details/142304188

文章目录

  • 一.概要
  • 二.STM32F407VET6单片机GPIO口特点
  • 三.STM32单片机GPIO内部结构图
  • 四.单片机GPIO推挽输出信号流向
  • 五.单片机GPIO浮空输入信号流向
  • 六.STM32F407VET6单片机GPIO引脚的复用
  • 七.CubeMX配置一个GPIO输出驱动LED灯例程
  • 八.CubeMX工程源代码下载
  • 九.小结

一.概要

GPIO(General Purpose Input 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工程源代码下载

通过CubeMX生成的工程代码,读者可以自行下载和使用。

九.小结

GPIO是STM32单片机开发中的最基本操作,学会了GPIO,可以驱动继电器,LED灯等基本控制。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号