当前位置: 首页 > news >正文

RT-Thread移植到STM32F407

文章目录

      • 第一步:获取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);elsereturn -1;if(led2_thread != RT_NULL)rt_thread_startup(led2_thread);elsereturn -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

相关文章:

RT-Thread移植到STM32F407

文章目录第一步&#xff1a;获取RT-Thread源码第二步&#xff1a;项目结构介绍第三步&#xff1a;拷贝示例代码到裸机工程第四步&#xff1a;删除无用文件第五步&#xff1a;修改工程目录结构第六步&#xff1a;添加工程文件路径第七步&#xff1a;编译第八步&#xff1a;修改配…...

VR全景到底有多全能?为何屡受关注?

告别两年的“冰封”时期&#xff0c;现在疫情放开已经有一段时间了&#xff0c;各个行业的市场和经济已经逐步回暖&#xff0c;但是疫情对广大群众造成的心理阴影还是迟迟未有退散。就拿去电影院看电影来说&#xff0c;以前看电影是看心情&#xff0c;现在看电影则是看环境&…...

剑指 Offer 30. 包含min函数的栈

摘要 剑指 Offer 30. 包含min函数的栈 一、栈解析 package Stock;import java.util.Stack;/*** Classname JZ30min函数栈* Description TODO* Date 2023/2/24 18:59* Created by xjl*/ public class JZ30min函数栈 {/*** description 最小栈的含义是每次从栈中获取的数据都是…...

stm32f407探索者开发板(二十二)——通用定时器基本原理讲解

文章目录一、三种定时器的区别二、通用定时器特点2.1 功能特点描述2.2 计数器模式三、通用定时器工作过程四、附一、三种定时器的区别 STM32F40x系列总共最多有14个定时器 三种&#xff08;4&#xff09;STM32定时器区别 二、通用定时器特点 2.1 功能特点描述 STM3 F4的通…...

cmake 入门三 常用变量和指令

cmake常用变量 一、cmake 变量引用的方式&#xff1a; 前面我们已经提到了&#xff0c;使用${}进行变量的引用。在IF 等语句中&#xff0c;是直接使用变量名而不通过${}取值 二&#xff0c;cmake 自定义变量的方式&#xff1a; 主要有隐式定义和显式定义两种&#xff0c;一…...

Linux基础命令-find搜索文件位置

文章目录 find 命令介绍 语法格式 命令基本参数 参考实例 1&#xff09;在root/data目录下搜索*.txt的文件名 2&#xff09;搜索一天以内最后修改时间的文件&#xff1b;并将文件删除 3&#xff09;搜索777权限的文件 4&#xff09;搜索一天之前变动的文件复制到test…...

获取浏览器硬件资源的媒体数据(拍照、录音、录频、屏幕共享)

目录一、window.navigator 对象包含有关访问者浏览器的信息取二、MediaDevices1.使用麦克风2.使用摄像头&#xff08;和音频一样&#xff09;3.拍照4.录屏三、MediaRecorder(录制,可录制音频视屏)一、window.navigator 对象包含有关访问者浏览器的信息取 <!DOCTYPE html>…...

Java入门教程||Java 日期时间||Java 正则表达式

Java 日期时间java.util包提供了Date类来封装当前的日期和时间。Date类提供两个构造函数来实例化Date对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数&#xff0c;该参数是从1970年1月1日起的毫秒数。Date(long millisec)Date对象创建…...

详解八大排序算法

文章目录前言排序算法插入排序直接插入排序:希尔排序(缩小增量排序)选择排序直接选择排序堆排序交换排序冒泡排序快速排序hoare版本挖坑法前后指针版本快速排序的非递归快速排序总结归并排序归并排序的非递归实现&#xff1a;计数排序排序算法复杂度及稳定性分析总结前言 本篇…...

python库streamlit学习笔记

什么是streamlit&#xff1f; Streamlit是一个免费的开源框架&#xff0c;用于快速构建和共享漂亮的机器学习和数据科学Web应用程序。它是一个基于Python的库&#xff0c;专为机器学习工程师设计。数据科学家或机器学习工程师不是网络开发人员&#xff0c;他们对花几周时间学习…...

C/C++开发,无可避免的内存管理(篇一)-约束好跳脱的内存

一、养成内存管理好习惯 1.1 养成动态对象创建、调用及释放好习惯 开发者手动接管内存分配时&#xff0c;必须处理这两个任务。分配原始内存时&#xff0c;必须在该内存中构造对象&#xff1b;在释放该内存之前&#xff0c;必须保证适当地撤销这些对象。如果你的项目是c项目&am…...

在React项目中引入字体文件并使用

一、背景 设计稿里某些文字所用的字体&#xff0c;系统默认不支持。 比如设计需要的这个字体&#xff1a;EmerlandRegular&#xff0c;即使在css里将文字字体设置为他们&#xff0c;实际效果也显示不出来。 二、现象及原因 1、样式 2、期待效果 3、实际效果 实际上是因为这个…...

STM32 CubeMX按键点灯

本文代码使用 HAL 库。 文章目录前言一、按键原理图二、CubeMX 创建工程三、代码讲解&#xff1a;1. GPIO的输入HAL库函数&#xff1a;2. 消抖&#xff1a;3. 详细代码四&#xff0c;实验现象&#xff1a;总结前言 我们继续讲解 stm32 f103&#xff0c;这篇文章将详细 为大家讲…...

2023链动2+1模式到底是什么?带你了解核心规则

2023链动21模式到底是什么&#xff1f;带你了解核心规则 2023-02-24 梦龙 大家好&#xff0c;我是你们熟悉而又陌生的好朋友梦龙&#xff0c;一个创业期的年轻人 传统的直销模式产品低价高卖&#xff0c;消费者难以接受。虽然直销省去了传统流通渠道的中间环节&#xff0c;但…...

【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day14

大家好&#xff0c;我是陶然同学&#xff0c;软件工程大三今年实习。认识我的朋友们知道&#xff0c;我是科班出身&#xff0c;学的还行&#xff0c;但是对面试掌握不够&#xff0c;所以我将用这100多天更新Java面试题&#x1f643;&#x1f643;。 不敢苟同&#xff0c;相信大…...

K8S篇-搭建kubenetes集群

安装环境 这里使用pve虚拟机搭建三台centos机器&#xff0c;搭建过程参考: Centos篇-Centos Minimal安装 此次安装硬件配置 CPU&#xff1a;2C 内存&#xff1a;2G 存储&#xff1a;64G 环境说明 操作系统&#xff1a;Centos 7.9 内核版本&#xff1a;6.2.0-1.el7.elrepo…...

文本生成图像简述4——扩散模型、自回归模型、生成对抗网络的对比调研

基于近年来图像处理和语言理解方面的技术突破&#xff0c;融合图像和文本处理的多模态任务获得了广泛的关注并取得了显著成功。 文本生成图像&#xff08;text-to-image&#xff09;是图像和文本处理的多模态任务的一项子任务&#xff0c;其根据给定文本生成符合描述的真实图像…...

财务共享建设,为什么需要电子影像系统?

某集团作为投资性集团公司&#xff0c;业务遍布全国20多个省市&#xff0c;控股公司200余家&#xff0c;业务范围涉及火电、供热、风电、天然气天然气、水务、铁路、港口、酒店、地产等20多个细分行业。 伴随着集团企业的快速发展&#xff0c;某集团在管理中面临“点多、面广、…...

「RISC-V Arch」SBI 规范解读(下)

第六章 定时器扩展&#xff08;EID #0x54494D45"TIME"&#xff09; 这个定时器扩展取代了遗留定时器扩展&#xff08;EID #0x00&#xff09;&#xff0c;并遵循 v0.2 中定义的调用规约。 6.1 函数&#xff1a;设置定时器&#xff08;FID #0&#xff09; struct sbi…...

Android framework socketpair

简述 在Linux中&#xff0c;socketpair函数可以用于创建一对相互连接的、通信域为AF_UNIX的套接字&#xff0c;其中一个套接字可用于读取&#xff0c;另一个套接字可用于写入。可以使用这对套接字在同一进程内进行进程间通信&#xff08;IPC&#xff09;。 以下是使用socketp…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...