上一篇已经完成在cubemx中添加rtt内核源码,这一篇来简单的添加Finsh控制台;
STM32CubeMX+RTThread 生成Keil5工程
一、添加Finsh源码
step 1
step 2
step 3
![](https://i-blog.csdnimg.cn/blog_migrate/76a851148e2a8f122dbe84ed12941643.png)
二、配置串口、生成工程
step:配置串口1为异步串口,其他参数保持默认值;PA9(TX)、PA10(RX)
三、添加代码
(以下代码直接添加即可,不需要更改源码,因为源码函数定义为__weak类型)
step 1
由于SYS时钟,我也选择了滴答定时器,RTT也是使用滴答定时器,所以为了防止复用;需要将HAL库的几个函数重新实现一下,替换为tt的接口。
//配置定时器
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
return HAL_OK;
}
//获取滴答值
uint32_t HAL_GetTick(void)
{
return rt_tick_get();
}
//毫秒延时
void HAL_Delay(uint32_t Delay)
{
rt_thread_mdelay(Delay);
}
step 2
添加Finsh输入输出函数。(rtt内核源码均仅使用换行符,没有回车符,故需要在输出接口处实现回车换行)
void rt_hw_console_output(const char *str)
{
rt_size_t size = rt_strlen(str);
uint8_t *ch = 0;
for(rt_size_t i = 0; i < size; i++)
{
ch = (uint8_t *)(str + i);
if(*ch == '\n')
{
HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 2, 1);
continue;
}
HAL_UART_Transmit(&huart1, ch, 1, 1);
}
}
char rt_hw_console_getchar(void)
{
uint8_t ch = 0;
if(HAL_UART_Receive(&huart1, &ch, 1, 1) == HAL_OK)
{
return ch;
}
return ch;
}
* 一些bug
程序跑不起来?
- 可能HAL那几个滴答时钟的函数没有重新实现,在死等。
- 可以如上所说,重现那几个函数,如果不愿意,可以修改SYS定时器为TIMx;
时钟不对?
- 这是由于时钟初始化的问题,由于rtt在main函数之前还插入了一个$Sub$$main,对板子硬件的初始化在board.c中的rt_hw_board_init()中,所以在这里就要初始化时钟了;修改如下:
——end