2787|1

1942

帖子

2

TA的资源

版主

楼主
 

【GD32L233C-START评测】Part2:从零开始移植RTThread [复制链接]

1.介绍

为了后续Demo做准备,移植RTThread,为什么不移植FreeRTOS呢?因为国产芯片就应该用国产系统!那么就开始吧!

2.移植准备

上一篇的工程【https://bbs.eeworld.com.cn/thread-1194440-1-1.html

RTThread3.15的Keil离线包:https://www.rt-thread.org/download/mdk/RealThread.RT-Thread.3.1.5.pack

3.开始移植

直接把内核和shell一块移植了。

安装上面RTThread3.15的Keil离线包,打开上一篇的工程。

图1

打开工程,添加RTThread内容,操作如下图2所示。

图2

添加完成之后,在旁边的工程目录可以看到如下文件。

图3

首先选择【rtconfig.h】文件进行一些参数的配置修改内容如下所示。

//Main线程的大小,256不够所以修改成了256
#define RT_MAIN_THREAD_STACK_SIZE     512

//打开控制台
#define RT_USING_CONSOLE

//添加控制台头文件
#include "finsh_config.h"

需要修改一些中断和时钟,修改结果如下图4所示。

图4

由于Shell需要自己实现输入和输出函数,分别是【rt_hw_console_getchar】和【rt_hw_console_output】。【rt_hw_console_getchar】在【finsh_prot.c】文件中已经有一个虚函数,不过为了方便管理,就不修改这个函数了,直接在【board.c】文件中添加这个函数,同时修改【board.c】文件的【rt_hw_console_output】函数。结果如下:

#include "gd32l233r_eval.h"

void rt_hw_console_output(const char *str)
{
//#error "TODO 3: Output the string 'str' through the uart."
	rt_enter_critical();

	while (*str!='\0')
	{
		if (*str=='\n')
		{
			usart_data_transmit(EVAL_COM, '\r'); 
			while (usart_flag_get(EVAL_COM, USART_FLAG_TC) == RESET);
		}

		usart_data_transmit(EVAL_COM, *str++); 				
		while (usart_flag_get(EVAL_COM, USART_FLAG_TC) == RESET);	
	}	

	rt_exit_critical();
}

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

    //#error "TODO 4: Read a char from the uart and assign it to 'ch'."
	if(usart_flag_get(EVAL_COM, USART_FLAG_RBNE) != RESET)
	{
		ch = usart_data_receive(EVAL_COM);
	}
    return ch;
}

同时还需要修改时钟的初始化位置,将【systick_config()】初始化移动到【board.c】文件中的【rt_hw_board_init】函数中,结果如下:

#include "systick.h"

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. 
     */

    /* Call components board initial (use INIT_BOARD_EXPORT()) */
    systick_config();
#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
}

然后修改【main】函数,只让它输出时钟信息,如下所示:

int main(void)
{
    /* print out the clock frequency of system, AHB, APB1 and APB2 */
    rt_kprintf("\r\nCK_SYS is %d", rcu_clock_freq_get(CK_SYS));
    rt_kprintf("\r\nCK_AHB is %d", rcu_clock_freq_get(CK_AHB));
    rt_kprintf("\r\nCK_APB1 is %d", rcu_clock_freq_get(CK_APB1));
    rt_kprintf("\r\nCK_APB2 is %d\n", rcu_clock_freq_get(CK_APB2));

    return 0;
}

最后注释掉一些【#error】即可。

下载程序到开发板上,运行【free】和【free】命令,得到如下图5。

图5

4.总结

其实系统移植很简单,官方也有相应的教程,不过跑系统还是比较好的,可以实现很多裸机不好实现的功能,后续就在这个代码基础上增加外设功能了。

此帖出自GD32 MCU论坛

最新回复

官方也有相应的教程移植就容易一些   详情 回复 发表于 2022-3-1 07:22
点赞 关注(1)
 

回复
举报

6828

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

官方也有相应的教程移植就容易一些

此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表