RT-Thread移植到STM32F407

news2025/7/19 21:53:53

文章目录

      • 第一步:获取RT-Thread源码
      • 第二步:项目结构介绍
      • 第三步:拷贝示例代码到裸机工程
      • 第四步:删除无用文件
      • 第五步:修改工程目录结构
      • 第六步:添加工程文件路径
      • 第七步:编译
      • 第八步:修改配置文件
      • 第九步:编写测试程序
      • 第十步:重映射串口到rt_kprintf函数

第一步:获取RT-Thread源码

首先到rtthread官网下载rt-thread nano后解压

解压后打开后内容如下

image-20230220122328045

第二步:项目结构介绍

各文件夹的作用如下:

image-20230220154416566

第三步:拷贝示例代码到裸机工程

拷贝一份到Keil工程的工程根目录下,示例工程采用野火STM32F407霸天虎的使用固件库点亮LED灯的代码,示例代码可以去野火官网下载。

image-20230220155003917

第四步:删除无用文件

image-20230220155342542

  • bsp里面存放了不同板子的示例,我们只需要保留board.crtconfig.h这两个配置文件即可,其他的均可删除image-20230220154656677

  • docs存放了移植教程的地址,可以删掉

  • libcpu里存放与处理器相关的接口文件,因为本次是移植到STM32F407,所以我们只需要保留``libcpu/arm/cortex-m4`这一个文件夹即可,其他皆可删除。

  • 将rt-thread目录下的bsp文件夹下的board.c和rtconfig.h移动到USER目录下,USER存放供我们自行修改的一些文件。board.c和rtconfig.h是提供的配置文件

第五步:修改工程目录结构

  • 打开工程

  • 打开工程项目管理 Manage Project Items

  • 在Groups中选择USER,在右边Files中添加\rt-thread\rt-thread-3.1.3\bsp文件中的board.c文件

  • 在Groups中选择USER,在右边Files中添加\rt-thread\rt-thread-3.1.3\bsp文件中的rtconfig.h文件

  • 在Groups中选择新建,新建rtt/source组,在右边Files中添加\rt-thread\rt-thread-3.1.3\src文件夹中的所有.c文件

  • 在Groups中选择新建,新建rtt/port组,在右边Files中添加rt-thread\rt-thread-3.1.3\libcpu\arm\cortex-m3文件夹下的context_rvds.S和cpuport.c文件

  • 给工程添加头文件路径,凡是文件夹中包含.h文件,就需要将文件夹路径添加进去

          ..\rt-thread\rt-thread-3.1.3\components\finsh

           ..\rt-thread\rt-thread-3.1.3\include\libc

           ..\rt-thread\rt-thread-3.1.3\include

image-20230220123503429

第六步:添加工程文件路径

image-20230220162220577

第七步:编译

编译后发现没有RTE_Components.h这个文件,头文件 RTE_Components.h是在 MDK中添加 RT-Thead Package 时由 MDK 自动生成的,目前我们没有使用 MDK 中自带的 RT-Thread 的 Package,所以这个头文件不存在,如果包含了该头文件,编译的时候会报错,需要修改 rtconfig.h 头文件,将相关代码注释掉。

image-20230220162343073

打开rtconfig.h找到#include "RTE_Components.h"将其注释

image-20230220162617400

之后再编译一次

image-20230220162733983

这时候错误就剩下了三个了,提示是有三个中断函数重复定义了。这时因为RT-Thread系统把这三个中断函数已经实现了,但是在stm32f10x_it.c这个文件中,也有这个三个中断函数,但是函数内是空的,没有实现。需要将 stm32f4xx_it.c 文件中的这个三个中断函数注释掉。
image-20230220163009173

image-20230220163049844

再编译一次,没有问题了

image-20230220163133486

第八步:修改配置文件

board.crtconfig.h是两个配置文件。

在文件目录下新建一个board.h文件并添加到工程目录中添加如下代码:

#ifndef __BOARD_H__
#define __BOARD_H__
 
/* STM32 固件库头文件 */
#include "stm32f4xx.h"
 
/* RT-Thread相关头文件 */
#include <rthw.h>
#include <rtthread.h>
 
/* 开发板硬件bsp头文件 */
#include "./led/bsp_led.h"
 
 
#endif /* __BOARD_H__ */

以后所有需要添加进工程的头文件添加到board.h中即可。

board.c中,因为刚才把头文件都添加到board.h中了,所以board.c中包含的头文件删除,添加#include "board.h"即可,main.c同理

注释或者删除和时钟相关的宏定义和时钟配置函数

image-20230220164149557

屏蔽掉rt_hw_board_init()函数中的 SystemCoreClockUpdate(); 和 _SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND ); 函数调用。

重新添加时钟初始化语句 SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND );

将LED初始化代码从主函数中剪切到时钟初始化语句下面。
image-20230220164842169

第九步:编写测试程序

RT-Thread中习惯使用动态内存堆新建线程,因此在rt_config.h中取消掉#define RT_USING_HEAP的注释

image-20230220165159811

现在我们可以使用动态内存堆新建线程了

将下述代码拷贝到main.c中,编译下载可以看到红灯和绿灯交替闪烁,系统移植成功。

#include "board.h"

/* 声明线程1、2入口函数 */
static void led1_thread_entry(void *parameter);
static void led2_thread_entry(void *parameter);

/* 定义线程控制块 */
static rt_thread_t led1_thread = RT_NULL;
static rt_thread_t led2_thread = RT_NULL;

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{
	/* 创建线程 */
	led1_thread = rt_thread_create("led1",/* 线程名字 */
									led1_thread_entry, /* 线程入口函数 */ 
									RT_NULL, /* 线程入口函数参数 */ 
									512, /* 线程栈大小 */ 
									3, /* 线程的优先级 */
									20); /* 线程时间片 */
	led2_thread = rt_thread_create("led2",/* 线程名字 */
									led2_thread_entry, /* 线程入口函数 */ 
									RT_NULL, /* 线程入口函数参数 */ 
									512, /* 线程栈大小 */ 
									3, /* 线程的优先级 */
									20); /* 线程时间片 */
	
	/* 启动线程 */
	if(led1_thread != RT_NULL)
		rt_thread_startup(led1_thread);
	else
		return -1;
	if(led2_thread != RT_NULL)
		rt_thread_startup(led2_thread);
	else
		return -1;
}
static void led1_thread_entry(void *parameter)
{
	while(1)
	{
		LED1_ON;
		rt_thread_delay(500);
		LED1_OFF;
		rt_thread_delay(500);
	}
}
static void led2_thread_entry(void *parameter)
{
	while(1)
	{
		LED2_OFF;
		rt_thread_delay(500);
		LED2_ON;
		rt_thread_delay(500);
	}
	
}
/*********************************************END OF FILE**********************/


第十步:重映射串口到rt_kprintf函数

在平时调试代码的时候,经常需要用到串口的打印功能。RT-Thread提供了一个专用的打印函数rt_kprintf(),该函数在kservice.c中声明,这个函数的功能和printf()一样。要实现串口打印功能,首先需要给工程添加串口初始化相关代码,串口初始化和裸机中串口的使用是一模一样的。这里串口只需要使能接收功能,发送功能和发送中断可以不使用。

image-20230220192958022

rt_kprintf通过调用rt_hw_console_output来进行打印,而rt_hw_console_output函数在kerveice.c中是一个空函数,因此需要我们自行定义该函数实现打印功能。

image-20230220192845009

在board.c中定义rt_hw_console_output函数,在定义该函数之前需要配置usart,并且在board.h中进行usart的初始化。

image-20230220193441485

效果如下:

image-20230220194300856

工程模板下载链接:https://pan.baidu.com/s/1oukbNZEwU54zANl8-TOBzQ?pwd=ir17

参考:本文为CSDN博主「嵌入式@hxydj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_20222919/article/details/110956288

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/368811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL进阶篇之视图/存储过程/触发器

今天我们主要来快速学习视图&#xff0c;存储过程&#xff0c;触发器四个方面的内容&#xff0c;一起加油学习吧&#xff0c;还有半年就有秋招了&#xff0c;要加快速度了&#xff0c;迫在眉睫&#xff0c;冲吧&#xff0c;兄弟们。 目录 1、视图 2、存储过程 3、存储函数 4、…

Linux系统Nginx下载和安装

文章目录golang学习面试网站Linux启动nginx参考Linux启动nginx版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/weixin_36755535/article/details/110…

使用GDAL进行坐标转换

1、地理坐标系与投影坐标系空间参考中主要包含大地水准面、地球椭球体、投影坐标系等几部分内容。地图投影就是把地球表面的任意点&#xff0c;利用一定数学法则&#xff0c;转换到地图平面上的理论和方法&#xff0c;一般有两种坐标系来进行表示&#xff0c;分别是地理坐标系和…

Free for photo container detection, container damage detect PaaS

集装箱箱号识别API免费&#xff0c;飞瞳引擎集装箱人工智能平台&#xff0c;可通过API二次开发或小程序拍照使用&#xff0c;可二次开发应用码头港区海关仓库口岸铁路场站船公司堆场&#xff0c;实现云端集装箱信息识别/集装箱箱况残损检测/好坏箱检验&#xff0c;高检测率/高实…

对话数字化经营新模式:第2届22客户节(22Day)年猪宴圆满结束!

2023年2月22日&#xff0c;由杭州电子商务研究院联合贰贰网络(集团)、TO B总监联盟等发起举办的“第二届客户节22Day”暨2022年度爱名奖 AM AWARDS颁奖及22年猪宴沙龙活动圆满结束。 &#xff08;主持人&#xff1a;杜灵芝&#xff09; 本次沙龙邀请到浙江工业大学管理学院程志…

windows版 redis在同意局域网下互联

项目场景&#xff1a; 同一局域网下各个主机互相连接同一个redis 问题描述 无法连接 原因分析&#xff1a; 没有放行对方的地址 解决方案&#xff1a; 修改配置文件 最重要的一步如下 然后把 redis.windows.conf的文件也照上面的修改一下保持一致 然后安装一下redis服务这…

腾讯在海外游戏和短视频广告领域的新增长机会

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 腾讯(00700)的收入在过去几个季度一直在下降&#xff0c;部分原因是由于新冠疫情导致的经济放缓以及中国监管机构对大型科技公司的监管收紧导致游戏行业萎缩造成的。 然而&#xff0c;猛兽财经认为&#xff0c;这些不利因素…

java 面试问题(一)

文章目录1、Iterator 怎么使用2、Iterator 和 ListIterator 有什么区别3、怎么确保一个集合不能被修改4、 队列和栈是什么5、什么是 Java 的内存模型6、Volatile 关键字的作用7、Volatile 与 Synchronized 比较8、ThreadLocal 介绍9、ThreadLocal 与 Synchronized 的区别10、哪…

十五、多路查找树

1、二叉树与B树 1.1 二叉树的问题分析 二叉树的操作效率较高&#xff0c;但是也存在问题&#xff0c;请看下面的二叉树 二叉树需要加载到内存中&#xff0c;如果二叉树的节点少&#xff0c;没有什么问题&#xff0c;但是如果二叉树的节点很多&#xff08;比如 1 亿&#xff…

使用antlr实现一个简单的表达式解析

背景 之前在做游戏的过程中&#xff0c;我们经常需要解析一些公式&#xff0c;比如(对方攻击值-对方防御值)*2这种表达式&#xff0c;我们习惯于用代码写死公式&#xff0c;但是这种方式不够灵活&#xff0c;我们想要的是一种灵活的解析方式&#xff0c; 只需要策划输入一个任…

教师管理系统的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;1.1 计算机管理教师的意义近年来&#xff0c;随着经济的发展&#xff0c;教育正面向着大型化、规模化的方向发展&#xff0c;教师数量急剧增加&#xff0c;有关教师的各种信息量也成倍增长。在这种情况下用计算机可使人们从繁重的劳…

微机原理复习(周五),计算机组成原理图

1.计算机由运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;输入设备&#xff0c;输出设备等5大基本部件组成。 2.冯诺依曼提出存储设计思想是&#xff1a;数字计算机的数制采用二进制&#xff0c;存储程序&#xff0c;程序控制。 3.计算机的基本组成框图&#xff1a…

什么是分组柱状图?

柱形图是我们做数据分析时最常用的图表类型之一&#xff0c;很多时候都需要制作分组展示的柱形图&#xff0c;以分类别的展示各种维度的数据情况。上文我已经介绍过堆叠柱状图&#xff0c;因此本文将分享分组柱形图的知识。 分组柱状图&#xff0c;又叫聚合柱状图。当使用者需要…

正点原子linux驱动篇

linux驱动开发与裸机开发的区别 裸机直接操作寄存器&#xff0c;有些mcu提供了库&#xff0c;但还是很底层 1、linux驱动开发直接操作寄存器很麻烦不现实&#xff0c;主要是根据linux驱动框架进行开发&#xff08;就是有很多操作都是一样的&#xff0c;我们只需要对一个程序模…

linux安装nodejs和微信小程序自动化部署操作

一.运行环境安装 Node.js 并且版本大于 8.0基础库版本为 2.7.3 及以上开发者工具版本为 1.02.1907232 及以上安装node.js(1).下载node包官网地址:https://nodejs.org/en/download/如果英文不好的,可以看中文网站:https://nodejs.org/zh-cn/download/点击上面的进行下载,当然,也…

国产音质好的蓝牙耳机有哪些?国产音质最好的耳机排行

随着时间的推移&#xff0c;真无线蓝牙耳机逐渐占据耳机市场的份额&#xff0c;成为人们日常生活中必备的数码产品之一。蓝牙耳机品牌也多得数不胜数&#xff0c;哪些国产蓝牙耳机音质好&#xff1f;下面&#xff0c;我们从音质出来&#xff0c;来给大家介绍几款国产蓝牙耳机&a…

Quartus II 的入门级使用

好久没有用VHDL写东西了&#xff0c;今天需要完成一个项目&#xff0c;重新复习一下新建工程新建工程file-->New Project Wizard, next, 选择存放的路径名字&#xff08;projecttop-level 名字要相同&#xff09;&#xff0c;next&#xff0c;File name名字同上&#xff0c;…

【一看就会】实现仿京东移动端页面滚动条布局

简单粗暴直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name"viewport" content&q…

matlab simulink 模糊控制蔬菜气雾栽培营养液供给自动监控

1、内容简介略-可以交流、咨询、答疑2、内容说明模型基本数学公式参考的是硕士论文摘要&#xff1a;随着社会的发展&#xff0c;世界人口逐渐增加&#xff0c;耕地面积日益减少&#xff0c;而且人们对 优质、安全、无污染的蔬菜需求也越来越高&#xff0c;植物工厂成为蔬菜栽培…

MyBatis学习笔记(五) —— MyBatis获取参数值的两种方式

5、MyBatis获取参数值的两种方式 MyBatis获取参数值的两种方式&#xff1a;${} 和 #{} ${} 的本质就是字符串拼接&#xff0c; #{} 的本质就是占位符赋值 ${} 使用字符串拼接的方式拼接sql&#xff0c;若为字符串类型或日期类型的字段进行赋值时&#xff0c;需要手动加单引号&a…