RT-Thread 在stm小内存系列产品的nano+msh完整移植教程

本教程基于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. 使用Cube-MX搭建工程

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

之后同意安装即可。

1.2 生成工程

在cube-mx正常选完芯片型号后,进入RT-Thread组件的添加
选中芯片型号之后,点击 Additional Softwares,
进入 Additional Software Components selection 界面,
在 Pack Vendor 中选择 RealThread,
然后根据需求选择 RT-Thread 组件,
然后点击 OK 按钮

这里我因为要移植msh,将3个组件都选上,如果仅移植nano,只需要勾选kernel。

选择组件之后,对组件参数进行配置。在工程界面 Pinout & Configuration 中,进入所选组件参数配置区

1.3 时钟配置

配置一下时钟, cube-mx的基本操作,这里不讲。

1.4 配置MCU

这里要强调一下的是,串口要配置,串口配置后,会生成
HAL_UART_MspInit(huart);
里面的串口引脚配置,如果没有配置,可自行编写, 这是个弱回调函数。

如果需要其他外设,正常配置就好。
也可以后期自己写驱动。 推荐后期自己写。

1.5 中断配置

因为RTT中有占用3个中断,所以这里将这3个中断去掉, 或者在代码前加上 __weak 声明弱函数,

1.6 工程配置

cube-mx基本操作, 这里生成MKD5的工程,并打开。
到这里nano已经移植完成,可以正常使用多线程。但是我还要移植好用的msh命令行。

2. 串口驱动的移植

这是打开工程后已有的文件,话说官方的工程结构真的,无力吐槽。

2.1 添加RT-Thread串口驱动

在添加 nano 软件包所有组件的工程中,需要添加的文件及下载地址分别如下表

drv_usart.c https://github.com/RT-Thread/rt-thread/blob/v3.1.2/bsp/stm32/libraries/HAL_Drivers/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 https://github.com/RT-Thread/rt-thread/blob/v3.1.2/bsp/stm32/libraries/HAL_Drivers/config/l4/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文件。


2.2 注释头文件

在 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"

2.3 添加头文件

增加必要头文件
在 drv_usart.h 文件中,添加头文件如下

#include "stm32l1xx_hal.h"        //这里跟你你自己的工程添加,我的是stm32l1xx系列
#include "uart_config.h"
编译,这个时候如果有提示uart_dma.h 之类关于dma头文件没有找到的,就注释掉

2.3 修改 rtconfig.h

2.4 UART_INSTANCE_CLEAR_FUNCTION 报错

编译,如果出现以下错误
UART_INSTANCE_CLEAR_FUNCTION

进行全局搜索这个宏定义

发现这里并没有被打开,看一下条件,是要定义SOC_SERIES_STM32F1 , 定义成接近你芯片的宏好了,在rtconfig.h文件中定义

这时候UART_INSTANCE_CLEAR_FUNCTION宏定义被打开。

2.5 添加串口配置

在 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 注释掉。

2.6 shell配置

在 rtconfig.h文件中,
添加以下宏定义:
#define FINSH_THREAD_NAME "tshell"
#define FINSH_USING_HISTORY                //开启系统FinSH时:使用历史命令
#define FINSH_USING_SYMTAB                //开启系统FinSH时:定义该宏开启使用Tab键,未定义则关闭
#define FINSH_CMD_SIZE 80

编译,不报错。

2.7 最后一步

最后一步,删掉main函数中的所有内容,
尤其是
HAL_Init();
SystemClock_Config();
不然clock会有问题哦。

到这里,msh就已经移植好了。

3. 测试。

编写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);

原文地址:https://www.cnblogs.com/kmist/p/11829581.html

时间: 2024-08-29 22:43:10

RT-Thread 在stm小内存系列产品的nano+msh完整移植教程的相关文章

hdu 4521 小明系列问题——小明序列 (间隔至少为d的LIS 两种解法)

先附上资源地址:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂. 1. 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 2. 假定工厂的电力有限,一次只能供给一个车间使用.也就是说,一个车间开工的时候,其他车间都必须停工

Nginx 0.7.x + PHP 5.2.6(FastCGI)+ MySQL 5.1 在128M小内存VPS服务器上的配置优化

Nginx 0.7.x + PHP 5.2.6(FastCGI)+ MySQL 5.1 在128M小内存VPS服务器上的配置优化  大 | 中 | 小  [ 2008-10-28 16:55 | by 张宴 ] [文章作者:张宴 本文版本:v1.0 最后修改:2008.10.28 转载请注明原文链接:http://blog.zyan.cc/post/375/] VPS(全称Virtual Private Server)是利用最新虚拟化技术在一台物理服务器上创建多个相互隔离的虚拟私有主机.它们以最

ARM系列产品

ARM7系列 ARM9系列 ARM9E系列 ARM10E系列 SecurCore系列 Intel的StrongARM ARM11系列 Intel的Xscale 其中,ARM7.ARM9.ARM9E和ARM10为4个通用处理器系列,每一个系列提供一套相对独特的性能来满足不同应用领域的需求.SecurCore系列专门为安全要求较高的应用而设计. Axxia 4500通信处理器基于采用28纳米工艺的ARM 4核Cortex-A15处理器,并搭载ARM全新CoreLink CCN-504高速缓存一致性互

FPGA开发全攻略——FPGA发展以及赛灵思系列产品

原文链接: FPGA开发全攻略连载之八:从可编程器件发展看FPGA未来趋势 FPGA开发全攻略连载之九:FPGA主要供应商与产品(1) FPGA开发全攻略连载之九:FPGA主要供应商与产品(2) FPGA开发全攻略连载之九:FPGA主要供应商与产品(3) 可编程逻辑器件的发展历史可编程逻辑器件的发展可以划分为4个阶段,即从20世纪70年代初到70年代中为第1段,20世纪70年代中到80年代中为第2阶段,20世纪80年代到90年代末为第3阶段,20世纪90年代末到目前为第4阶段. 第1阶段的可编程

小明系列问题——小明序列

hdu4521:http://acm.hdu.edu.cn/showproblem.php?pid=4521 题解:给你一个序列,然后让你找一个最长上升子序列,但是这个最长上升子序列的数在原来序列的间隔不少于d. 题解:如果没有d的要求就是一个求最长上升子序列.这里用线段树可以来优化.以数的值来建树.维护一个sum值,num[rt].sum表示以rt值结尾的最长上升子序列的长度.同时f[i]表示以第i个数结尾的最长上升子序列的长度.对于d,我们只要再算第i个数的时候,只更新了前1到i-d-1个数

【转贴】内存系列二:深入理解硬件原理

内存系列二:深入理解硬件原理 https://www.cnblogs.com/tcicy/p/10087457.html 忘记转这一篇了 内存相关的东西 其实理解了挺好的.. cache还有main memory 本篇文章承接上文继续介绍DDR内存的硬件原理,包括如何寻址,时序和时延以及可以为提高内存的效能可以有哪些方法. 上次虽然解决了小张的问题,却引发了他对内存原理的兴趣.这不他又来找我了,说我还欠他一个解释.这次我们约在一个咖啡馆见面,这次内容有点深入,我带了些图片,小张也点了一大杯美式,

小明系列问题――小明序列(LIS)

小明系列问题――小明序列 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4521 Description 大家都知道小明最喜欢研究跟序列有关的问题了,可是也就因为这样,小明几乎已经玩遍各种序列问题了.可怜的小明苦苦地在各大网站上寻找着新的序列问题,可是找来找去都是自己早已研究过的序列.小明想既然找不到,那就自己来发明一个新的序列问题吧!

hdu4521 小明系列问题——小明序列(LIS变种 (线段树+单点更新解法))

链接: huangjing 题目:中文题目 思路: 这个题目如果去掉那个距离大于d的条件,那么必然是一个普通的LIS,但是加上那个条件后就变得复杂了.用dp的解法没有看懂,我用的线段树的解法...就是采用延迟更新的做法,用为距离要大于d啊,所以我们在循环到第i的时候,就对(i-d-1)这个点进行更新,因为如果在(i-d-1)这个点更新了,会对后面的造成影响,然后线段树的tree[]数组存的是以i结尾的最长lis,那么每次询问的时候就找最大的tree[]就可以了... 代码: 小明系列问题--小明

[转帖]快速激活最新JetBrains公司系列产品包括最新的phpstorm10

这个地址太牛了! 转自:http://www.gowhich.com/blog/714 快速激活最新JetBrains公司系列产品包括最新的phpstorm10 15 days ago durban IntelliJ IDEA开源社区 提供了如下通用激活方法: 注册时选择License server 然后输入框填写:http://idea.lanyus.com/ 然后点击 OK,就搞定了. JetBrains注册码计算: idea.lanyus.com/