2. GPIO 使用
📝本节您将了解 GPIO(通用输入/输出端口)的基本概念,学习如何通过 SysConfig 配置引脚功能,掌握输出模式控制 LED 和输入模式读取按键状态的方法。
🏆本章目标
1️⃣ 理解 GPIO 输入与输出模式的工作原理
2️⃣ 通过 SysConfig 配置 GPIO 引脚
3️⃣ 使用 DriverLib 函数控制 LED 亮灭
4️⃣ 读取按键状态实现按键控制 LED
2.1 GPIO 基本概念
GPIO(General Purpose Input/Output)即通用输入/输出端口,是微控制器最基础的外设接口。每个 GPIO 引脚可以被配置为输入或输出模式:
- 输出模式:MCU 主动控制引脚电平状态(高电平 3.3V 或低电平 0V),用于驱动 LED、控制继电器、产生信号等
- 输入模式:MCU 读取引脚上的外部电平信号,用于检测按键状态、读取传感器信号等
高低电平
在 MSPM0G3519 中:
- 高电平:引脚电压接近 VDD(3.3V)
- 低电平:引脚电压接近 GND(0V)
MCU 通过检测或控制这两种电平状态来实现与外部电路的交互。
上下拉电阻
当 GPIO 配置为输入模式时,如果引脚悬空(未连接任何电路),其电平状态是不确定的,可能受到周围电磁干扰而随机跳变。为了使悬空引脚保持确定的默认电平,需要配置上拉或下拉电阻:
- 上拉电阻(Pull-Up):引脚通过电阻连接到 VDD,默认为高电平。外部信号拉低时才变为低电平。
- 下拉电阻(Pull-Down):引脚通过电阻连接到 GND,默认为低电平。外部信号拉高时才变为高电平。
MSPM0G3519 内部集成了可配置的上拉和下拉电阻,通过 SysConfig 即可设置,无需外部电路。
2.2 LED 驱动原理
LED(发光二极管)是半导体光源,当正向电流流过时发光。在开发板电路中,LED 的驱动方式取决于硬件接法:
- 灌入电流(Active-Low):LED 阳极接 VDD,阴极通过限流电阻接到 GPIO 引脚。引脚输出低电平时电流流过 LED 导通发光,输出高电平时 LED 熄灭。
- 输出电流(Active-High):LED 阳极通过限流电阻接到 GPIO 引脚,阴极接 GND。引脚输出高电平时 LED 发光,输出低电平时 LED 熄灭。
限流电阻
LED 对电流敏感,过大电流会导致损坏。通常串联 220Ω ~ 1kΩ 限流电阻来保护 LED。电阻阻值越大,流过电流越小,LED 亮度越暗。
2.3 天巧星 LED 原理图
天巧星开发板的板载 LED 接在 PB22 引脚,电路为 active-low 接法:
- VDD(3.3V)→ 限流电阻 -> LED 阳极 → LED 阴极 -> PB22 引脚

因此:
- PB22 输出低电平 → LED 导通 → 点亮
- PB22 输出高电平 → LED 截止 → 熄灭
2.4 LED 输出配置
在 CCS 中基于 SDK 创建一个 empty 工程,并重新命名为 gpio。
2.4.1 SysConfig 配置
在 CCS 中打开工程的 .syscfg 文件,进入 SysConfig 图形化配置界面:
- 左侧面板点击 GPIO 选项卡
- 点击 ADD 添加一组 GPIO
- 配置参数:
| 类别 | 参数 | 设置值 | 说明 |
|---|---|---|---|
| 端口配置 | Name | LED | 自定义实例名称 |
| Port | PORTB | PB22 属于 PORTB | |
| Port Segment | Upper | 引脚 16-31 为上端口 | |
| 引脚配置 | Name | PIN | 引脚名称 |
| Direction | Output | 输出模式 | |
| Initial Value | Set | 初始高电平(LED 灭) | |
| Internal Resistor | Pull-Up Resistor | 上拉电阻 | |
| Assigned Pin | 22 | PB22 |
- 按
Ctrl + S保存配置
点击查看截图 — GPIO 引脚参数配置界面

参数详解
Port Segment:MSPM0 的 GPIO 端口分为上下两段。下端口(Lower)对应引脚 0-15,上端口(Upper)对应引脚 16-31。PB22 对应的引脚号 22 在上端口范围内。
Initial Value:配置引脚上电后的默认电平。选择 Set(高电平),LED 默认为熄灭状态,避免上电瞬间出现不期望的亮灯。
Internal Resistor:为输出引脚配置下拉电阻,确保引脚未被驱动时保持低电平状态。
2.4.2 GPIO 输出相关函数
保存 .syscfg 并编译工程后,SysConfig 自动生成 ti_msp_dl_config.c/h。以下 DriverLib 函数用于控制引脚电平:
GPIO 输出控制函数
void DL_GPIO_setPins(GPIO_Regs* gpio, uint32_t pins)
将指定引脚输出高电平。
示例:DL_GPIO_setPins(LED_PORT, LED_B22_PIN); — LED 熄灭
void DL_GPIO_clearPins(GPIO_Regs* gpio, uint32_t pins)
将指定引脚输出低电平。
示例:DL_GPIO_clearPins(LED_PORT, LED_B22_PIN); — LED 点亮
void DL_GPIO_togglePins(GPIO_Regs* gpio, uint32_t pins)
翻转指定引脚电平。高变低,低变高。
示例:DL_GPIO_togglePins(LED_PORT, LED_B22_PIN); — LED 状态翻转
2.4.3 LED 闪烁实验
#include "ti_msp_dl_config.h"
int main(void)
{
SYSCFG_DL_init();
while (1) {
DL_GPIO_togglePins(LED_PORT, LED_B22_PIN);
delay_cycles(16000000); // 约500ms(32MHz主频)
}
}2
3
4
5
6
7
8
9
10
11
编译下载后,天巧星板载 LED(PB22)以约 500ms 间隔闪烁。
delay_cycles 说明
delay_cycles(n) 是 MSPM0 SDK 提供的 CPU 忙等延时函数,延时 n 个 CPU 时钟周期。
默认主频 32MHz 时:
delay_cycles(32000000)≈ 1 秒delay_cycles(16000000)≈ 500msdelay_cycles(3200000)≈ 100ms
该函数为阻塞延时,延时期间 CPU 无法处理其他任务。精确定时场景建议使用硬件定时器。
2.5 按键输入原理
独立按键是最常见的人机交互输入器件。其工作原理基于机械触点:
- 未按下:触点断开,电路开路
- 按下时:触点闭合,电路导通
在开发板电路中,按键通常一端接 GND,另一端接 GPIO 引脚。GPIO 配置为上拉输入模式:
- 未按下:内部上拉电阻将引脚拉至高电平
- 按下时:引脚通过按键连接到 GND,变为低电平
通过检测引脚电平从高到低的变化,即可判断按键是否按下。
按键消抖
机械按键在按下和释放的瞬间,触点会产生机械振动(弹跳),导致电平在短时间内(通常 5~20ms)多次跳变。如果不做处理,MCU 可能将一次按键动作误判为多次触发。

常见消抖方法:
- 软件消抖:检测到按键按下后延时 10~20ms,再次读取引脚状态确认。简单有效,本教程采用此方法。
点击查看截图 — 软件消抖示意

- 硬件消抖:在按键电路中加入 RC 低通滤波器,硬件层面滤除抖动信号。
点击查看截图 — 硬件消抖示意

2.6 天巧星按键原理图
天巧星开发板有以下可用按键:
| 按键 | 引脚 | 电路方式 | 说明 |
|---|---|---|---|
| KEY1 | PA24 | 上拉,按下接 GND | 用户按键 |
| KEY2 | PB24 | 上拉,按下接 GND | 用户按键 |
| ENTER | PB21 | 上拉,按下接 GND | 确认键 |
| BACK | PA18 | 下拉,特殊功能 | BSL 引脚,慎用 |
⚠️警告
PA18 为 BSL(Bootstrap Loader)功能引脚。 芯片上电时如果 PA18 为高电平,将进入 BSL 模式,导致之前下载的程序无法正常执行。天巧星上 PA18 配置为下拉,BACK 按键按下时为高电平。
使用建议:日常开发中尽量避免使用 PA18 以免误触发 BSL 模式。
本实验使用 KEY1(PA24) 和 ENTER(PB21) 作为输入按键。
2.7 按键输入配置
工程继承LED章节的 empty 工程。
2.7.1 SysConfig 配置
在 .syscfg 中添加 LED 和按键的 GPIO 配置。如果已有 LED 配置,只需新增按键部分。
再次点击 ADD 添加第二组 GPIO,配置按键参数:
| 类别 | 参数 | 设置值 | 说明 |
|---|---|---|---|
| 端口配置 | Name | KEY | 自定义实例名称 |
| 引脚 A24 | Name | A24 | 引脚名称 |
| Direction | Input | 输入模式 | |
| Internal Resistor | Pull-Up Resistor | 上拉电阻(默认高电平) | |
| Assigned Port | PORTA | 对应 PORTA | |
| Assigned Pin | 24 | 对应 PA24 | |
| 引脚 B21 | Name | B21 | 引脚名称 |
| Direction | Input | 输入模式 | |
| Internal Resistor | Pull-Up Resistor | 上拉电阻(默认高电平) | |
| Assigned Port | PORTB | 对应 PORTB | |
| Assigned Pin | 21 | 对应 PB21 |
点击查看截图 — SysConfig 按键引脚配置


保存后编译,SysConfig 生成对应宏:
- A24按键:
KEY_A24_PORT、KEY_A24_PIN - B21按键:
KEY_B21_PORT、KEY_B21_PIN
2.7.2 GPIO 输入相关函数
GPIO 输入读取函数
uint32_t DL_GPIO_readPins(GPIO_Regs* gpio, uint32_t pins)
读取指定引脚的当前电平状态。
- 返回值非零:引脚为高电平
- 返回值为零:引脚为低电平
示例:
// 读取 A24 按键(PA24)
if (DL_GPIO_readPins(KEY_A24_PORT, KEY_A24_PIN) == 0) {
// A24 按下(低电平)
}
// 读取 B21 按键(PB21)
if (DL_GPIO_readPins(KEY_B21_PORT, KEY_B21_PIN) == 0) {
// B21 按下(低电平)
}2
3
4
5
6
7
8
9
2.7.3 按键控制 LED 实验
实现功能:按下 A24 或 B21 按键时 LED 点亮,均松开时 LED 熄灭。
#include "ti_msp_dl_config.h"
int main(void)
{
SYSCFG_DL_init();
while (1) {
// 读取两个按键状态,任意按下为低电平
uint8_t a24_pressed = (DL_GPIO_readPins(KEY_A24_PORT, KEY_A24_PIN) == 0);
uint8_t b21_pressed = (DL_GPIO_readPins(KEY_B21_PORT, KEY_B21_PIN) == 0);
if (a24_pressed || b21_pressed) {
delay_cycles(640000); // 消抖延时约 20ms
// 再次确认仍有按键被按下
a24_pressed = (DL_GPIO_readPins(KEY_A24_PORT, KEY_A24_PIN) == 0);
b21_pressed = (DL_GPIO_readPins(KEY_B21_PORT, KEY_B21_PIN) == 0);
if (a24_pressed || b21_pressed) {
DL_GPIO_clearPins(LED_PORT, LED_B22_PIN); // LED 亮
}
} else {
DL_GPIO_setPins(LED_PORT, LED_B22_PIN); // LED 灭
}
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2.7.4 按键翻转 LED 实验
实现功能:每按一次 A24 或 B21 按键,LED 状态翻转一次(亮→灭 或 灭→亮)。
#include "ti_msp_dl_config.h"
int main(void)
{
SYSCFG_DL_init();
while (1) {
uint8_t a24_pressed = (DL_GPIO_readPins(KEY_A24_PORT, KEY_A24_PIN) == 0);
uint8_t b21_pressed = (DL_GPIO_readPins(KEY_B21_PORT, KEY_B21_PIN) == 0);
// 检测任意按键按下
if (a24_pressed || b21_pressed) {
delay_cycles(640000); // 消抖 20ms
a24_pressed = (DL_GPIO_readPins(KEY_A24_PORT, KEY_A24_PIN) == 0);
b21_pressed = (DL_GPIO_readPins(KEY_B21_PORT, KEY_B21_PIN) == 0);
if (a24_pressed || b21_pressed) {
// 翻转 LED 状态
DL_GPIO_togglePins(GPIO_LED_PORT, GPIO_LED_PIN_PIN);
// 等待所有按键释放,避免重复触发
while (DL_GPIO_readPins(KEY_A24_PORT, KEY_A24_PIN) == 0 ||
DL_GPIO_readPins(KEY_B21_PORT, KEY_B21_PIN) == 0);
}
}
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
代码要点
- 两次读取之间的
delay_cycles(640000)实现了约 20ms 的软件消抖 while(...)等待所有按键释放,防止长按时 LED 反复翻转- 此实现为轮询方式,CPU 持续检测按键状态。更高效的方式是使用外部中断(见第 4 章)
2.8 GPIO 函数总结
| 函数 | 功能 | 参数 |
|---|---|---|
DL_GPIO_setPins(port, pin) | 输出高电平 | port:端口;pin:引脚掩码 |
DL_GPIO_clearPins(port, pin) | 输出低电平 | 同上 |
DL_GPIO_togglePins(port, pin) | 翻转电平 | 同上 |
DL_GPIO_readPins(port, pin) | 读取引脚状态 | 返回非零为高,零为低 |
DL_GPIO_enableOutput(port, pin) | 使能输出功能 | 部分场景需要额外调用 |
注意事项
- GPIO 引脚的功能由 SysConfig 在
SYSCFG_DL_init()中自动初始化,无需手动调用寄存器配置 - 不要手动修改
ti_msp_dl_config.c/h文件,它们由 SysConfig 自动生成,每次编译时会被覆盖 - 修改引脚配置应在
.syscfg文件中操作