STM32标准库移植RT-Thread nano

embedded/2025/1/31 17:05:31/

STM32标准库移植RT-Thread Nano

哔哩哔哩教程链接:STM32F1标准库移植RT_Thread Nano

移植前的准备

  1. stm32标准库的裸机代码(最好带有点灯和串口)
  2. RT-Thread Nano Pack
  3. 自己的开发板

移植前的说明

本人是在读学生,正在学习阶段,移植过程中,会有疏漏与不足,请有缘看到的读者指出,且敬请谅解,我会积极更改错误之处

移植步骤

在这里插入图片描述

一、打开RT-Thread文档中心作为参考: RT-Thread文档中心

二、keil上安装RT-Thread Nano Pack

1.用Keil IDE内安装RT-Thread Nano Pack(在线安装)
(1)打开Keil,选择Pack Installer ,关闭提示窗口

在这里插入图片描述

(2)打开pack,选择安装(我这里已经安装所以显示Remove)

在这里插入图片描述

2.用离线安装包安装RT-Thread Nano Pack(离线安装)
(1)下载离线包:RT-Thread Nano Pack 离线安装包
(2)离线安装(双击下载好的安装包,进行安装)

在这里插入图片描述
在这里插入图片描述
表示安装完成

三、添加内核源码

在这里插入图片描述
通过以上三个步骤,完成勾选以后,点击OK,就可以完成内核的添加,在keil目录结构中,就能够看到如下所示的内容,表示内核添加成功
在这里插入图片描述

四、删除与逻辑冲突的中断相关的函数

stm32f10x_itc__30">1.打开stm32f10x_it.c 找到相关的中断的函数

在这里插入图片描述

2.对与逻辑冲突的中断的函数,进行注释或删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.添加systick的中断函数到board.c中
void SysTick_Handler()
{rt_interrupt_enter();rt_tick_increase();rt_interrupt_leave();
}

在这里插入图片描述

五、删除RT-Thread中的部分代码,添加系统的时钟配置

1.注释或删除以下一行代码:
 #error "TODO 1: OS Tick Configuration."

在这里插入图片描述

2.添加时钟配置
SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);

在这里插入图片描述

3.board.c中添加需要的头文件
#include "stm32f10x.h" 
#include "gpio.h"
#include "usart.h"
#include "delay.h"

在这里插入图片描述
通过以上步骤,就完成了在STM32标准库上进行RT-Thread Nano版本的移植,编译一下,0警告0错误
在这里插入图片描述

六、创建任务进行验证

1.在工程的user文件夹下,新建RT-Thread相关的头文件和源文件,并添加到工程中

在这里插入图片描述

2.编写user下的RT-Thread的源文件(我的是RT_Thread_demo.c)
(1)包含头文件
#include "stm32f10x.h" 
#include "RT_Thread_demo.h"
#include <rtthread.h>
#include "delay.h"
#include "gpio.h"
#include "usart.h"

在这里插入图片描述

(2)编写需要用到的宏定义
#define TASK1_PRIO      1                        /* 任务优先级 */
#define TASK1_STK_SIZE  128                       /* 任务堆栈大小 */
static rt_thread_t      Task1_Handler = RT_NULL;  /* 任务句柄 */
void Task1(void *pvParameters);             /* 任务函数 */#define TASK2_PRIO      2                        /* 任务优先级 */
#define TASK2_STK_SIZE  128                       /* 任务堆栈大小 */
static rt_thread_t      Task2_Handler = RT_NULL;  /* 任务句柄 */
void Task2(void *pvParameters);             /* 任务函数 */#define TASK3_PRIO      3                        /* 任务优先级 */
#define TASK3_STK_SIZE  128                       /* 任务堆栈大小 */
static rt_thread_t      Task3_Handler = RT_NULL;  /* 任务句柄 */
void Task3(void *pvParameters);             /* 任务函数 */

在这里插入图片描述

(3) 通过函数创建任务,并在main.c中调用
void RT_Thread_demo(void)
{Task1_Handler = rt_thread_create("Task1_Handler",Task1,RT_NULL,TASK1_STK_SIZE,TASK1_PRIO,20);rt_thread_startup(Task1_Handler);Task2_Handler = rt_thread_create("Task2_Handler",Task2,RT_NULL,TASK2_STK_SIZE,TASK2_PRIO,20);rt_thread_startup(Task2_Handler);Task3_Handler = rt_thread_create("Task3_Handler",Task3,RT_NULL,TASK3_STK_SIZE,TASK3_PRIO,20);rt_thread_startup(Task3_Handler);
}

在这里插入图片描述

(4) 编写任务函数
void Task1(void *parameter)
{while(1){LED1_Toggle;//printf("Task1\r\n");USART_SendString(USART1,(unsigned char*)"Task1\r\n");rt_thread_mdelay(300);}rt_thread_delay(10);
}void Task2(void *parameter)
{while(1){LED2_Toggle;//printf("Task2\r\n");USART_SendString(USART1,(unsigned char*)"Task2\r\n");rt_thread_mdelay(600);		}rt_thread_delay(10);
}void Task3(void *parameter)
{while(1){LED3_Toggle;//printf("Task3\r\n");USART_SendString(USART1,(unsigned char*)"Task3\r\n");rt_thread_mdelay(900);		}rt_thread_delay(10);
}

在这里插入图片描述

(5) 模块初始化

把用到的初始化函数都放在board.c的rt_hw_board_init 中
在这里插入图片描述
在这里插入图片描述

通过以上步骤,已经完成对RT_Thread的移植。接下来调试验证

七、移植rt_kprintf函数

1. 在rtconfig.h中修改部分代码
(1)定义 RT_USING_CONSOLE

在这里插入图片描述

(2)删除或注释 uart_init 中的部分代码并加入usart的初始化函数(board.c中)

在这里插入图片描述
在这里插入图片描述

(3)删除rt_hw_console_output部分代码并修改

在这里插入图片描述
函数修改为:

void rt_hw_console_output(const char *str)
{rt_enter_critical();while(*str != '\0')		{if(*str == '\n'){USART_SendData(RT_kprintf_USARTx,'\r');while(USART_GetFlagStatus(RT_kprintf_USARTx, USART_FLAG_TXE) == RESET);	//等待上一个字节发送完成}USART_SendData(RT_kprintf_USARTx, *str++);								//发送一个字节while(USART_GetFlagStatus(RT_kprintf_USARTx, USART_FLAG_TXE) == RESET);	//等待上一个字节发送完成}rt_exit_critical();
}

在这里插入图片描述

八、finsh组件的移植

1. 添加组件源码

在这里插入图片描述
keil的目录结构中,会出现如下文件
在这里插入图片描述

2. rtconfig.h 中打开 finsh 选项

在这里插入图片描述

3. 修改 finsh_port.c 文件
#include <rthw.h>
#include <rtconfig.h>
#include "stm32f10x.h"
#include "usart.h"#ifndef RT_USING_FINSH
#error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h 
#endif#ifdef RT_USING_FINSHRT_WEAK char rt_hw_console_getchar(void)
{int ch = -1;//查询方式实现,记得将Usart1初始化中的中断接收配置相关代码注释掉/*等待串口1输入数据*/if( USART_GetFlagStatus( RT_kprintf_USARTx, USART_FLAG_RXNE ) != RESET ){ch = ( int )USART_ReceiveData( RT_kprintf_USARTx );USART_ClearFlag( RT_kprintf_USARTx, USART_FLAG_RXNE );}else{if( USART_GetFlagStatus( RT_kprintf_USARTx, USART_FLAG_ORE ) != RESET ){USART_ClearFlag( RT_kprintf_USARTx, USART_FLAG_ORE );}rt_thread_mdelay( 10 );}return ch;
}#endif /* RT_USING_FINSH */
4. 修改串口的初始化函数
void uart1_init(uint32_t bound)
{GPIO_InitTypeDef GPIO_InitStructure;    //GPIOUSART_InitTypeDef USART_InitStructure;  //USARTNVIC_InitTypeDef NVIC_InitStructure;    //NVICRCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;    //USART1_TXGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;	    //USART1_RXGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);USART_OverSampling8Cmd(USART1,ENABLE);USART_InitStructure.USART_BaudRate = bound;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART1, &USART_InitStructure);         //初始化串口1USART_Cmd(USART1, ENABLE);                       //使能串口1
}

通过以上步骤,对RT-Thread Nano版本的移植到此结束,希望大家相互学习,相互鼓励!!!!

九、keil调试验证

详细调试步骤,请移步至哔哩哔哩视频教程:STM32F1标准库移植RT_Thread Nano

九、烧录到开发板验证

详细步骤,请移步至哔哩哔哩视频教程:STM32F1标准库移植RT_Thread Nano


http://www.ppmy.cn/embedded/158406.html

相关文章

冬天适合养什么鱼?

各位鱼友们&#xff0c;冬天来了&#xff0c;是不是还在为养什么鱼而烦恼&#xff1f;别担心&#xff0c;今天就来给大家好好推荐一些适合冬天养的鱼&#xff0c;让你的水族箱在寒冷的冬天也能生机勃勃&#xff01; 一、金鱼&#xff1a;冬日里的“小暖男” 金鱼绝对是冬季养鱼…

【Linux】 冯诺依曼体系与计算机系统架构全解

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具Linux下进度条 冯诺依曼体系是现代计算机设计的基石&#xff0c;其统一存储和顺序执行理念推动…

RK3568中使用QT opencv(显示基础图像)

文章目录 一、查看对应的开发环境是否有opencv的库二、QT使用opencv 一、查看对应的开发环境是否有opencv的库 在开发板中的/usr/lib目录下查看是否有opencv的库&#xff1a; 这里使用的是正点原子的ubuntu虚拟机&#xff0c;在他的虚拟机里面已经安装好了opencv的库。 二、…

LangChain:使用表达式语言优化提示词链

在 LangChain 里&#xff0c;LCEL 即 LangChain Expression Language&#xff08;LangChain 表达式语言&#xff09;&#xff0c;本文为你详细介绍它的定义、作用、优势并举例说明&#xff0c;从简单示例到复杂组合示例&#xff0c;让你快速掌握LCEL表达式语言使用技巧。 定义 …

从替代到覆盖:暴雨信创服务器打开市场新局面

进入2025年,全球局势更加变幻莫测,高科技领域越来越受到全球局势影响。美国前任总统拜登在卸任前,特别颁布限制GPU产品出口法案。新任总统特朗普上任第一天,废除了多项之前法案,但显示技术交流的内容一条没变。 在如此艰难的局面下,我国信创市场的发展显得尤为重要,国家也从政策…

分布式理解

分布式 如何理解分布式 狭义的分布是指&#xff0c;指多台PC在地理位置上分布在不同的地方。 分布式系统 分布式系**统&#xff1a;**多个能独立运行的计算机&#xff08;称为结点&#xff09;组成。各个结点利用计算机网络进行信息传递&#xff0c;从而实现共同的“目标或者任…

基于Go语言的三甲医院人机与智能体协同环境系统(上.文章部分)

一、引言 1.1 研究背景与意义 1.1.1 三甲医院对高效协同系统的需求 三甲医院作为医疗体系的核心力量,承担着疑难病症诊治、医学科研教学等重要任务,其业务具有高度的复杂性。在日常运营中,三甲医院涉及多个科室,每个科室又包含众多专业领域,各科室之间需要紧密协作,共…

Vue 3 中的计算属性:只读与可读写的使用与案例

在 Vue 3 中&#xff0c;计算属性&#xff08;Computed Properties&#xff09;是一种强大的工具&#xff0c;它允许我们根据响应式数据动态计算并返回一个新的值。计算属性具有缓存机制&#xff0c;只有当依赖的响应式数据发生变化时&#xff0c;才会重新计算。本文将详细介绍…