裸机STM32Letter Shell移植

文章详细介绍了如何在STM32平台上使用CubMx配置串口并开启中断,以及如何移植和配置letter-shell库进行命令行交互。同时,文章还展示了如何实现日志打印功能,并通过MobaXterm进行远程调试和测试。
摘要由CSDN通过智能技术生成

移植代码见: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

 日志参考:letter-shell/extensions/log at master · NevermindZZT/letter-shell · GitHubhttps://github.com/NevermindZZT/letter-shell/tree/master/extensions/log

 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,结果如下 ,

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
内置 "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) ;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值