查看原理图

找到LED灯

我们来点亮红色灯,查看主控,RLED被连接到PB7,VCC是电源正极,也就是RLED这个位置要输出负电才能点亮LED

GPIO(General - Purpose Input/Output,通用输入 / 输出端口)

功能

  • 输入功能
    • 浮空输入:GPIO 引脚的电平状态完全由外部输入决定,内部没有上拉或下拉电阻。常用于读取外部不确定电平状态的信号,比如连接一些按键,在按键未按下时,引脚电平不确定。
    • 上拉输入:GPIO 引脚内部连接了上拉电阻,默认状态下引脚为高电平。当外部连接的按键按下接地时,引脚电平变为低电平,常用于检测按键按下等操作。
    • 下拉输入:与上拉输入相反,GPIO 引脚内部连接下拉电阻,默认状态下引脚为低电平。当外部有信号拉高引脚电平时,可检测到输入信号变化。
    • 模拟输入:用于连接模拟信号源,将外部模拟信号输入到芯片内部的 ADC(模拟 - 数字转换器)进行转换,实现模拟量到数字量的采集,比如采集温度传感器输出的模拟电压信号来获取温度值。
  • 输出功能
    • 推挽输出:可以输出高、低电平,驱动能力较强。在输出高电平时,内部的 N-MOS 管截止,P-MOS 管导通,将引脚电平拉高;输出低电平时,P-MOS 管截止,N-MOS 管导通,将引脚电平拉低。常用于驱动一些需要较大电流的负载,如 LED 灯等。
    • 开漏输出:需要外接上拉电阻才能输出高电平。当输出低电平时,内部的 N-MOS 管导通,引脚接地;输出高电平时,N-MOS 管截止,引脚电平由外接上拉电阻决定。开漏输出常用于实现线与逻辑(多个开漏输出引脚连接在一起,只要有一个输出低电平,整体就为低电平),或者用于 I2C、SMBUS 等通信协议,因为这些协议需要 “线与” 功能来实现多设备通信时的仲裁。
    • 复用推挽输出:当 GPIO 引脚用于复用功能时(如用作串口通信的 TX、RX 引脚),采用复用推挽输出模式,此时引脚功能由芯片内部的外设功能模块控制,用于实现特定的通信或其他功能。
    • 复用开漏输出:与复用推挽输出类似,也是用于 GPIO 引脚的复用功能场景,只是具有开漏输出的特性,适用于需要 “线与” 功能的复用外设,如 I2C 通信中的引脚。

应用场景

  • 控制外设:在嵌入式系统中,GPIO 引脚可以直接连接 LED 灯、蜂鸣器、继电器等外设。通过配置为推挽输出模式,STM32 可以控制这些外设的工作状态,比如点亮或熄灭 LED 灯,使蜂鸣器发声或停止,控制继电器的吸合与释放来控制强电设备等。
  • 获取外部信号:用于连接按键、传感器等外部输入设备。将 GPIO 配置为合适的输入模式(如上拉输入连接按键),STM32 可以检测外部信号的变化,比如检测按键是否被按下,读取传感器的状态信号(如温度传感器的使能信号)等。
  • 通信接口:许多通信协议(如 I2C、SPI、USART 等)都需要使用 GPIO 引脚来实现。通过将 GPIO 配置为复用模式,STM32 可以使用这些引脚进行数据通信,实现与其他芯片或设备的数据交互,如通过 I2C 接口读取 EEPROM 中的数据,通过 SPI 接口与 Flash 芯片进行通信等。

回到我们新建的项目,重新进入可视化配置文件

双击

在右侧引脚配置处,点击PB7,将其配置成GPIO输出

我们要使用代码将其点亮查看效果,所以这里把GPIO先配置成高电平,因为低电平的话不需要编写代码LED直接就点亮了

Ctrl+S保存生成代码

我们可以选择这两个函数的其中之一进行点亮LED

1. HAL_GPIO_WritePin

功能:直接设置指定 GPIO 引脚的电平状态(置高 / 置低)。
核心逻辑

  • 通过 PinState 判断电平需求:
    • 若 PinState 非 GPIO_PIN_RESET(即需置高),直接写 GPIOx->BSRR = GPIO_Pin(利用 BSRR 寄存器高 16 位快速置高引脚);
    • 若需置低,写 GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U(利用 BSRR 寄存器低 16 位快速置低引脚)。
      典型场景:控制 LED 亮灭、继电器通断等 “直接电平控制” 需求。

2. HAL_GPIO_TogglePin

功能:翻转指定 GPIO 引脚的电平(高→低 / 低→高)。
核心逻辑

  • 先读取当前引脚电平(GPIOx->ODR);
  • 通过位操作 “异或反转”:利用 BSRR 寄存器,将原高电平引脚置低、原低电平引脚置高,一行代码完成翻转:
    GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin)
    典型场景:实现 LED 闪烁、按键消抖检测(配合延时)等 “电平反转” 需求。

关键区别

  • WritePin 是直接控制电平,需明确传入高 / 低状态;
  • TogglePin 是自动翻转电平,无需关心当前状态,依赖读取寄存器实现反转。

这里我们使用HAL_GPIO_WritePin

进入main.c文件,找到主函数,编写一句代码

代码的意思就是给PB7写入一个低电平信号,因为我们需要PB7输入低电平,配合另LED另一只引脚的高电平,才能将LED点亮,而我们在刚刚配置的时候,将PB7设置成了默认输出高电平,这个时候我们要将它修改成低电平,才能点亮我们的LED

烧录完成,可以看到LED被点亮

我们修改一下代码,让它点亮一秒,熄灭一秒,这次我们将代码写到主循环里,我们要达到这个效果,还需要使用一个延时函数

  • 函数名:HAL_Delay
  • 作用:基于系统滴答定时器(SysTick)的计数值,实现阻塞式延时(单位:毫秒,取决于 HAL_GetTick 的时基配置,通常为 1ms 递增 )。

修改代码

烧录查看效果,并使用同样的方式,点亮三颗LED灯

如有不当之处,还望批评指正,简单上传了一下学习的过程,相关资料和代码可v:xiaozhang_9520获取,从事前后端开发、PC软件开发、小程序开发,可合作交流、共同进步

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐