查看: 3438|回复: 0
收起左侧

教你动手移植RT-Thread到国产MCU

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-7-31 20:15:09 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-7-31 20:15 编辑

    现在芯片价格不断上涨,国内很多厂商也在不断的找替换方案。以ST为例,一个芯片涨了十几倍。蛋疼。。。。
    最近刚好有机会拿到国产芯片MCU--兆易创新的评估板(GD32350R)。板载资源如下:
    硬件        描述
    芯片型号        GD32F350R8T6
    CPU        ARM Cortex M4
    主频        108M
    片内SRAM        16K
    片内FLASH        64K
    下载器        GD-Link
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(1)

    拿到这个板子,首先肯定是去看看RT-THREAD是否已经包含这个BSP了,答案:没有这个GD32F350系列的BSP。那必须把他移植个RTT,然后PR一个BSP上去才行。

    移植M系列的BSP还是比较简单的,我主要分为六个步骤:
    • 环境搭建
    • BSP基础工程
    • 系统时钟
    • 串口驱动
    • 验证工程
    • 完成BSP总结。


    一、环境搭建

    GD-Link编程器:
    板载有GD-Link适配器。

    GD-Link编程器软件(GD Link Programmer),官网下载链接:http://www.gd32mcu.com/cn/download/7

    因为GD-Link,其实就是一个CMSIS DAP Debugger,所以我在移植过程中直接使用KEIL IDE进行调试,没有GD Link Programmer。
    安装KEIL5。

    安装GD32350的pack:GigaDevice.GD32F30x_DFP.2.1.0.pack,官网下载链接:http://www.gd32mcu.com/cn/download/7

    串口助手 - XShell。

    BSP基础工程
    其实移植RT-THREAD到一些比较通用的内核还是比较方便的,因为可以投机取巧。那接下来告诉你怎么投机取巧移植RT-Thread到国产MCU。

    本文只适配KEIL5的环境,GCC、KEIL4和IAR环境不做讲解。

    基础模板:首先看看RT-Thread代码仓库中已有的BSP已存在GD的多款芯片,Cortex-M3内核,Cortex-M4内核,RISC-V内核。而我要移植的是Cortex-M4内核。在原有的BSP中,gd32450z-eval就是一个Cortex-M4内核,所以只需要把它复制一份,并修改文件名为:gd32350r-eval。这样就有一个基础的工程。然后就开始增删改查,完成最终的BSP。

    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(2)

    配置Kconfig:修改根目录的Kconfig文件,修改内容如下图。①修改成对应的SOC名字,②因为GD32350R不包含SDRAM和只有两路串口,所以去除不相关的配置。

    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(3)

    链接脚本:修改KEIL5的连接脚本,因为GD32F350R8T6的flash大小为64K,SRAM大小为16K。所以要进行修改。其实这一步不修改也是可以的,可以在KEIL中设置,修改内容如下图:
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(4)
    修改库:
    下载官方的库文件,下载链接:http://www.gd32mcu.com/cn/download/7?kw=GD32F3

    删除BSP的Libraries目录下除了SConscript文件的其他内容

    然后解压复制目录(GD32F3x0_Firmware_Library_V2.0.2\SDK v2.0.2\GD32F3x0_Firmware_Library\Firmware)下的所有内容到BSP中Libraries目录的文件。

    修改Libraries中SConscript文件。修改内容如下:

    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(5)

    修改KEIL的模板工程。双击:template.uvprojx,如下图:
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(6)

    修改工程名:
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(7)

    修改FLASH和RAM的配置:
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(8)

    修改为对应芯片设备:
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(9)

    修改可执行文件名字:
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(10)

    修改优化等级为O3:
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(11)

    修改默认调试工具:CMSIS-DAP Debugger。
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(12)

    修改编程算法:GD32F3x0 FMC。
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(13)

    修改驱动文件夹,在drivers目录中除了board.c,board.h和SConscript文件保留,其他的全部删除。然后添加两个文件:drv_usart.c和drv_usart.h。

    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(14)

    修改驱动文件夹下的脚本SConscript。
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(15)

    添加gd32f3x0_libopt.h文件到BSP的drivers目录中,gd32f3x0_libopt.h存在固件库路径:\GD32F3x0_Firmware_Library_V2.0.2\SDK v2.0.2\GD32F3x0_Firmware_Library\Template。

    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(16)

    menuconfig配置。
    关闭套接字抽象层。
    -> RT-Thread Components
        -> Network
            -> Socket abstraction layer
                [ ] Enable socket abstraction layer
    关闭网络设备接口
    -> RT-Thread Components
        -> Network
            -> Network interface device
                [ ] Enable network interface device
    关闭LWIP协议栈
    -> RT-Thread Components
        -> Network
            -> light weight TCP/IP stack
                [ ] Enable lwIP stack
    关闭libc接口
    -> RT-Thread Components
        -> POSIX layer and C standard library
            [ ] Enable libc APIs from toolchain
    关闭虚拟文件系统
    -> RT-Thread Components
        -> Device virtual file system
            [ ] Using device virtual file system
    重新生成MDK5的工程,在env中执行:scons --target=mdk5.
    > scons --target=mdk5
    scons: Reading SConscript files ...
    scons: done reading SConscript files.
    scons: Building targets ...
    scons: building associated VariantDir targets: build
    CC build\applications\main.o
    CC build\drivers\board.o
    CC build\drivers\drv_usart.o
    CC build\kernel\components\drivers\misc\pin.o
    CC build\kernel\components\drivers\serial\serial.o
    CC build\kernel\components\drivers\src\completion.o
    CC build\kernel\components\drivers\src\dataqueue.o
    ....
    ....
    AS Libraries\CMSIS\GD\GD32F3x0\Source\ARM\startup_gd32f3x0.o
    CC Libraries\CMSIS\GD\GD32F3x0\Source\system_gd32f3x0.o
    LINK rtthread-gd32f3x0.elf
    fromelf --bin rtthread-gd32f3x0.elf --output rtthread.bin
    fromelf -z rtthread-gd32f3x0.elf
    scons: done building targets.
    修改board.h中ram的大小配置。将128修改为16即可。

    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(17)

    编译测试。双击:project.uvprojx文件
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(18)

    如果编译报如下错误,将所有的#include <gd32f4xx.h>修改为#include <gd32f3x0.h>。
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(19)

    然后就可以正常编译通过:
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(20)

    系统时钟

    提供给系统的是采用GD32的SysTick,代码如下,然后再rt_hw_board_init()函数初始化SystemClock_Config()。
    void SystemClock_Config(void)
    {
        SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
        NVIC_SetPriority(SysTick_IRQn, 0);
    }


    void SysTick_Handler(void)
    {
        /* enter interrupt */
        rt_interrupt_enter();


        rt_tick_increase();


        /* leave interrupt */
        rt_interrupt_leave();
    }
    通过keil进行在线调试,看看是否可以跑到main.c中。在main函数加个断点。然后全速执行,可以看到执行到我们设置的断点停住了,移植基本完成。
    CH32V CH573单片机芯片-教你动手移植RT-Thread到国产MCUrisc-v单片机中文社区(21)

    串口驱动

    一个基本的BSP中,串口是必不可少的,所以还需要编写串口驱动
    在GD32F350中有两组驱动:UART0和UART1。
    在RTT中只需要对接好串口框架中的(struct rt_uart_ops)即可。
    static struct rt_uart_ops usart_ops =
    {
        gd32_usart_configure,
        gd32_usart_control,
        gd32_usart_putc,
        gd32_usart_getc,
        gd32_usart_dma_transmit,
    };
    具体的代码就不过多描述,后面作者再出一篇串口驱动框架的文件。
    配置完串口,如果串口输出如下log,说明BSP已经制作完毕。
    \ | /
    - RT -     Thread Operating System
    / | \     4.0.4 build Jun 22 2021
    2006 - 2021 Copyright by rt-thread team
    msh >

    验证工程

    输入如下命令。查看是否有输出。

    完成BSP总结

    关于RT-THREAD的移植还是比较方便的,主要是复杂地方官方都已经做好了,如调度器。
    而作者移植的Cortex M4是一个比较通用的内核,rtt提供的libcpu已经包含了相关的内容,所以无需造轮子。
    关于GD这款芯片的评价,我觉得官方提供的库中,API太不优雅了。这个是指的改进的,就好比一个GPIO的API就多达15个。
    在上述中内容,除了适配了串口驱动,我还是适配了GPIO驱动,由于资源的问题,其他驱动我就没在适配了。
    关于兆易创新的GD32350R评估板的BSP目前我也已经提交到了RT-THREAD,应该过几天就可以merge到主仓库中。






    上一篇:第一百零六章:CH32V103应用教程——睡眠模式下串口数据传输
    下一篇:第一百零七章:CH32V103应用教程——PD0、1引脚的复用
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-27 04:23 , Processed in 0.815403 second(s), 48 queries .

    快速回复 返回顶部 返回列表