rt-thread nano移植msh/finsh

1、首先准备一个正常的工程
2、在keil中,将rtthread 的nano包加进工程中
3、 准备串口驱动

在这里插入图片描述
添加图中的文件进工程,记得添加相关路径。

先搞好
rt_hw_console_output 、 rt_hw_console_getchar这两个函数,具体代码如下:

void rt_hw_console_output(const char *str)
{
  rt_size_t i=0,size = 0;
  char a='\r';

  __HAL_UNLOCK(&huart1);

  size = rt_strlen(str);
  for(i=0;i<size;i++)
  {
    if(*(str+i)=='\n')
    {
      HAL_UART_Transmit(&huart1, (uint8_t *)&a, 1, 1);
    }
    HAL_UART_Transmit(&huart1, (uint8_t *)(str + i), 1, 1);
  }
}

char rt_hw_console_getchar(void)
{
    char ch = 0;

    while (rt_ringbuffer_getchar(&uart_rxcb, (rt_uint8_t *)&ch) != 1)
    {
        rt_sem_take(&shell_rx_sem, RT_WAITING_FOREVER);
    } 
    return ch; 
}

然后登记串口,具体代码如下:

rt_err_t uart_open(rt_device_t dev, rt_uint16_t oflag)
{
    return uart_init();
}

rt_size_t uart_read(rt_device_t dev,
                    rt_off_t    pos,
                    void       *buffer,
                    rt_size_t   size)
{
    while (1)
    {
        if (HAL_UART_Receive(&huart1, buffer, size, 20) == 0)
        {
            return size;
        }
				rt_thread_delay(1);
    }
}

rt_size_t uart_write(rt_device_t dev,
                     rt_off_t    pos,
                     const void *buffer,
                     rt_size_t   size)
{
    rt_size_t i = 0;
    char a = '\r';
    const char *val = 0;    
 
    val = (const char *)(buffer);
    
    __HAL_UNLOCK(&huart1);
 
    for (i = 0; i < size; i++)
    {
        if (*(val + i) == '\n')
        {
            HAL_UART_Transmit(&huart1, (uint8_t *)&a, 1, 20);
        }
        HAL_UART_Transmit(&huart1, (uint8_t *)(val + i), 1, 20);
    }
    return 1;
}

struct rt_device uart_dev;

static int uart_register(void)
{
    uart_dev.init  = uart_init;
    uart_dev.open  = uart_open;
    uart_dev.read  = uart_read;
    uart_dev.write = uart_write;
 
    rt_device_register(&uart_dev, "uart1", 0);
    return 0;
}
INIT_BOARD_EXPORT(uart_register);

完成之后,还不行,在rtconfig.h中需要配置,主要关注几个宏,

RT_USING_HEAP
RT_USING_CONSOLE
RT_CONSOLE_DEVICE_NAME "uart1"

如果在keil中复制出来的,则

#define RTE_USING_DEVICE
RT_USING_DEVICE
RT_USING_SERIAL

#define RTE_USING_FINSH
RT_USING_FINSH
FINSH_USING_MSH
FINSH_USING_MSH_ONLY
FINSH_USING_SYMTAB

以上这些宏必须要有定义

然后打开你的串口助手、终端工具等等、、
在这里插入图片描述
尽情体验,记得输入的时候,要加换行(enter)

发布了45 篇原创文章 · 获赞 52 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42312125/article/details/103938802