目录
基本说明
该项目基于别人开源的shell命令行解释器更改来的,我将它完全模块化,以便不同工程使用。
目前我这个源码对于STM32F1系列单片机的使用非常方便,基本不需要修改什么东西就可以直接用,省去了繁琐的配置和移植。
如果需要更多的功能或者修改一些必要的代码,请转至原作者的文章地址。
注意:本源码需要原工程没有串口配置文件,否则有可能会造成冲突,这个时候就需要你去重新配置串口文件,当前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指令里面显示的命令就会有命令解释了。
结尾
写文不容易,如果这篇文章对你有帮助,就点赞收藏吧,并在此感谢源码作者。