RT-Thread nano在STM32F103上的移植指南
2025-10-17 来源:cnblogs
准备工作
裸机工程模板
移植之前需要准备一个STM32裸机工程,这个裸机工程要能使用串口发送数据、在串口中断中接收数据。因为后面移植之后主要用串口来验证程序。
RT-Thread 准备
使用的是3.1.5版本。下载地址:RTT官网
下载完成后,我们打开跟我们最相近的工程模板:stm32f103-msh
打开工程后,打开rtconfig.h的文件路径,把rtconfig.h复制到裸机工程中(如下图)。按这个方法,再把board.c复制到裸机工程中。

最后把RT-Thread中,除了bsp文件夹全部拷贝到裸机工程。
RT-Thread添加到工程
接下来要把复制过来的文件添加到工程,需要添加到工程的文件如下:
| 文件夹 | 作用 |
|---|---|
| src | 这是RTT内核的源码 |
| libcpuarmcortex-m3 | 需要把context_rvds.S和cpuport.c添加到工程 |
| componentsfinsh | finsh 控制台相关的文件 |
文件添加完成后,效果如下图
让工程包含头文件路径
| 文件夹 | 作用 |
|---|---|
| include | 必需的头文件 |
| includelibc | 必需的头文件 |
| componentsfinsh | finsh头文件路径 |
Finsh 函数实现
rt_kprintf
要实现rt_kprintf串口输出,需要重新实现rt_hw_console_output函数
void rt_hw_console_output(const char *str)
{
rt_size_t i = 0, size = 0;
char a = 'r';
size = rt_strlen(str);
for (i = 0; i < size; i++)
{
if (*(str + i) == 'n')
{
USART_SendData(USART1, (uint8_t)a);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{;}
}
USART_SendData(USART1, str[i]);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{;}
}
}
Finsh接收
Finsh的接收,我们使用的是中断方式,需要在rt_hw_board_init函数最后先创建一个信号量:
/* 创建一个动态信号量,初始值是0 */
g_finshSem = rt_sem_create('finshSem', 0, RT_IPC_FLAG_FIFO);
在串口中断中释放信号量:
void USART1_IRQHandler(void)
{
// uint8_t recv;
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
// recv = USART_ReceiveData(USART1);
rt_sem_release(g_finshSem); //释放信号量
}
}
finsh获取字符函数:
char rt_hw_console_getchar(void)
{
int ch = -1;
// 获取信号量
rt_sem_take(g_finshSem, RT_WAITING_FOREVER);
ch = USART_ReceiveData(USART1);
return ch;
}
这样一来,一旦串口接收中断收到数据,程序就马上在中断中释放信号量,rt_hw_console_getchar立即获得数据。
RT-Thread配置文件
我使用的配置文件详情
/* RT-Thread config file */
#ifndef __RTTHREAD_CFG_H__
#define __RTTHREAD_CFG_H__
// <<< Use Configuration Wizard in Context Menu >>>
// // // Default: 32 #define RT_THREAD_PRIORITY_MAX 32 // // Default: 1000 (1ms) #define RT_TICK_PER_SECOND 1000 // // Default: 4 #define RT_ALIGN_SIZE 4 // // Default: 8 #define RT_NAME_MAX 8 // // Using RT-Thread components initialization #define RT_USING_COMPONENTS_INIT // #define RT_USING_USER_MAIN // // Default: 512 #define RT_MAIN_THREAD_STACK_SIZE 512 //
// // // Default: enable kernel debug configuration //#define RT_DEBUG // // // Default: 0 #define RT_DEBUG_INIT 0 // // Diable Thread stack over flow detect //#define RT_USING_OVERFLOW_CHECK // //
// // // using hook //#define RT_USING_HOOK // // // using idle hook //#define RT_USING_IDLE_HOOK // //
// // Enables user timers #define RT_USING_TIMER_SOFT 1 #if RT_USING_TIMER_SOFT == 0 #undef RT_USING_TIMER_SOFT #endif // // Default: 4 #define RT_TIMER_THREAD_PRIO 4 // // Default: 512 #define RT_TIMER_THREAD_STACK_SIZE 512 //
// // // Using Semaphore #define RT_USING_SEMAPHORE // // // Using Mutex #define RT_USING_MUTEX // // // Using Event //#define RT_USING_EVENT // // // Using MailBox #define RT_USING_MAILBOX // // // Using Message Queue //#define RT_USING_MESSAGEQUEUE // //
// // // Please modify RT_HEAP_SIZE if RT_USING_HEAP is enabled #define RT_USING_HEAP // // // using small memory #define RT_USING_SMALL_MEM // // // using tiny size of memory //#define RT_USING_TINY_SIZE // //
// // // Using console #define RT_USING_CONSOLE // // // the buffer size of console // Default: 128 (128Byte) #define RT_CONSOLEBUF_SIZE 256 //
// // // Select this choice if you using FinSH #include 'finsh_config.h' // //
// // // using device framework //#define RT_USING_DEVICE // //
// <<< end of configuration section >>>
#endif
- 深化生态布局:纳芯微与RT-Thread睿赛德达成战略合作,共筑自主可控实时控制MCU/DSP体系
- 基于RT-Thread的物联网温控箱简易实现与技术集锦
- STM32与ROS通信:RT-Thread与rosserial的集成实践
- STM32 CM3/CM4 ------ startup.s 启动文件分析 ------ GCC RT-Thread Studio 版本
- RT-Thread Studio使用——创建工程并配置外部时钟
- 揭秘RT-Thread上的AUTOSAR CP系统
- 人形机器人敏捷开发新路径:RT-Thread以软件底座破解复杂系统难题
- 基于rt-thread studio实现lwip协议
- RT-Thread FAL 组件使用
- Ceva NeuPro-Nano NPU 在 2026 年嵌入式世界大会上 荣获人工智能奖
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策




