Funpack5-1 - 基于NXP FRDM-MCXA346 开发板实现RGB串口shell
该项目使用了NXP FRDM-MCXA346 开发板,实现了串口shell的设计,它的主要功能为:通过串口指令控制板载RGB led灯。
标签
嵌入式系统
Funpack活动
亚历鸽斯
更新2026-03-17
6

一、项目介绍

本项目旨在设计一款基于NXP FRDM-MCXA346 开发板的串口shell。本项目主要使用了NXP FRDM-MCXA346 开发板进行电脑端发送的串口数据接收,并处理串口指令,进行板载RGB led的控制。

f0de128a592e3cf14a2b7320689766bb.jpg

二、项目描述

1.项目基础功能为:使用MCXA346开发板的UART串口输出“Hello, DigiKey Funpack 5-1”

2.项目进阶功能为:使用MCXA346开发板实现一个带缓冲区的shell,核心是实现一个能读取、解析并执行用户输入命令的简易命令行解释器,并管理好输入缓冲区。能显示命令提示符(如 ysh > $),并循环接收用户输入(\n换行符为断句符号)。能管理好输入缓冲区,妥善处理字符,并能进行基本的命令解析。实现简单的指令控制板载的LED的颜色和亮灭

三、硬件介绍

本项目主要使用的硬件为:NXP FRDM-MCXA346 开发板

FRDM-MCXA346是一款紧凑且可扩展的开发板,可以快速基于MCX A346 MCU开展原型设计。它们提供行业标准的接口,可轻松访问MCU的I/O,配备集成的开放标准串行接口、外部闪存和板载MCU-Link调试器。

FRDM-MCXA346 是一款紧凑且可扩展的开发板,可让你快速基于FRDM-MCXA346微控制器单元(MCU)开展原型设计。它们提供行业标准的接口,可轻松访问MCU的I/O,配备集成的开放标准串行接口、外部闪存和板载MCU-Link调试器。通过 MCUXpresso Developer Experience提供其他工具,如面向附加板的扩展板中心和面向软件示例的应用代码中心。

image.png

四、方案框图

本项目的系统架构以 Cortex-M33 内核为中心,通过串口与上位机通信,数据流向如下:上位机发送字符数据→USB转串口 (MCU-Link) → MCX A346 shell → RGB LED 响应与上位机串口回显。

五、软件说明

本项目的主函数如下:

int main(void)
{
BOARD_InitHardware();
/* 初始化时关闭所有LED(高电平=灭) */
GPIO_PinWrite(GPIO3, LED_R_PIN, 1u);
GPIO_PinWrite(GPIO3, LED_G_PIN, 1u);
GPIO_PinWrite(GPIO3, LED_B_PIN, 1u);
PRINTF("Hello, DigiKey Funpack 5-1\r\n");
while (1)
{
shell_task();
}
}

首先进行硬件初始化,初始化串口、GPIO、系统时钟以及调试控制台。接着默认关闭RBG。默认高电平关闭。并通过串口打印欢迎内容"Hello, DigiKey Funpack 5-1\r\n"

在主循环中执行 shell_task() 函数。shell_task() 函数如下:

static void shell_task(void)
{
char ch = GETCHAR();
/* echo */
PUTCHAR(ch);
/* newline -> execute */
if (ch == '\r' || ch == '\n')
{
PUTCHAR('\r');
PUTCHAR('\n');
s_shellBuf[s_index] = '\0';
shell_cmd(s_shellBuf);
s_index = 0;
PRINTF(PROMPT);
return;
}
/* backspace */
if (ch == '\b' || ch == 127)
{
if (s_index > 0)
{
s_index--;
}
return;
}
/* normal char */
if (s_index < SHELL_BUF_SIZE - 1)
{
s_shellBuf[s_index++] = ch;
}
}

shell_task() 函数主要流程为:首先进行串口数据的字符接收并回显。

当检测到换行符的时候,在缓冲区末尾添加字符串结束符 '\0',调用 shell_cmd(s_shellBuf) 执行指令并清空缓冲区。

当检测到退格符的时候,如果缓冲区不为空(s_index > 0),将索引减一,实现逻辑上的字符删除。

若输入为普通字符,若缓冲区未满,将字符存入缓冲区 s_shellBuf 并递增索引。

具体 shell_cmd() 函数如下:

static void shell_cmd(char *line)
{
char *argv[5];
int argc = 0;
/* simple tokenize */
char *tok = strtok(line, " ");
while (tok && argc < 5)
{
argv[argc++] = tok;
tok = strtok(NULL, " ");
}
if (argc == 0)
return;
/* help */
if (strcmp(argv[0], "help") == 0)
{
shell_help();
}
/* led commands */
else if (strcmp(argv[0], "led") == 0)
{
if (argc >= 2 && strcmp(argv[1], "off") == 0)
{
/* 关闭所有 */
led_r = led_g = led_b = 0;
LED_Update();
}
else if (argc >= 3)
{
uint8_t state = (strcmp(argv[2], "on") == 0) ? 1 : 0;
if (argv[1][0] == 'r')
led_r = state;
else if (argv[1][0] == 'g')
led_g = state;
else if (argv[1][0] == 'b')
led_b = state;
LED_Update();
}
else
{
PRINTF("\r\nUsage: led r/g/b on|off or led off\r\n");
}
}
else
{
PRINTF("\r\nUnknown command\r\n");
}
}

shell_cmd() 功能包括:展示help内容、更改RGB led三个通道的亮灭、未知指令反馈。shell_cmd()通过 strtok 将输入按空格分割成最多5个参数,然后根据第一个参数进行分发(help、led或unknown)。

六、实物演示说明

将单片机通过usb插入电脑。打开串口助手,reset单片机。打印欢迎内容如下:

image.png

输入指令help,显示帮助内容:

image.png

输入led r on,控制红色通道单独点亮:

5ec158d266a82b289899b3285064cf35.jpeg

再次输入led b on,同时点亮红色、蓝色通道显示紫光:


e1894cd6d2e7629e658eb7f2318537e5.jpeg

再次输入led g on,同时点亮红绿蓝三个通道呈现白光:

eb30a813d9ef75ffcdf9f978b9f62ec3.jpeg

输入led off同时关闭三个通道:

d6eeb2f0539886b688502e255aca2a3e.jpeg

发送未知指令报错:

image.png

七、总结

首先感谢电子森林和恩智浦提供的平台和开发板,收藏品喜加一。

由于时间过于有限,因此仅完成了最简单的串口shell功能(

claude真是好东西。

以及恩智浦在入门引导这一块做得真是太好了,配环境过程极为舒适,最轮椅的一集,最速通关传说。恩智浦牛逼。


附件下载
frdmmcxa346_hello_world.zip
团队介绍
就我一个
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号