移植代码见:NevermindZZT/letter-shell: letter shell (github.com)https://github.com/NevermindZZT/letter-shell
用CubMx配置相应的串口,并开启中断
1、主要用到以下文件,删掉不需要的:
2、修改demo\stm32-freertos里面的文件
2.1删除demo\stm32-freertosSHELL_CFG_USER_H,并根据需要修该src文件下SHELL_CFG_H,
#ifndef SHELL_TASK_WHILE
/**
* @brief 是否使用默认shell任务while循环
* 使能此宏,则`shellTask()`函数会一直循环读取输入,一般使用操作系统建立shell
* 任务时使能此宏,关闭此宏的情况下,一般适用于无操作系统,在主循环中调用`shellTask()`
*/
#define SHELL_TASK_WHILE 0
#endif /** SHELL_TASK_WHILE */
#ifndef SHELL_GET_TICK
/**
* @brief 获取系统时间(ms)
* 定义此宏为获取系统Tick,如`HAL_GetTick()`
* @note 此宏不定义时无法使用双击tab补全命令help,无法使用shell超时锁定
*/
#define SHELL_GET_TICK() HAL_GetTick()
#endif /** SHELL_GET_TICK */
#ifndef SHELL_DEFAULT_USER
/**
* @brief shell默认用户
*/
#define SHELL_DEFAULT_USER "xt"
#endif /** SHELL_DEFAULT_USER */
2.2更改SHELL_PORT_C和SHELL_PORT_C
主要更改userShellWrite函数为对应的串口,还有userShellInit函数如下,注释其他不用的函数
/**
* @brief 用户shell写
*
* @param data 数据
* @param len 数据长度
*
* @return short 实际写入的数据长度
*/
short userShellWrite(char *data, unsigned short len)
{
// serialTransmit(&debugSerial, (uint8_t *)data, len, 0x1FF);
HAL_UART_Transmit(&hlpuart1, (uint8_t *)data, len, HAL_MAX_DELAY);
return len;
}
void userShellInit(void)
{
// shellMutex = xSemaphoreCreateMutex();
shell.write = userShellWrite;
// shell.read = userShellRead;
// shell.lock = userShellLock;
// shell.unlock = userShellUnlock;
shellInit(&shell, shellBuffer, 512);
// if (xTaskCreate(shellTask, "shell", 256, &shell, 5, NULL) != pdPASS)
// {
// logError("shell task creat failed");
// }
}
3.在main.c包含相应的头文件
#include "shell_port.h"
初始化userShellInit
/* USER CODE BEGIN 2 */
userShellInit();
/* USER CODE END 2 */
4.打开MobaXterm
查看电脑对应端口并配置相应波特率,运行结果如下
5.打印日志
开启发送中断
/* USER CODE BEGIN 2 */
userShellInit();
HAL_UART_Receive_IT(&hlpuart1, &lpuart_rx, 1);
/* USER CODE END 2 */
首先定义变量接收数据,中断函数里判断是否为当前串口,
uint8_t lpuart_rx;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &hlpuart1)
{
shellHandler(&shell, lpuart_rx);
HAL_UART_Receive_IT(&hlpuart1, &lpuart_rx, 1);
}
}
编译运行,打开中断按下Tap
1,实现log写buffer函数,2.定义log对象,3.注册log对象,将其写在 userShellInit中,
void uartLogWrite(char *buffer, short len)
{
// serialTransmit(&debugSerial, (uint8_t *)buffer, len, 0x100);
HAL_UART_Transmit(&hlpuart1, (uint8_t *)buffer, len, HAL_MAX_DELAY);
}
Log uartLog = {
.write = uartLogWrite,
.active = 1,
.level = LOG_ALL
};
/**
* @brief 用户shell初始化
*
*/
void userShellInit(void)
{
// shellMutex = xSemaphoreCreateMutex();
shell.write = userShellWrite;
// shell.read = userShellRead;
// shell.lock = userShellLock;
// shell.unlock = userShellUnlock;
shellInit(&shell, shellBuffer, 512);
// if (xTaskCreate(shellTask, "shell", 256, &shell, 5, NULL) != pdPASS)
// {
// logError("shell task creat failed");
// }
logRegister(&uartLog, NULL);
}
在mian.c写一个测试函数如下
#undef LOG_TAG
#define LOG_TAG "main.c" //打印时可以设置是那个文件
#undef LOG_ENABLE
#define LOG_ENABLE 1 //使能log, 该文件是否要设置LOG打印
void LOG_Test()
{
uint8_t i[4] = {0, 1, 2,3};
logPrintln("logPrintln");
logError("logError");
logWarning("logWarning");
logInfo("logInfo");
logAssert(1>2, logDebug("logDebug"));
logHexDumpAll(i, 4);
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE (SHELL_TYPE_CMD_MAIN), LOG_Test, LOG_Test, "LOG_Test");
编译运行,打开中断按下Tap,输入LOG_Test,结果如下 ,