一种串口命令控制台的实现!

💡 原文中文,约9900字,阅读约需24分钟。
📝

内容提要

本文介绍了在低档次的STM32F系列MCU上使用串口Shell命令控制台的解决方案,具有硬件无关性、移植性强、支持自定义扩展能力、支持操作系统和非操作系统两种场景的应用等特点。文章还介绍了硬件无关、环境准备和代码介绍等内容,最后提供了添加自己的指令脚本的实现步骤。

🔎

延伸解读

硬件无关设计的实际意义

xc_shell 通过 TTYx_HANDLE 结构体将串口硬件抽象为统一接口,内核仅依赖该结构体指针。这意味着更换 MCU 或串口外设时,只需重写 bsp_ttyX.c 中的驱动函数,无需改动 Shell 内核。文章还指出,按此结构虚拟一个网络 TTY 对象,即可实现网络远程控制台,为后续扩展提供了明确路径。

资源占用与适用边界

文章明确该方案可裁剪到 1KB SRAM 和 4KB Flash,且仅在处理用户输入命令时占用 CPU,适合低档次 STM32F 系列 MCU。但功能增加会带来设计复杂度上升,例如 Ymodem 传输和 Flash 参数区管理需要额外代码与驱动支持。读者需根据实际 Flash 和 RAM 余量决定启用哪些模块。

自定义命令的扩展方式

CLI 命令通过 Cmd_Typedef_t 结构体描述,包含命令字符串、帮助信息、回调函数和期望参数个数。用户新增命令时,只需编写类似 shell_mcu.c 的脚本文件,定义命令结构体和链表节点,再在 main.c 中通过 CLI_AddCmd 注册即可。文章以读取 MCU Flash 大小和唯一 ID 为例,展示了从结构体定义到命令处理的完整流程。

调试前需注意的终端配置

xc_shell 使用“\r\n”作为命令结束符,而 SecureCRT 默认按 Enter 可能不会发送该组合,因此文章要求调整终端设置,并在仿真高级选项中开启本地回显。此外工程需使用微库并启用 C99 标准编译。这些配置若遗漏,可能导致命令无法识别或输入无回显,影响初次调试体验。

❓

Q&A

xc_shell 是什么?它主要用在什么场景?

xc_shell 是一种在低档次 STM32F 系列 MCU 上实现的串口 Shell 命令控制台解决方案,用于调试、维护和配置,例如启动/关闭调试模式、打印调试信息、配置系统参数和传输文件等。

xc_shell 如何做到硬件无关?

xc_shell 的串口驱动用一个结构体(TTYx_HANDLE)描述,内核通过指针指向该结构体对象与硬件关联,用户通过 API 发送/接收数据,并可通过注入回调函数处理接收帧,从而实现硬件无关。

xc_shell 支持哪些主要功能?

xc_shell 支持:硬件无关、强移植性、自定义扩展命令、操作系统和非操作系统场景、Ymodem 文件传输协议、Flash 扇区参数区用于本地/远程升级、LED 虚拟信号灯管理,以及基础的 LED 管理、调试模式设置、命令帮助和复位指令等。

如何添加自定义的 Shell 命令?

添加自定义命令需要:1) 编写命令脚本文件(如 shell_mcu.c),定义 Cmd_Typedef_t 结构体和 Cmd_List_t 链表节点;2) 将文件添加到工程;3) 在 main.c 中用 extern 引用链表;4) 在初始化时调用 CLI_AddCmd 添加命令到链表;5) 编译下载运行。

xc_shell 对资源占用有什么要求?

xc_shell 代码量少,可以裁剪到 1KB 的 SRAM 和 4KB 的 Flash,并且只有在处理用户输入命令时才会占用 CPU 资源。

使用 xc_shell 需要准备哪些软硬件环境?

硬件需要 STM32F103 系列开发板(带 USART1 接口)和 USB 转串口线;软件需要 MDK4.72 或以上版本和 SecureCRT 串口超级终端;配置上需将 SecureCRT 的 Enter 键设置为发送“/r/n”,并开启本地回显。

🏷️

标签

➡️

继续阅读