你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32C0评测】移植nr_micro_shell

[复制链接]
lugl 发布时间:2025-4-21 22:55

【前言】

在进行调试和维护时,常常需要与单片机进行交互,获取、设置某些参数或执行某些操作,nr_micro_shell 正是为满足这一需求,针对资源较少的MCU编写的基本命令行工具。虽然RT_Thread组件中已经提供了强大的finsh 命令行交互工具,但对于ROM、RAM资源较少的单片机,finsh 还是略显的庞大,在这些平台上,若仍想保留基本的命令行交互功能,nr_micro_shell 是一个不错的选择。

nr_micro_shell 具有以下优点

1.占用资源少,使用简单,灵活方便。使用过程只涉及两个shell_init()和shell()两个函数,无论是使用RTOS还是裸机都可以方便的应用该工具,不需要额外的编码工作。

2.交互体验好。完全类似于linux shell命令行,当串口终端支持ANSI(如Hypertrm终端)时,其不仅支持基本的命令行交互,还提供Tab键命令补全,查询历史命令,方向键移动光标修改功能。

3.扩展性好。nr_micro_shell 为用户提供自定义命令的标准函数原型,只需要按照命令编写命令函数,并注册命令函数,即可使用命令。

【移植步骤】

1、在stm32cubeIDE中配置好串口2,并开启中断。

2、下载nr_micor_shell源码到本地,并在工程中新Middlewares/Third_Part文件夹,把源码复制到该目录下面:

image.png

3、把该目录头文件目录添加进工程中:

image.png

再把路径加入到工程中:

image.png

4、因为要用printf重定向,所以在uart.c中添加重定向的代码:

/* USER CODE BEGIN 1 */
#define CMD_BUFFER_SIZE 128

#ifdef __GNUC__
int _write(int fd, char *ptr, int len)
{
  HAL_UART_Transmit(&huart2, (uint8_t *)ptr, len, 0xFFFF);
  return len;
}

#endif
/* USER CODE END 1 */

5、添加用户函数shell_uart.c,主要是创建一个接收缓冲区,来实现对串口的接收,实现代码如下:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART2)   //shell
    {
        if(((g_shell_uart.rx.write_i+1)&0x1ff) != g_shell_uart.rx.read_i)
        {
            g_shell_uart.rx.buff[g_shell_uart.rx.write_i++] = uart_recv_buff[0] & 0xff;
            g_shell_uart.rx.write_i &= 0x1ff;//256Byte
        }
        HAL_UART_Receive_IT(huart,uart_recv_buff,1);//
    }
}


//
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART2)   //shell
    {
        HAL_UART_Receive_IT(huart,uart_recv_buff,1);//
    }
}

然后添加shell_usart_init()来初始化shell主要是就是初始化shell然后开启中断接收:

void shell_usart_init(void)
{
#ifdef UART_SHELL
#if UART_SHELL == 1
    userShellInit(); //LETTER_SHELL
#elif UART_SHELL == 2
    shell_init();   //NR_MICRO_SHELL
#endif
#endif
    HAL_UART_Receive_IT(&huart2,uart_recv_buff,1);//
}

最后添加loop函数用来响应shell的与用户的交互:

void shell_usart_loop(void)
{
    if(g_shell_uart.rx.read_i != g_shell_uart.rx.write_i)
    {
        shell(g_shell_uart.rx.buff[g_shell_uart.rx.read_i++]);
        g_shell_uart.rx.read_i &= 0x1ff; //256Byte
    }

}

6、在main.c中添加shell的初始化,并添加shell_usart_loop到while中:

image.png

实现效果:

下载到开发板后,就可以成功的打印出如下欢迎语:

image.png

收藏 评论0 发布时间:2025-4-21 22:55

举报

0个回答

所属标签

ST中文论坛活动

即日起开启活动话题入口,之后的活动统一都放在此处,欢迎大家的加入!


最新内容

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版