添加 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