【超级详细教程】移植 RT-Thread Nano到 GD32F10x系列_rtthread移植-程序员宅基地

技术标签: 实战项目  RT-Thread  GD32  移植  教程  

对世界大多数人而言,人生一无意义,二无价值。
– 季羡林

准备工作

移植 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 <rtthread.h>
	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 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;	
}

效果如下:
在这里插入图片描述

参考资料

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37697335/article/details/123218745

智能推荐

IOS学习—强引用(__strong)和 弱引用(__weak)_ios __strong-程序员宅基地

文章浏览阅读2.6k次。转载于开源中国在Objective-C的ARC模式中,id obj1 = [[NSObject alloc] init]; 这里虽然没有显示的声明为__strong,但是Objective-C默认声明的一个对象就为__strong,即: id obj1 = [[NSObject alloc] init]; 和 id __strong obj1 = [[NSObject alloc] init_ios __strong

ubuntu18.04下qt5.9编译错误: -1: error: cannot find -lGL_:-1: error: /usr/local/qt-5.9/lib/libqt5core.so: u-程序员宅基地

文章浏览阅读2.1k次。只要安装libGL即可:sudo apt-get install libqt4-devsudo apt update再重新编译就ok啦 _:-1: error: /usr/local/qt-5.9/lib/libqt5core.so: undefined reference to `uca

如何绘制深度神经网络图_深度学习神经网络图怎么画-程序员宅基地

文章浏览阅读2.7k次,点赞4次,收藏22次。1.在线版本的NN-SVG_深度学习神经网络图怎么画

菜鸟学习Android笔记-20140311_textview3:[i18n] hardcoded string-程序员宅基地

文章浏览阅读771次。1、编写布局文件时,遇到这样的警告,“[I18N] Hardcoded string "昵称:", should use @string resource” 原来的代码:

不同参数统计运行时间 large_integer c语言,使用LARGE_INTEGER查看系统运行时间-程序员宅基地

文章浏览阅读252次。众所周知,windows ce是一个实时操作,因此提供了不少的优先级给用户.优先级最高为0级,也就是说使用0优先级的程序, 可以挂起整个系统, 来运行你的程序对于实时性比较的领域, 我们作为程序员的 应该清楚的知道你的程序模块运行的时间 是非常必要的. 当然这个模块运行的时间也不是完全的稳定的, 几次运行的时间相差几十毫秒是很正常的. 因此我们只要知道大概的时间就可以了.当然, 大家..._large_integer计算时间

ssh登陆服务器locale告警(-bash: warning: setlocale:)的处理方法-程序员宅基地

文章浏览阅读1.9k次。 使用ssh远程登陆 IDC机房服务器,发现老是出现如下告警信息:-bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory-bash: warning: setlocale: LC_COLLATE: cannot change locale (en_U..._bash: warning: setlocale: lc_ctype: cannot change locale (en_us.utf-8): no s

随便推点

SQL中IF ELSE及MySQL伪列rownum的使用_mysql 如何使用if else 生成伪列-程序员宅基地

文章浏览阅读290次。编写SQL语句时难免会遇到各种条件判断,例如统计:count(case when then end)今天,我们要说的是if判断,eg:SELECT IF(c19='1','已评价','未评价')c19 FROM A05;关于伪列,广为人知的是oracle有伪列rownum,因为一些需求需要用mysql实现类似Oracle的伪列,方法方式如下:SELECT rowid, i01..._mysql 如何使用if else 生成伪列

【C++】虚函数及其内存布局_c++虚函数内存分布-程序员宅基地

文章浏览阅读1.7k次,点赞5次,收藏20次。一、函数调用捆绑把函数体与函数调用相联系称为捆绑。当捆绑在程序运行之前(由编译器和连接器)完成时,称为早捆绑。C编译只有一种函数调用方式,就是早捆绑。早捆绑引起的问题:因为编译器在只有对象的地址时它并不知道要调用的正确函数。根据对象的类型,捆绑发生在运行时,这种捆绑方式称为晚捆绑,又称动态捆绑。二、虚函数对于特定的函数,为了引起晚捆绑,C++要求在基类中声明这个函数时使用virtual关键字,这样的函数称为虚函数。晚捆绑只对virtual函数起作用,而且只在使用含有virtual函._c++虚函数内存分布

matlab 相位校正,科学网—全相位比值校正法 - 王兆华的博文-程序员宅基地

文章浏览阅读709次。加hann窗全相位比值校正法和加hann窗fft比值校正法校正方法类同,只须将二个振幅比改为振幅开方比即可。这里加hann窗是关键,过去测试时,直接调用Matlab中的hann(N)窗,频率和振幅校正效果差,见表5加hann窗全相位比值校正法测试结果。表4为加n-hann窗全相位比值校正法,其频率校正精度,相位校正精度和振幅校正精度都很高,甚至可以和表1加n-hann卷积窗apfft/apfft校..._比值校正法频谱校正matlab

创建登录界面_建网站登录页面-程序员宅基地

文章浏览阅读334次。package zhoushi;import javax.swing.*;//调用库import java.awt.*;import java.awt.event.*;public class jh extends JFrame implements ActionListener{//创建类jh继承JFrame,实现接口ActionListener JPanel log;//定义变量_建网站登录页面

win10安装linux虚拟机并配置shell工具连接_shell确认虚拟机光盘连接-程序员宅基地

文章浏览阅读1k次。1:虚拟机安装先看怎么用VMware安装一个虚拟机,全部放图,一步步来。主要还是以防以后我自己忘记怎么搞了,老了,记性不好了。VMware就在网上随便下载一个了,镜像我会在下面放上我的或者大家也可以自己去网上下一个。第一步:新建虚拟机第二步:选择类型第三步:选择映像文件,一般都会检测到,检测不到就只能自己打开浏览去找吧!第四步:给虚拟机命名,可以更改虚拟机安装位置。反正我是不会装在系统盘的,这辈子都不会的o(´^`)o第五步:默认选择是虚拟磁盘拆分成多个文件,但._shell确认虚拟机光盘连接

计算机视觉模型常用评价指标_平均交并比-程序员宅基地

文章浏览阅读3.6k次,点赞9次,收藏36次。分类任务常用准确率、精确率、召回率、F1_scores、ROC曲线等指标来评价模型的优劣,当然这些基础指标也可以用来评价分割模型或检测模型,它们基本上是可以通用的。混淆矩阵是对分类问题预测结果的总结,也是衡量分类型模型准确度中最基本,最直观,计算最简单的方法。混淆矩阵中含有4个分类问题的基础指标,如下表所示。........._平均交并比