MCU上,没有一个像Linux或者DOS一样,通过命令行来操作,调试,实在是太不方便了,好在有大师已经写好了一个Letter-Shell,亲测好用,基于前后台的命令行控制的移植步骤介绍如下。
1. 下载源文件
https://github.com/NevermindZZT/letter-shell
程序的结构如下:
2. 准备STM32Cube生成程序框架
配置时钟,使能SWD,开启UART1用于SHELL和控制台交互,记得开启中断,SHELL要用。
3.导入Letter-Shell核心文件
这里新建了一个Group,取名为shell-letter,将核心文件导入,其中shell_port.c是需要自己编写的,适应自己的平台的移植文件,只需要改这个就行,另外还有一个cfg的头文件,是用于配置shell的。
4. 配置工程文件信息-头文件以及编译选项(重要)
第一步把新建的group的头文件包括进来
第二步(很重要)
加入以下这个Misc controls,否则导出命令会有问题,至今不知道这个选项是干啥的,也是搜了很久才发现,留待高手深究告诉我。
--keep shellCommand*
5. 编写移植文件shell_port.c
核心的代码如下,
/**
* @file shell_port.c
* @author Letter (NevermindZZT@gmail.com)
* @brief
* @version 0.1
* @date 2019-02-22
*
* @Copyright (c) 2019 Unicook
*
*/
#include "shell.h"
#include "main.h"
#include "shell_port.h"
#include "stdio.h"
#include "bmp280_drv.h"
Shell shell;
char shellBuffer[512];
uint8_t recv_buf = 0;
static float bmp280_t, bmp280_p;
/**
* @brief 用户shell写
*
* @param data 数据
*/
void userShellWrite(char data)
{
//调用STM32 HAL库 API 使用查询方式发送
extern UART_HandleTypeDef huart1;
HAL_UART_Transmit(&huart1, (uint8_t*)&data, 1, 0xFFFF);
}
/**
* @brief 用户shell读
*
* @param data 数据
* @return char 状态
*/
signed char userShellRead(char *data)
{
return 0;
}
/**
* @brief 用户shell初始化
*
*/
void User_Shell_Init(void)
{
extern UART_HandleTypeDef huart1;
//使能串口中断接收
HAL_UART_Receive_IT(&huart1, (uint8_t*)&recv_buf, 1);
shell.write = userShellWrite;
shellInit(&shell, shellBuffer, 512);
}
/* 中断回调函数 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
extern UART_HandleTypeDef huart1;
/* 判断是哪个串口触发的中断 */
if(huart ->Instance == USART1)
{
//调用shell处理数据的接口
shellHandler(&shell, recv_buf);
//使能串口中断接收
HAL_UART_Receive_IT(&huart1, (uint8_t*)&recv_buf, 1);
}
}```
我自己编写的一些例子
```c
/* 系统重启 */
int reboot(int argc, char *agrv[])
{
HAL_NVIC_SystemReset();
printf("%dparameter(s)\r\n", argc);
for (char i = 1; i < argc; i++)
{
printf("%s\r\n", agrv[i]);
}
return 0;
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), reboot, reboot, reboot);
/* 不优化宏定义 试试(能用)SHELL_USING_CMD_EXPORT == 1需要把这个打开 */
int func(int argc, char *agrv[])
{
printf("%dparameter(s)\r\n", argc);
for (char i = 0; i < argc; i++)
{
printf("argument %d --- %s\r\n", i, agrv[i]);
}
return 0;
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0