STM32F072RBT 移植 RT-Thread Nano 并添加 FinSH 组件
STM32F072RBT 移植 RT-Thread Nano 并添加 FinSH 组件
1. 使用 Cube-MX 搭建基本工程
1.1 获取 nano 软件包
要获取 RT-Thread nano 软件包,需要在 CubeMX 中添加 https://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc 。
具体步骤:进入打开 CubeMX,
从菜单栏 help
进入 Manage embedded software packages 界面,
点击 From Url 按钮,
进入 User Defined Packs Manager 界面,
其次点击 new,填入上述网址,然后点击 check


Check 通过后,OK 按钮由灰色变成蓝色,并且旁边有显示校验通过图标,点击 OK。
回到 User Defined Packs Manager 界面,再次点击 OK,Cube MX 自动连接服务器,获取包描述文件。
回到 Manage embedded software packages 界面,就会发现 RT-Thread nano 3.1.2 软件包,选择该软件包,点击 Install Now

上面会有多个版本可供选择,我这里使用的是 3.1.2 版本。
1.2 生成工程
-
选择具体的芯片型号后进入具体的配置界面
![image-20250224102825236]()
-
时钟配置(具体的配置方法可以查询相关资源,这里不用多说)
-
添加 RT-Thread Nano 软件并配置
![image-20250224103319448]()
![image-20250224103600555]()
![image-20250224104007368]()
![image-20250224105052399]()
-
HAL 时基定时器改选,因为 RT-Thread 会使用 Systick 作为时基,为避免两个组件使用同一个时基可能出现问题,这里需要将 HAL 的时基改选。
![image-20250224104838488]()
-
中断配置
![image-20250224105614967]()
-
串口外设配置
![image-20250224105931032]()
这里需要开启串口外设,供 FinSH 组件使用,这里有多个串口可供选择,我这里选择 USART1。
-
其他外设配置
如果你需要使用其他外设,如GPIO,直接开启并配置即可。
-
项目管理配置
Cube-MX 基本操作, 我这里选择生成 MKD5 的工程,生成并打开。
到这里 nano 已经移植完成,可以正常使用多线程。但是我还要移植好用的 msh 命令行。
2. 开始移植 FinSH 组件
2.1 串口驱动的移植
先看一下官方生成的项目结构,红框框中的是官方生成的文件,其他的是自行移植所添加的。

2.1.1 添加 RT-Thread 串口驱动
找到 RT-Thread 官方的代码仓库(rt-thread: RT-Thread是一个来自中国的开源物联网操作系统,它提供了非常强的可伸缩能力:从一个可以运行在ARM Cortex-M0芯片上的极小内核,到中等的ARM Cortex-M3/4/7系统,甚至是多核,64位的ARM Cortex-A,MIPS32/64处理器的功能丰富系统)

下载到本地后,找到stm32f072 对应的 bsp:



将上面需要拷贝的三个文件 drv_usart.c, drv_usart.h, uart_config.h 拷贝至上述文件夹下(RT-Thread_driver),并且不要忘记将源文件加入工程编译以及路径添加到编译路径集合里面。

这里我还加入了其他外设驱动文件,没有很大区别,按照自己移植的需求添加即可。
2.1.2 修改 rtconfig.h 文件

#define BSP_USING_UART1
#define SOC_SERIES_STM32F0
之所以需要定义上面两个宏定义,是因为 drv_usart.c 文件中引用这 2 个宏。


2.1.3 在 drv_usart.h 包含 uart_config.h 头文件

2.1.5 开启串口初始化
这里有两种方式开启串口初始化,一种是在 board.c 文件的函数 rt_hw_board_init 中,添加代码如下
#ifdef RT_USING_SERIAL
extern void rt_hw_usart_init();
rt_hw_usart_init();
#endif
//注意,代码添加在rt_console_set_device之前, 否则,好像shell是用不了的,应该是console未能初始化。
//添加在前面就没关系,这里因为是官方没有指明的地方。
另外一种是在 rt_hw_usart_init 函数下面使用官方宏 INIT_BOARD_EXPORT:
INIT_BOARD_EXPORT(rt_hw_usart_init);
我这里为图方便,直接使用 INIT_BOARD_EXPORT 宏了。添加之后,串口初始化会在这个函数内被调用。

2.1.6尝试编译工程
到现在编译工程,会出现一些报错信息,因为我们移植的文件中(前三个文件)包含一些我们没从仓库拷贝的头文件,这种情况下,有两个解决办法,一个是注释掉,另一个是拷贝并到项目工程中。这个看自己喜好,可以注释也可以拷贝。
2.2 将 main 函数中 HAL 初始化函数以及时钟配置函数转移到 rt_hw_board_init() 函数中。

注意:删掉main函数中的所有内容,尤其是 HAL_Init(); SystemClock_Config();
不然时钟会有问题。还有在 rt_hw_board_init 中需要添加相关函数声明来避免编译器警告。
2.3 编译工程
到这里,FinSH 组件已经移植好了。可以编译工程并烧录代码测试了。
3. msh 使用










浙公网安备 33010602011771号