本教程基於CUBE-MX,搭建環境方便快捷,把更多精力用在移植的實現上。 ps:本次移植基於stm32l151, 理論上和F1系列通用, 和F4系列區別開來。 ps:純手工搭建環境也是可以,在一個可以輸出hello world的demo上進行移植。 ps: 基於官方移植思路,簡單快捷,但是要調整一些小細節。 源地址: https://www.rt-thread.org/document/site/tutorial/nano/mdk/an0031-nano-mdk/
https://www.rt-thread.org/document/site/tutorial/nano/cube/an0032-nano-mx5/
移植后的代碼已經托管到gitee,有需要可自行git https://gitee.com/insk/rtt_stm32l151
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.1 軟件包,選擇該軟件包,點擊 Install Now
之后同意安裝即可。
在cube-mx正常選完芯片型號后,進入RT-Thread組件的添加
選中芯片型號之后,點擊 Additional Softwares, 進入 Additional Software Components selection 界面, 在 Pack Vendor 中選擇 RealThread, 然后根據需求選擇 RT-Thread 組件, 然后點擊 OK 按鈕 這里我因為要移植msh,將3個組件都選上,如果僅移植nano,只需要勾選kernel。
選擇組件之后,對組件參數進行配置。在工程界面 Pinout & Configuration 中,進入所選組件參數配置區
配置一下時鍾, cube-mx的基本操作,這里不講。
這里要強調一下的是,串口要配置,串口配置后,會生成
HAL_UART_MspInit(huart);
里面的串口引腳配置,如果沒有配置,可自行編寫, 這是個弱回調函數。
如果需要其他外設,正常配置就好。
也可以后期自己寫驅動。 推薦后期自己寫。
因為RTT中有占用3個中斷,所以這里將這3個中斷去掉, 或者在代碼前加上 __weak 聲明弱函數,
cube-mx基本操作, 這里生成MKD5的工程,並打開。 到這里nano已經移植完成,可以正常使用多線程。但是我還要移植好用的msh命令行。
這是打開工程后已有的文件,話說官方的工程結構真的,無力吐槽。
drv_usart.c | |
drv_usart.h | https://github.com/RT-Thread/rt-thread/blob/v3.1.2/bsp/stm32/libraries/HAL_Drivers/drv_usart.h |
uart_config.h |
值得注意的是 uart_config.h,不同類型核心芯片的串口配置在 https://github.com/RT-Thread/rt-thread/blob/v3.1.2/bsp/stm32/libraries/HAL_Drivers/config 下,需要根據實際進行下載,其他倆個文件為公用文件。
>>>> 官方這里用的是L4的demo,所以他用L4的文件,但是我現在是stm32l151, 查看文件夾也沒有L1系列的,然后想了想,L1和F1系列差不多,就用了F1的文件。 >>>> 后期西葯驅動配置文件也在這里拷貝。 >>>> 根據自己手上的芯片尋找對應的系列。
例程將 drv_usart.h 與 uart_config.h 放置在 /Inc 文件夾下; 將 drv_usart.c 放置在工程目錄 /Src 文件夾下, 並且添加至工程 Application/User 目錄(也可以放置在其他目錄) 以上是官方的做法, 我們這里創建一個文件夾, 命名為 RT-Thread-driver,專門用於存放RTT驅動。 並且將drv_usart.h 和 drv_usart.c 放入其中, 注意在工程中添加頭文件路徑,基本操作,這里不講。 並且在工程中添加drv_usart.c文件。

在 drv_usart.c 文件中,注釋多余頭文件如下 //#include "board.h" //#include "drv_config.h" //#include <drv_log.h>
在 drv_usart.h 文件中,注釋多余頭文件如下 //#include <drv_common.h> //#include "drv_dma.h"
增加必要頭文件 在 drv_usart.h 文件中,添加頭文件如下 #include "stm32l1xx_hal.h" //這里跟你你自己的工程添加,我的是stm32l1xx系列
#include "uart_config.h"
編譯,這個時候如果有提示uart_dma.h 之類關於dma頭文件沒有找到的,就注釋掉

編譯,如果出現以下錯誤
UART_INSTANCE_CLEAR_FUNCTION
進行全局搜索這個宏定義
發現這里並沒有被打開,看一下條件,是要定義SOC_SERIES_STM32F1 , 定義成接近你芯片的宏好了,在rtconfig.h文件中定義
這時候UART_INSTANCE_CLEAR_FUNCTION宏定義被打開。
在 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未能初始化。 //添加在前面就沒關系,這里因為是官方沒有指明的地方。 //具體原因可以debug模式下,RT_CONSOLE == NULL? 的if分支不同。 //如果編譯報錯,就把extern 注釋掉。
在 rtconfig.h文件中, 添加以下宏定義: #define FINSH_THREAD_NAME "tshell"
#define FINSH_USING_HISTORY //開啟系統FinSH時:使用歷史命令
#define FINSH_USING_SYMTAB //開啟系統FinSH時:定義該宏開啟使用Tab鍵,未定義則關閉
#define FINSH_CMD_SIZE 80
編譯,不報錯。
最后一步,刪掉main函數中的所有內容,
尤其是
HAL_Init();
SystemClock_Config();
不然clock會有問題哦。
到這里,msh就已經移植好了。
編寫test.c 添加到工程中。
#include "app_rtthread.h"
int test(void) { while(1) { rt_kprintf("hello rtt\n"); rt_thread_mdelay(1000); } return 0; } MSH_CMD_EXPORT(test, this is a test app);