锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【超级详细教程】移植 RT-Thread Nano到 GD32F10x系列

时间:2023-05-30 05:07:00 wl系列传感器wlcal5

对世界上大多数人来说,生活毫无意义,毫无价值。
– 季羡林

准备工作

  • 下载 RT-Thread Nano 源码:https://github.com/RT-Thread/rtthread-nano/archive/refs/heads/master.zip。
    最新版本是 3.15(写于2022-3-1)
  • 新建 GD32F10x系列的 裸机Keil工程
    这篇文章讲得很清楚,我就不赘述了。当然,你可以找到一个成功运行的人。keil工程也可以。
    【超详细教程】给 GD32F10x 系列建立keil工程
  • 最后的工程文件已经放在了 github 上面:GD32F10x_RTThread_Project
    如果使用 github 如果不方便,请关注微信官方账号嵌入式散修,回复 20220306可获得工程文件。
    在这里插入图片描述

移植 RT-Thread

实现RT-Thread的基本功能

其实通过安装更方便。 RT-Thread Nano pack 实现的方式:基于 Keil MDK 移植 RT-Thread Nano》。
但为了更好地理解在建筑工程中RT-Thread构建不同
芯片所需的组成和文件,所以我选择手动添加。

  • 在工程文件夹目录下新建名为 rtthread 将以下文件复制到目录:
  • 添加RT-Thread 所有内核通用代码到 keil 项目(也需要新建一个名称 rtthread 如下图所示:
    添加工程下 rtthread/src/ 文件夹中所有文件到工程;
    添加 rtthread/ 文件夹下的 board.c 。
  • 添加相应芯片的核心 CPU 移植文件和上下文切换文件
    因为这个芯片 GDF103C8T6 属于 ARM 的 Cortex-M3系列,因此需要添加相应系列的文件:内核 CPU 移植文件及上下文切换文件: cpuport.c (对于具体的芯片架构,如Cortex-M3)以及 context_rvds.S(芯片架构和ide,这个是在keil)。
  • 增加 rtthread 头文件路径:
  • 编译工程发现三个错误
    这三个中断函数的原因是RT-Thread已经定义好了,我们把它定义好了 gd32f10x_it.c 删除文件夹中重复的函数。
    根据编译的错误提示删除 void SysTick_Handler(void)void PendSV_Handler(void)void HardFault_Handler(void),再编译头发没有错。
  • 至此,RT-Thread 在 main.c 码入以下代码,可以看到 LED 灯闪烁着跳动的光,这种心跳表明工程已经完成了基本功能,可以开始快乐地玩耍。
 #include   int main(void)  { 
              /* enable the led clock 使能 IO接口时钟 */      rcu_periph_clock_enable(RCU_GPIOC);      /* configure led GPIO port */       gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);      while(1)      { 
                  gpio_bit_set(GPIOC, GPIO_PIN_13);          rt_thread_mdelay(500);          gpio_bit_reset(GPIOC, GPIO_PIN_13);          rt_thread_mdelay(500);      }  } 

添加控制台与 FinSH

添加 UART 控制台

其实这个功能就是打印功能,类似于我们平时用的。 printf 函数,我们可以通过此功能向外部发送信息,方便调试代码。
一般以串口为打印传输接口。
那么将其在 RT-Thread 以上实现非常简单:串口初始化和系统输出函数。

  • 串口初始化
    使能 RT_USING_CONSOLE 宏定义

    注释多余的宏定义(以下宏定义和rtconfig.h重复了)

在 boart.c 添加以下代码的文件可以实现输出打印功能

static int span class="token function">uart_init(void)
{ 
        
    /* enable GPIO clock 使能串口1引脚IO时钟 */
    rcu_periph_clock_enable(RCU_GPIOA);

    /* enable USART clock */
    rcu_periph_clock_enable(RCU_USART0);

    /* connect port to USARTx_Tx */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);

    /* connect port to USARTx_Rx */
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

    /* USART configure */
    usart_deinit(USART0);
    usart_baudrate_set(USART0, 115200);            //设置串口波特率
    usart_word_length_set(USART0, USART_WL_8BIT); //字长为8位数据格式
    usart_stop_bit_set(USART0, USART_STB_1BIT);   //一个停止位
    usart_parity_config(USART0, USART_PM_NONE);    //无奇偶校验位
    usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE); //无硬件数据流控制
    usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE); //无硬件数据流控制
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);        //收发模式
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
    usart_enable(USART0);                          //使能串口0 
    
    return 0;
}
INIT_BOARD_EXPORT(uart_init);  /* 默认选择初始化方法一:使用宏 INIT_BOARD_EXPORT 进行自动初始化 */

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')
        { 
        
             usart_data_transmit(USART0,a);
             while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
        }
        usart_data_transmit(USART0, *(str+i));
        while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    }
}

效果如下:

添加 FinSH 组件(实现命令输入)

RT-Thread FinSH 是 RT-Thread 的命令行组件(shell),提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用串口 / 以太网 / USB 等与 PC 机进行通信。其实就是多了个交互功能,以前只能被动查看输出,现在可以通过输入主动去获取一些东西。

  • 将RT-Thread 源代码中的 FinSh 文件拷贝到目标工程

    添加入工程

    在 rtconfig.h 中使能 #define RT_USING_FINSH 宏定义,在该文件加入 #defined RTE_USING_FINSH
  • 实现 rt_hw_console_getchar函数
char rt_hw_console_getchar(void)
{ 
        
    /* the initial value of ch must < 0 */
    int ch = -1;

    if (usart_flag_get(USART0, USART_FLAG_RBNE) != RESET)
    { 
        
        ch = usart_data_receive(USART0);
    }
    else
    { 
        
        rt_thread_mdelay(10);
    }
    return ch;	
}

效果如下:

参考资料

  • 官方教程:基于 Keil MDK 移植 RT-Thread Nano
  • 在 RT-Thread Nano 上添加控制台与 FinSH
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章