STM32 GPIO 入门

一、GPIO 外设的概述

1.GPIO 的概念

GPIO(General Purpose Input/Output)外设是微控制器中最基本且最通用的接口,用于与外部设备进行交互。GPIO 引脚的核心功能是作为通用的数字输入或输出,可以通过软件配置为多种工作模式,以满足不同的应用需求,GPIO 引脚需要和外设连接在一起的,就可以和外设实现通信以及采集数据等功能。

2.GPIO 的定义

指的是对芯片的某个引脚进行高低电平的输出,以及可以去检测某个引脚的电平状态。一般电平采用都是 TTL 电平信号,TTL 电平信号规定:+5V 等价于逻辑“1”,0V 等价于逻辑“0”。电平其实有一个电平范围:>2.4V 就表示高电平,<0.4V 就表示低电平。

3.引脚的布局

image-20251120213822126

电源引脚 :VCC、VDD、VSS、VDDA、VSSA、VREF+等属于电源引脚
晶振引脚 :PC14、PC15、PH0、PH1 就属于晶振引脚,也可以作为其他的功能使用
复位引脚 :NRST 属于复位引脚
BOOT 引脚 :BOOT0 是专用引脚,BOOT1 就属于功能引脚 (设置芯片的自举模式)
GPIO 引脚 :芯片一共有 144 引脚,但是 GPIO 引脚有 114 个
下载引脚 :PA13、PA14、PB3、PB4 等都属于下载引脚(JTAG、SWD)

4.引脚的功能

需要注意:芯片的引脚有很多的功能,一般默认的功能都是作为 GPIO(输入输出),但是引脚也有其他的功能,被称为“第二功能”,只有在使用 ADC 通道和 DAC 需要把引脚设置模拟模式,其他情况下想要把引脚当做别的功能使用,需要把引脚设置复用模式。注意:如果想要了解引脚的功能,应该查阅芯片的数据手册!!!!

注意:引脚在芯片复位之后的默认功能一般都是 GPIO 功能,但是并不绝对,所以用户在使用后任何一个引脚的时候都应该查阅芯片数据手册.

二、GPIO 外设的使用

想要学习硬件开发,一般都是从点亮 LED 开始,主要是以基础外设作为入门,掌握外设的控制流程。

(1) 查看原理图,找到控制发光二极管的芯片的 IO 口,LED0 -- PF9 引脚,其他引脚类似!!

image-20251120214236066

(2) 分析原理图,理解硬件的控制原理(复杂外设还需要结合数据手册),输出低电平就亮

image-20251120214344057

(3) 程序设计,根据 ST 公司提供的函数库(标准外设库+HAL 库)的帮助手册学习开发流程

image-20251120215501629

如何使用 GPIO?(以点亮 LED 为例)

/**
******************************************************************************
* @file    led.c 
* @author  qrshxc@163.com
* @version V1.0
* @date    2025.7.21
* @brief   实现MCU的PF9和PF10引脚控制开发板的LED的亮灭
******************************************************************************
**/
#include "stm32f4xx.h"

int main()
{
	/* 定义GPIO外设的结构体变量 */
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	/* 使能GPIOF端口的时钟 */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	
	/* 对PF9引脚进行配置 */
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10 | GPIO_Pin_9;// 引脚编号
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;           // 输出模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;			 // 输出类型
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;       // 输出速度
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;		 // 上下拉电阻
	GPIO_Init(GPIOF, &GPIO_InitStructure);

	while(1)
	{
		/* 控制PF9和PF10引脚为低电平,则LED灯亮 */
		GPIO_ResetBits(GPIOF, GPIO_Pin_9 | GPIO_Pin_10);
	}
}

三、GPIO 外设的细节分析

(1) 定义GPIO 外设的和初始化相关的结构体变量,结构体类型是定义在stm32f4xx_gpio.h

image-20251120215757065

(2) 想要使用GPIO 外设,必须提前打开GPIO 端口外设时钟,需要使用ST 提供的函数,如:打开外设时钟的原因:因为STM32 属于低功耗的MCU,而为了降低功耗,所以STM32 的MCU 在复位之后默认会关闭绝大多数的外设的时钟,所以用户想要使用MCU 内部的某个外
设,就必须打开该外设的时钟(clock)。
想要控制硬件,必须控制硬件的寄存器,而从数字电路的角度讲,寄存器的作用是用于暂存一组二进制数据,比如32bit 的寄存器可以暂存32bit 的数据,原因就是寄存器内部是由一组触发器级联组成的,触发器可以暂存1bit 数据(0 or 1),而触发器在数字电路属于时序
逻辑电路。

image-20251120215901011

image-20251120215915786

时钟相当于外设的开关,不打开时钟,则晶振产生的振荡信号就无法输入到MCU 内部的外设中,则没有时钟信号,触发器无法触发,则触发器无法锁存数据,而寄存器是由N 个触发器组成,所以寄存器就无法工作,而控制硬件,必须通过寄存器实现。

image-20251120220006382

STM32 的MCU 内部有很多外设,每个外设的作用和性能都各不相同,ST 公司为了降低芯片功耗,把不同性能的外设挂载在不同性能的总线上,需要掌握3 条总线:

AHB 高级高性能总线(总线频率是168MHZ)、APB1 高级外设总线(总线频率是42MHZ)、APB2 高级外设总线(总线频率是84MHZ)。而MCU 内部的外设的性能不同,所以就需要把外设挂载到对应的总线,利用总线对外设进行控制。总线和外设的关系就相当于高速公路和汽车的关系,高速公路一般分为快慢车道,每个车道的车速不同,如果汽车的性能较低,则在慢车道行驶,如果汽车的性能较强,则在快车道行驶。

(3) 打开GPIO 外设的时钟之后,可以对GPIO 外设的初始化结构体中的成员进行赋值,再设置GPIO 引脚的编号,然后设置GPIO 引脚的模式

image-20251120220253711

设置GPIO 引脚的输出类型

image-20251120220340286

设置GPIO 引脚的内部电阻

image-20251120220403066

设置GPIO 引脚的输出速度
image-20251120220420731

输出速度指的是引脚电平的翻转速度,如果选择高速,则会增加功耗和噪声,如果不知道选择哪种,则选择高速即可。

(4) 设置好了GPIO 结构体的各个成员的值,需要把结构体中的值写入到GPIO 端口寄存器!

image-20251120220446388

四、总结

GPIO 是 STM32 中最基础、最关键的外设之一,理解它的结构与工作机制,是掌握单片机开发的第一步。通过本篇内容,我们可以总结出以下要点:总结来说,GPIO 虽然简单,但却是 STM32 外设学习的起点。只要能够理解 GPIO 的配置原理、时钟机制以及寄存器的作用,就能顺利掌握更高级的外设开发。

posted @ 2025-11-20 23:11  九思0404  阅读(9)  评论(0)    收藏  举报