RT-Thread添加控制台与 FinSH

2 篇文章 0 订阅

添加 UART 控制台

1). 实现串口初始化

调用MX_USART1_UART_Init()函数

2). 使能

使能 RT_USING_CONSOLE 宏

3). 实现 rt_hw_console_output

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

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

添加 FinSH 组件

1). 添加 FinSH 源码

在这里插入图片描述

2). 使能

在 rtconfig.h 中添加 #define RT_USING_FINSH 宏定义;
为了封装到一个文件中,我将RT_USING_FINSH 放在一个头文件中定义,然后在 rtconfig.h 中包含(#include "TTY/tty.h"

3). 实现 rt_hw_console_getchar

char rt_hw_console_getchar(void)
{
  int ch = -1;

  if (__HAL_UART_GET_FLAG(pUartHandler, UART_FLAG_RXNE) != RESET)
  {
    ch = pUartHandler->Instance->DR & 0xff;
  }
  else
  {
    if(__HAL_UART_GET_FLAG(pUartHandler, UART_FLAG_ORE) != RESET)
    {
      __HAL_UART_CLEAR_OREFLAG(pUartHandler);
    }
    rt_thread_mdelay(10);
  }
  return ch;
}

4). 初始化

tshell线程默认并不会被创建,需要调用finsh_system_init函数创建,才能启动捕获用户输入的数据;如下所示:

void BSP_TTY_Init(void)
{
  finsh_system_init();
}

5). 链接脚本添加代码段(GCC)

当用户使用GCC构建项目时,完成前面的操作会出现如下图所示的编译错误:
在这里插入图片描述
需要在链接脚本(STM32F407IGTx_FLASH.ld)的代码段中,添加__fsymtab_start,__fsymtab_end,__vsymtab_start,__vsymtab_end,__rt_init_start,__rt_init_end等变量,如下所示:

  /* The program code and other data goes into FLASH */
  .text :
  {
    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)

    /* section information for finsh shell */
    . = ALIGN(4);
    __fsymtab_start = .;
    KEEP(*(FSymTab))
    __fsymtab_end = .;
    . = ALIGN(4);
    __vsymtab_start = .;
    KEEP(*(VSymTab))
    __vsymtab_end = .;
    . = ALIGN(4);

    /* section information for initial. */
    . = ALIGN(4);
    __rt_init_start = .;
    KEEP(*(SORT(.rti_fn*)))
    __rt_init_end = .;
    . = ALIGN(4);

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
  } >FLASH

演示

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值