STM32F1的命令行解释器shell,单片机同系列移植便捷版

本文介绍了一款基于STM32F1系列单片机的命令行解释器shell的移植过程,包括详细步骤及注意事项。适用于新手与有一定基础的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

基本说明

文件说明:

移植说明

准备工作

shell源码

通信工具

移植

针对新手的详细移植

针对的有基础的人的移植

测试

写命令

命令中文解释

结尾


基本说明

该项目基于别人开源的shell命令行解释器更改来的,我将它完全模块化,以便不同工程使用。

目前我这个源码对于STM32F1系列单片机的使用非常方便,基本不需要修改什么东西就可以直接用,省去了繁琐的配置和移植

如果需要更多的功能或者修改一些必要的代码,请转至原作者的文章地址。

 原作者文章地址:适用stm32的命令行解释器shell_古么宁的博客-优快云博客_shell stm32

注意:本源码需要原工程没有串口配置文件,否则有可能会造成冲突,这个时候就需要你去重新配置串口文件,当前shell源码使用的是USART1串口。

文件说明:

shell.c:命令行相关,支持 table 键补全,支持上下左右箭头响应,提供参数解析,历史纪录。支持多个交互,如串口,telnet,或者usb,可各自建立交互。

ustdio.c:提供 printk 函数,重定义 printf 函数。

shell_control.c:与用户自定义命令有关,可以在里面自定义命令。

USART.c:与串口设置有关,会占用USART1串口,所以最好替换掉原来的串口配置文件。

移植说明

如果你是新手,那么移植请看目录里面的《针对新手的详细移植》。

如果有一定的基础,那么请看目录里面的《针对有基础的人详细移植》。

准备工作

首先需要准备一个STM32F1工程,这里我用一个空的工程模板来演示,其次准备好shell源码和通信工具。

shell源码

sehll源码:github

点进github链接,可以看见如图这几个文件,其中的SHELL文件夹里面就是我们需要的源码。

然后我们点击右上角的Code 。

 会出现一些下载选择,我们点击Download ZIP来下载shell源码。

 

 下载完成后解压,找到文件夹里面的SHELL文件夹,这里面存放的就是我修改过后的shell源码。

通信工具

通信工具:MobaXterm

同样点击github链接按照上面的方法下载ZIP后解压,得到MobaXterm1_CHS1.exe文件,点开这个可执行文件后点击会话夹,新建会话。

点击串口,设置波特率为230400,再点击高级串口设置,配置成如图。

再点击终端设置,点击里面的 终端字体设置。

 将里面配置成如图

 然后一直点击好的返回主界面,这个时候会自动给你开一个通信窗口,让你选择com端,我们直接关掉就好了。

这样,我们的准备工作就算完成了。 

移植

针对新手的详细移植

首先打开我们的工程。

 然后将刚刚下载的SHELL文件夹整个拷贝进去。

接着打开我们的工程,点击Manage Project Items。

 在工程内新建一个文件夹,名字与实际文件夹一样都是SHELL,这样方便管理。

 创建好后点击刚刚新建的文件夹,然后点击右侧的Add Files..

在这里将我们SHELL文件夹里面的src文件夹的.C文件都添加进去,点一下Add就可以了,然后点击右上角的×,可以看到,文件都顺利的添加进来了

 

 

添加重复了的话就是下图的样子,这样就需要点击×按键,全部清除后重新添加,没有重复的话,这一步忽略。

 完成添加后点击OK

然后点击我们的魔法棒工具,选择c\c++选项卡,找到include Paths,点击右边的三个点。 

 ​​​​​

 出现Folder Setup窗口,点击新建路径,然后设置路径,路径选择SHELL文件夹里面的inc文件夹,点击添加,然后可以看见我们将头文件添加进去了,点击两个OK关闭窗口

 

 

然后在主函数文件里用#include "shell_control.h"来调用shell头文件,初始化部分添加shell_init_all();指令,这是初始化shell的指令。 

  

这个时候就移植好了。

针对的有基础的人的移植

将文件夹复制到工程文件夹里面,添加SHELL文件夹里面src文件夹里面的.c文件到工程里面,添加SHELL里面的inc文件夹到工程头文件路径,然后在主函数文件里面调用头文件

指令:#include "shell_control.h"

在main函数里面添加初始化:shell_init_all();

 

这个时候就移植好了。

测试

将程序烧录到我们的板子上面,连接好USART1的TX和RX,打开我们准备工作里面的通信工具,双击准备工作时候新建的com端,会弹出对话框,在这里选择我们对应的串口号(我这里是COM6,每个人的串口号都不一定一样,所以以自己的为准),然后点击好的。

 

 可以看见出现了一个窗口,我们按下回车键(Enter),就会出现欢迎界面。

 

 就移植成功了。

写命令

这里只教如何简单的注册指令,具体复杂的请移步至原创作者文章。

打开我们的shell_control.c文件。

 

 滑到最下面,可以看见一个函数

 注册指令就放在这里,使用shell_register_command来注册,第一个字符串是通信工具输入的指令,第二个是检测到输入后要执行的函数。

我们新建一个命令,用来查看GPIO的运行状态。

首先输入注册指令,然后填入检测的指令,和执行的函数

先编写执行代码的框架,然后编写执行函数的内部代码

 具体内部代码就不多赘述了,然后就是编译和烧录。

现在我们来看看注册成功没有。

打开我们的通信工具,输入我们的help指令,可以看见出现了我们的指令(这个命令出现的中文解释后面介绍)。

这样我们就命令注册成功了。

现在来尝试一下,可以看见已经成功查看了GPIO引脚的输出电压数据。

命令中文解释

在shell中输入command-ID指令,会出现所以命令的ID将自己需要的记录下来。

在shell_control.c里面找到shell_control_explain函数的定义,

 在tab数组处添加刚刚记下来的ID,在str数组中写入关于该命令的解释。

注意:这两个数组是对应的关系,就比如说tab[0]的ID的命令对应的解释是str[0]的解释 

最后修改for循环里面的i<x(x表示有多少个指令),将x修改成当前指令的数量

 编译后烧录,然后help指令里面显示的命令就会有命令解释了。

结尾

写文不容易,如果这篇文章对你有帮助,就点赞收藏吧,并在此感谢源码作者。

内置 "cmd-list" 命令获取所有命令列表 支持 tab 键补全命令 支持 backspace 回退,这个在 putty 上有 bug ,还没修复。在secureCRT正常。 支持上下箭头回溯历史,这个功能没有做的很好; 支持左右箭头编辑当前命令行输入; 提供 shell_cmdparam()函数转换命令后所跟的数字参数(字符串转整型),详见 demo 提供 shell_option_suport() 函数,使命令行支持 getopt()函数,详见 demo 系统共有9个文件,全部与硬件无关,编译语言要在 C99 以上(keil 在 project -> Options .. -> c/c++ -> C99 勾上) kernel.h // 一些必要的宏定义 shell.c,shell.h //具体的命令行解释的实现 ustdio.c,ustdio.h //非标准输出文件,重新链接 printf ,并提供一个小巧型的 printk 函数 avltree.c,avltree.h //平衡二叉树支持,shell 默认用链表建立查询机制,有必要可在shell.h 中开启二叉树 getopt.c,getopt.h //网上找的 getopt() 源码 除了 getopt.c,getopt.h 两个文件是我从网上找的源码,主要实现命令行的 getopt()解析,其他的都是笔者所写。 使用: 1,首先把 shell.c ustdio.c 加入工程,这两个文件是必须的。 如果不用 getopt()函数可以不添加getopt.c文件。 shell默认使用链表来构建查询系统,但也提供了平衡二叉树的方式,在shell.h中有开启的开关,如不需要可以不添加avltree.c。 include "shell.h" 2,先对硬件进行基本的初始化。 撰写串口发送函数,形如 void usart_puts(char * str , uint16_t len) ; 调用函数 shell_init("shell >",usart_puts); //初始化shell的输入标志和默认输出指向 串口接收以包为单位。 3,新建全局变量 struct shell_input serial_shell ; 并初始化 SHELL_INPUT_INIT(&serial;_shell ,usart_puts);初始化输入缓存和输出交互; 4,串口接收到一整包函数后,调用 shell_input(&serial;_shell , packet , pktlen) ;
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值