Funpack5-1 - 基于FRDM-MCXA346串口实现SHELL控制板载LED
该项目使用了FRDM-MCXA346,实现了SHELL控制板载LED的设计,它的主要功能为:一个简易的交互式SHELL(命令行界面)。用户可以通过串口终端工具(如PuTTY、Tera Term或IDE内置终端)输入特定的文本命令,从而远程控制开发板上板载RGB LED的开关以及亮度调节。
标签
Funpack活动
串口
点灯
GPIO
FRDM-MCXA346
Shell
Funpack5-1
CTIMER
MCX-A346
鲜de芒果
更新2026-03-13
15

一、项目介绍

本项目旨在利用恩智浦(NXP)FRDM-MCXA346开发板的串口通信功能,实现一个简易的交互式SHELL(命令行界面)。用户可以通过串口终端工具(如PuTTY、Tera Term或IDE内置终端)输入特定的文本命令,从而远程控制开发板上板载RGB LED的开关以及亮度调节。该项目是嵌入式系统中人机交互、外设驱动和实时系统应用的经典实践。


1.1 硬件介绍

  • 核心开发板:FRDM-MCXA346 开发板。
  • 主控MCU:基于Arm® Cortex®-M33内核的MCX微控制器系列,性能强劲,外设丰富。
    • 板载资源
    • 用户LED:通常为可编程RGB LED或独立的用户LED(如D1),支持PWM(脉冲宽度调制)调光功能。
    • 调试与串口:板载LPC-Link2调试器,提供了一个虚拟COM端口(VCOM),通过USB连接即可实现调试和串口通信,无需额外硬件。
    • 引脚扩展:提供Arduino兼容接口,方便功能扩展。


1.2 功能概览

通过串口SHELL,用户可执行以下命令:

  • help: 输出命令帮助信息。
  • echo : 输入回显
  • led on:点亮板载LED。
  • led off:熄灭板载LED。
  • led on red brightness :设置LED的亮度。为0-100之间的整数,0为最暗(熄灭),100为最亮。


1.3 设计思路

本项目采用模块化、层次化的设计思想:

  • 底层驱动层:利用MCUXpresso SDK或MCUXpresso IDE提供的硬件抽象层(HAL)或驱动程序,初始化LED所对应的GPIO(用于开关)和PWM(用于调光)模块,同时初始化用于通信的LPUART(低功耗UART)模块。
  • 中间件/应用层
    • 命令解析器:实现一个简易的命令行解析引擎。它负责从串口接收字符流,缓存为字符串,然后根据预设的关键词(如 led, on, off, brightness)进行分词和语义解析。
    • 命令执行器:根据解析出的命令和参数,调用底层驱动层的对应API函数,执行具体的硬件操作(如设置GPIO电平、改变PWM占空比)。
  • 用户接口层:通过串口终端提供清晰的命令输入提示符(如 MCXA346>)和命令执行结果的文本反馈(如 OK, LED is ON, Error: Invalid brightness value)。


二、功能实现

2.1 软件流程图


2.2 实现过程

串口接收与回显:

  1. 在main函数中的循环中,使用轮询方式接收字符。
  2. 将接收到的字符存入缓冲区,并同时回显到终端,实现 “所见即所得”。
/* 检查是否有数据可读 */
if (LPUART_GetStatusFlags((LPUART_Type *)BOARD_DEBUG_UART_BASEADDR) & kLPUART_RxDataRegFullFlag) {
/* 读取一个字符 */
receivedChar = LPUART_ReadByte((LPUART_Type *)BOARD_DEBUG_UART_BASEADDR);

/* 回显字符 */
LPUART_WriteByte((LPUART_Type *)BOARD_DEBUG_UART_BASEADDR, receivedChar);

/* 处理接收到的字符 */
if (receivedChar == '\r' || receivedChar == '\n') {
/* 如果是回车或换行符,说明命令输入完成 */
PRINTF("\r\n");

/* 解析命令 */
parseCommand(cmdBuffer, &parsedCmd);

/* 处理命令 */
processCommand(&parsedCmd);

/* 重置命令缓冲区和索引 */
memset(cmdBuffer, 0, CMD_BUFFER_SIZE);
cmdIndex = 0;

/* 重新显示命令提示符 */
PRINTF("mango@mcxa346:/$ ");
} else if (receivedChar == '\b' || receivedChar == 127) {
/* 如果是退格键,删除最后一个字符 */
if (cmdIndex > 0) {
cmdIndex--;
cmdBuffer[cmdIndex] = '\0';

/* 重新打印命令行,覆盖旧内容 */
PRINTF("\rmango@mcxa346:/$ %s", cmdBuffer);
/* 用空格清除剩余的旧字符 */
for (int i = cmdIndex; i < CMD_BUFFER_SIZE - 1; i++) {
PRINTF(" ");
}
/* 回到正确的光标位置 */
PRINTF("\rmango@mcxa346:/$ %s", cmdBuffer);
}
} else {
/* 普通字符,添加到命令缓冲区 */
if (cmdIndex < CMD_BUFFER_SIZE - 1) {
cmdBuffer[cmdIndex++] = (char)receivedChar;
}
}
}


命令解析器:

使用标准C库函数如 strtok, strcmp 对 cmdBuffer 中的字符串进行拆分和比较。

/* 解析命令名称 */
char *token = strtok(buffer, " ");
if (token != NULL) {
/* 复制命令名称 */
strncpy(cmd->cmd, token, sizeof(cmd->cmd) - 1);
cmd->cmd[sizeof(cmd->cmd) - 1] = '\0';

/* 解析参数 */
token = strtok(NULL, " ");
while (token != NULL && cmd->paramCount < MAX_PARAMS) {
/* 复制参数 */
strncpy(cmd->params[cmd->paramCount], token, sizeof(cmd->params[0]) - 1);
cmd->params[cmd->paramCount][sizeof(cmd->params[0]) - 1] = '\0';
cmd->paramCount++;

/* 获取下一个参数 */
token = strtok(NULL, " ");
}
}

/* 比较命令并执行相应操作 */
if (strcmp(cmd->cmd, "help") == 0) {
/* 帮助命令 */
PRINTF("\r\nAvailable commands:\r\n");
PRINTF(" help - Display this help message\r\n");
PRINTF(" echo <message> - Echo the message back\r\n");
PRINTF(" led <on/off> [color] [brightness] - Control LED (red/green/blue, default: red) with optional brightness (0-100)\r\n");
} else if (strcmp(cmd->cmd, "echo") == 0) {
/* 回显命令 */
for (int i = 0; i < cmd->paramCount; i++) {
PRINTF("%s ", cmd->params[i]);
}
PRINTF("\r\n");
}


LED控制驱动:

  • 开关控制:通过GPIO的 GPIO_PinWrite API设置高低电平。
// 点亮蓝色LED
LED_BLUE_ON();
// 熄灭蓝色LED
LED_BLUE_OFF();
  • 亮度控制:通过CTIMER模块的API,计算并设置占空比。占空比 = (brightness_value / 100.0) * PWM_period
status_t CTIMER_GetPwmPeriodValue(uint32_t pwmFreqHz, uint8_t dutyCyclePercent, uint32_t timerClock_Hz)
{
/* 计算PWM周期匹配值:(定时器时钟频率 / PWM频率) - 1 */
/* 减1是因为计数器从0开始计数 */
g_pwmPeriod = (timerClock_Hz / pwmFreqHz) - 1U;

/* 计算脉冲宽度匹配值 */
if (dutyCyclePercent == 0U)
{
/* 0%占空比:脉冲宽度大于周期,输出常高 */
g_pulsePeriod = g_pwmPeriod + 1U;
}
else if (dutyCyclePercent == 100U)
{
/* 100%占空比:脉冲宽度为0,输出常低 */
g_pulsePeriod = 0U;
}
else
{
/* 计算脉冲宽度匹配值:周期值 * (100 - 占空比百分比) / 100 */
/* 这里使用(100 - 占空比)是因为CTimer的PWM模式下,匹配时会翻转输出电平 */
g_pulsePeriod = (g_pwmPeriod + 1U) * (100 - dutyCyclePercent) / 100;
}

/* 返回成功状态 */
return kStatus_Success;
}

三、功能展示

连接与启动:

  1. 用USB线连接开发板至PC。
  2. 打开串口终端,选择正确的COM口,设置波特率115200。
  3. 复位开发板,终端显示欢迎信息及命令提示符。
=== FRDM-MCXA346 UART Shell Command ===
Type a command and press Enter.
Available commands: help, echo, led
mango@mcxa346:/$


命令交互示例:

用户输入(在MCXA346>后)

预期输出(开发板行为)

help

终端显示
Available commands:
help - Display this help message
echo - Echo the message back
led <on/off> [color] [brightness] - Control LED (red/green/blue, default: red) with optional brightness (0-100)

echo hello world!

终端显示: hello world!

led on

红色LED以50%亮度点亮,终端显示
LED command received:
Action: on
Color: red
Red led ON brightness = 50%

led off

红色LED熄灭,终端显示
LED command received:
Action: off
Color: red
Red led OFF

led on blue

蓝色LED点亮,终端显示
LED command received:
Action: on
Color: blue
Blue led ON brightness = 100%

led on green

绿色LED点亮,终端显示
LED command received:
Action: on
Color: green
Green led ON brightness = 100%

led on red 100

红色LED以最大亮度点亮,同时终端输出
LED command received:
Action: on
Color: red
Brightness: 100%
Red led ON brightness = 100%

led abc

终端显示
Error: Invalid action 'abc'. Must be 'on' or 'off'
Usage: led <on/off> [color] [brightness]



四、总结

本项目成功实现了基于FRDM-MCXA346开发板串口的简易SHELL交互,并完成了对板载LED的全面控制。通过本次实践,深入理解了以下要点:

  • 硬件抽象层(HAL)的应用:熟练使用SDK提供的API快速驱动GPIO、CTIMER、UART等外设,提高了开发效率。
  • 嵌入式系统中的交互设计:实现了稳定可靠的命令行解析机制,为更复杂的设备管理功能奠定了基础。
  • 系统集成与调试:掌握了在嵌入式环境中整合多个功能模块(串口I/O、命令解析、硬件控制)的方法,并通过串口打印进行有效调试。


展望与改进:

本项目框架具有良好的可扩展性。未来可在此基础上,轻松添加更多SHELL命令,以控制其他板载资源(如读取按键、温湿度传感器、控制蜂鸣器等),或实现简单的文件系统操作、网络状态查询等功能,最终演变为一个功能丰富的设备管理终端。此外,可以引入更强大的命令行解析库(如 getopt 或 cli 库),以支持更复杂的参数和选项。


五、参考资料

附件下载
FDRM-MCXA346_SHELL.zip
MCUXpressoIDE工程源码
团队介绍
业余电子爱好者
团队成员
鲜de芒果
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号