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

【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分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版