GD31F310 MDK5 移植 rt_thread nano

一、环境搭建

1.1 GD32F310的SDK安装

下载地址(下载后双击即可):https://www.keil.arm.com/devices/?q=GD32F310&vendor-search=

1.2 rt_thread nano 安装

下载地址(下载后双击即可):https://www.rt-thread.org/download/mdk/RealThread.RT-Thread.3.1.5.pack

1.3 移植参考

可以参考RTthread 官方文档:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/nano-port-keil/an0039-nano-port-keil

二、开始移植

2.1 GD32F310 可运行的工程准备

这里用的是GD32F310 HAL库。为了后续更好移植,使用EmbeddedBuilder 图形化配置MCU的外设。也就是说如果换了个板子或者需要改外设的配置,不需要改代码,只需要在EmbeddedBuilder 上进行可视化配置,然后生成代码就行。RT_THREAD 标准版的bsp 中 STM32就是这么开发的。非常方便。
EmbeddedBuilder 如何生成GD32F310 HAL库代码请参考这篇文章

2.2 裸机代码准备

可以使用gd32 的SDK 也可以参考2.1 生成裸机工程,以下是我用的逻辑工程
裸机工程

2.3 添加 RT-Thread Nano 到工程

打开已经准备好的可以运行的裸机程序,将 RT-Thread 添加到工程。如下图,点击 Manage Run-Time Environment。

MDK RTE

在 Manage Rum-Time Environment 里 “Software Component” 栏找到 RTOS,Variant 栏选择 RT-Thread,然后勾选 kernel,点击 “OK” 就添加 RT-Thread 内核到工程了。

3-2

现在可以在 Project 看到 RT-Thread RTOS 已经添加进来了,展开 RTOS,可以看到添加到工程的文件(我这里把SHELL也勾上了的。如果你不用可以不勾):
RT_THREAD NANO 添加到工程中

2.4 适配 RT-Thread Nano

1.在gd32f3x0_hal_it.c 文件中屏蔽掉以下2个中断 。void PendSV_Handler(void) SysTick_Handler(void)
RT-Thread 会接管异常处理函数 HardFault_Handler() 和悬挂处理函数 PendSV_Handler(),这两个函数已由 RT-Thread 实现,所以需要删除工程里中断服务例程文件中的这两个函数,避免在编译时产生重复定义。
SysTick_Handler(void) 待会儿会在board.c里面重写
在这里插入图片描述
2.修改board.C里面的函数

/*
 * Copyright (c) 2006-2019, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-05-24                  the first version
 */

#include <rthw.h>
#include <rtthread.h>
#include "gd32f3x0_hal_init.h"


#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/*
 * Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
 * the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
 */
#define RT_HEAP_SIZE (3000)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];

RT_WEAK void *rt_heap_begin_get(void)
{
    return rt_heap;
}

RT_WEAK void *rt_heap_end_get(void)
{
    return rt_heap + RT_HEAP_SIZE;
}
#endif

void SysTick_Handler(void)
{
    rt_interrupt_enter();
    
    rt_tick_increase();
    hal_sys_basetick_irq();

    rt_interrupt_leave();
}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

    if(SysTick_Config(g_systemcoreclock / RT_TICK_PER_SECOND)){
        /* capture error */
        while(1){
        }
    }
    NVIC_SetPriority(SysTick_IRQn, 0);
}
/**
 * This function will initial your board.
 */
void rt_hw_board_init(void)
{
    //#error "TODO 1: OS Tick Configuration."
    /* 
     * TODO 1: OS Tick Configuration
     * Enable the hardware timer and call the rt_os_tick_callback function
     * periodically with the frequency RT_TICK_PER_SECOND. 
     */
    /* NVIC Configuration */
#define NVIC_VTOR_MASK              0x3FFFFF80
#ifdef  VECT_TAB_RAM
    /* Set the Vector Table base location at 0x10000000 */
    SCB->VTOR  = (0x10000000 & NVIC_VTOR_MASK);
#else  /* VECT_TAB_FLASH  */
    /* Set the Vector Table base location at 0x08000000 */
    SCB->VTOR  = (0x08000000 & NVIC_VTOR_MASK);
#endif
      SystemClock_Config();
    
      msd_system_init();
      msd_clock_init();
      msd_gpio_init();
      msd_dma_init();
      msd_usart1_init();
    
    /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

#ifdef RT_USING_CONSOLE
static int gd32_uart_init(void)
{
    msd_usart1_init();
    return 0;
}
INIT_BOARD_EXPORT(gd32_uart_init);


void rt_hw_console_output(const char *str)
{
        rt_size_t i = 0, size = 0;
        char a = '\r';

        size = rt_strlen(str);
        for (i = 0; i < size; i++)
        {
            if (*(str + i) == '\n')
            {
                hals_uart_data_transmit(USART1, (uint32_t )a);
                while((hals_uart_flag_get(USART1, USART_FLAG_TC) == RESET));
            }
            hals_uart_data_transmit(USART1, (uint32_t)*(str + i));
            while((hals_uart_flag_get(USART1, USART_FLAG_TC) == RESET));
        }
}

char rt_hw_console_getchar(void)
{
    /* the initial value of ch must < 0 */
    int ch = -1;

    if (hals_uart_flag_get(USART1, USART_FLAG_RBNE) != RESET)
    {
        ch = hals_uart_data_receive(USART1);
    }
    else
    {
        rt_thread_mdelay(1);
    }

    return ch;
}

#endif




3.编译 0 Error(s), 0 Warning(s).双击工程名,打开.map文件 查看资源使用情况。 8K的RAM 没剩多少了。 已经么啥发挥的空间了。
编译完成
4.写个简单的灯闪程序试一下呢

/*
    \file  main.c
*/
/*
    Copyright (c) 2024, GigaDevice Semiconductor Inc.

    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this 
       list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright notice, 
       this list of conditions and the following disclaimer in the documentation 
       and/or other materials provided with the distribution.
    3. Neither the name of the copyright holder nor the names of its contributors 
       may be used to endorse or promote products derived from this software without 
       specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
OF SUCH DAMAGE.
*/
#include "gd32f3x0_hal.h"
#include "gd32f3x0_hal_init.h"
/* user code [global 0] begin */
#include "rtthread.h"
/* user code [global 0] end */

/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    /* user code [local 0] begin */
    /* user code [local 0] end */

//    msd_system_init();
//    msd_clock_init();
    /* user code [local 1] begin */

    /* user code [local 1] end */
    msd_gpio_init();
//    msd_dma_init();
//    msd_adc_init();
//    msd_i2c0_init();
//    msd_usart1_init();

    /* user code [local 2] begin */
    /* user code [local 2] end */

    while(1){
        /* user code [local 3] begin */
        hals_gpio_bit_toggle(GPIOA, GPIO_PIN_7);
//        hal_sys_basetick_delay_ms(1000);
        rt_thread_mdelay(1000);
        /* user code [local 3] end */
    }
}
/* user code [global 1] begin */

/* user code [global 1] end */


5.烧写进入,串口连上,shell 成功 开启 接下来可以愉快的玩耍了

在这里插入图片描述

6.如果你的外部晶振不是8M 这个地方需要改一下。这是个天坑
GD32F310 HAL库配置 24M外部晶振
7.关于RT THREAD NANO 的配置,也是可视化的。详细讲解请看官方文档,官方文档讲的非常清楚。有啥问题也可以给我留言。
RT THREAD NANO 配置

三、DEMO工程下载

下载链接去顶部
里面有我的提交记录,如果你安装了GIT可以看到,我一起打包了。
代码提交记录

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值