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


    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 软件包所有组件的工程中,需要添加的文件及下载地址分别如下表

    复制代码
    值得注意的是 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
    ");
            rt_thread_mdelay(1000);
        }
        return 0;
    }
    
    MSH_CMD_EXPORT(test, this is a test app);
    复制代码

  • 相关阅读:
    springmvc整合elasticsearch
    测试中出现ERROR StatusLogger No log4j2 configuration file
    SpringBoot项目取消数据库配置
    centos7 更换jdk版本
    对前后端解耦的理解
    满足java对redis的所有操作,token,验证码过期时间等
    在spring的过滤器中注入实体类(@autowire会失效可使用这个方法)
    linux 下vim中关于删除某段,某行,或全部删除的命令
    解决问题Can’t connect to local MySQL server through socket
    centos6.5 mqtt安装
  • 原文地址:https://www.cnblogs.com/pudonglin/p/15194800.html
Copyright © 2020-2023  润新知