STM32CubeMX | STM32使用HAL库手动移植RTThread-Nano实时操作系统
目录
- STM32CubeMX | STM32使用HAL库手动移植RTThread-Nano实时操作系统
- 1、基础工程建立
- 2、移植rtthread-nano
- 3、添加finsh组件
1、基础工程建立
首先通过STM32CubeMX建立基础工程,首先开启RCC并将时钟配置到72M主频:
配置串口1用于调试打印:
在配置个LED灯的IO:
将HAL用到的系统滴答定时器切换成定时器7,因为SysTick定时器我们要给rtthread使用:
中断分组设置为4:
取消掉这三个函数的生成,因为rtthread已经把这三个函数生成好了:
最后输出工程:
2、移植rtthread-nano
从rtthread官网下载解压rtthread-nano源码并解压,我们移植需要以下文件:
将上图文件拷贝到工程目录,如下图所示:
需要将rtthread添加进工程的文件有:
- libcpu\arm\cortex-m3\cpuport.c
- libcpu\arm\cortex-m3\context_rvds.S
- src目录下的所有文件
- board.c
如下图所示:
然后添加头文件包含:
尝试初次编译,直接编译通过:
接下来还需要修改一下源码,适配HAL库。
首先检查一下rtconfig.h
配置文件的各项,在keil中打开可以切换为图像化配置,基本默认配置即可:
然后适配时钟,打开board.c
文件,找到rt_hw_board_init
函数,改为以下:
接着在main.c文件中写一个外设初始化的函数chip_init,将CUBE生成的外设初始化函数中该函数内,用rtthread初始化列表的形式进行外设初始化:
然后重定向rt_kprintf函数到串口1:
#ifdef RT_USING_CONSOLE
void rt_hw_console_output(const char *str)
{
HAL_UART_Transmit(&huart1, (uint8_t *)str, rt_strlen(str), 100);
}
#endif
#ifdef RT_USING_FINSH
char rt_hw_console_getchar(void)
{
/* Note: the initial value of ch must < 0 */
int ch = -1;
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
{
ch = huart1.Instance->DR & 0xff;
}
else
{
rt_thread_mdelay(10);
}
return ch;
}
#endif
main函数中创建一个LED灯的任务:
最后编译运行就可以了:
3、添加finsh组件
将finsh源码和头文件包含加入工程:
在rtconfig.h
中添加宏定义:
#define RT_USING_FINSH
将mian函数中的打印屏蔽掉,要不然不方便finsh的使用:
然后编译下载运行:
注意xshell的设置,rtthread是用\n作为回车换行,而xshell默认为\r\n才是回车换行,所以xshell需要这么设置才能正常显示rtthread的打印:
ends…