GPIO 和轮询控制 LED 的状态
GPIO 概念
I/O 是输入(Input)和输出(Output)的意思,GPIO(General Purpose I/O)是基本输入输出,是 I/O 的最基本形式。STM32F103ZET6 大概有 144 个引脚,每个引脚有多个功能,有些引脚可以用作中断、可以用作 GPIO,所以引脚有复用功能。这些引脚连接如 LED、蜂鸣器、按键等。
实现通过按键对 LED0 的控制。假如 LED0 的引脚是 PB5,STM32F103ZET6 控制该引脚输出高电平或低电平,即开关量输出,因此该引脚配置成 GPIO Output。STM32F103ZET6 获取按键的状态:按键按下还是松开?因此,按键的引脚是 GPIO Input。当按键按下时,向 PB5 引脚输出高电平,使 LED0 亮,反之,使 LED0 灭。
综上所述,GPIO 是 MCU? 同外界进行交互的重要通道,通过 GPIO 可以实现软件干预硬件。
实验检测理论
实验准备
实验目的:通过轮询和 GPIO 实现控制 LED0 和 LED1 的闪烁。
实验资料:1️⃣正点原子:STM32F103ZET62️⃣STM32F103ZET6 电路原理图
本随笔中只贴出开发板的 LED1、LED0 的原理图:
CubeMX 配置
找到 LED0 和 LED1 的引脚,设置 GPIO_Output,因为是 MCU 通过端口寄存器控制该引脚状态,所以 PB5 和 PE5 是一个输出引脚。
打开 SYS -> Debug Serial。
设置时钟,我现在也是一个初学者,对时钟的概念还不知道,姑且配置最高,CubeMX 会提示你配置过大,它可以帮你修改。
记得使用 MDK 生成工程项目,否则不能用 Keil 打开,默认是其他的工程项目。
编写代码
while (1)
{
HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, GPIO_PIN_RESET);
HAL_Delay(1000);
}
代码很简单,主要是 HAL_GPIO_WritePin 函数,向引脚输出开关量。LED 一直都是一个高电平状态,直接连接的是 Vcc(电源),而我们是给 LED 写一个低电平,就可以改变 LED 的状态,使得 LED 亮,否则 LED 灭。GPIO_PIN_SET 是 CubeMX 设置好的,不管输出的是高还是低电平,改变状态就是 SET,恢复原来的状态就是 RESET。
实验效果
👉代码仓库:GPIO_LIGHT
实验总结
很多编程语言都有 IO 流的章节,IO 流就是一个获取系统的资源的管道。获取就是输入(Input),写出就是输出(Output)。Java 除了最基本的 IO 流,还有字节流、字符流等更高级的 IO 流。
在嵌入式系统开发中也有 IO,其中最基本的就是 GPIO,是嵌入式系统开发中最基础的 IO。MCU 要控制板子上的外围设备,如 LED、蜂鸣器,就得通过 GPIO 向外输出开关量。