前言
之前移植过RT-Thread Nano版本,但是这个版本是简易版的,这次我们借助RTT官方RT-Thread-smart版本现有的GD32F303E-EVAL代码来移植我们的GD32E103R。一、替换文件、裁剪工程
1、复制一个GD32F303的工程,修改工程名为gd32e103,将里面Libraries文件夹中的文件替换成官方提供的GD32E103的GD32E10x_Firmware_Library文件夹下的所有文件。
官方文件:
RTT官方gd32f303e的Libraries文件夹文件:
替换对应芯片库文件:
2、使用env对工程进行最简化
只开启串口1:
关闭文件系统:
禁用spi:
禁用USB HOST:
不使能这些库:
3、退出保存,输入scons --target=mdk5重新生成工程
二、修改各种编译错误
1、修改Libraries的文件路径
2、修改宏为USE_STDPERIPH_DRIVER,GD32E10X,GD32E103R_START
3、更换芯片型号
4、删除异常文件,新添我们的文件,路径为GD32E10x_Firmware_Library\GD32E10x_standard_peripheral\Source、GD32E10x_Firmware_Library\CMSIS\GD\GD32E10x\Source、GD32E10x_Firmware_Library\CMSIS\GD\GD32E10x\Source\ARM
5、修改board.h文件
6、修改文件名,理论上下面有关于gd32f3033的文件都要改名,但是他们目前都不会用到,不该都是可以的,为了简便目前先不改。
7、根据固件库修改gd32e10x_libopt.h文件
#ifndef GD32E10X_LIBOPT_H
#define GD32E10X_LIBOPT_H
#include "gd32e10x_rcu.h"
#include "gd32e10x_adc.h"
#include "gd32e10x_can.h"
#include "gd32e10x_crc.h"
#include "gd32e10x_ctc.h"
#include "gd32e10x_dac.h"
#include "gd32e10x_dbg.h"
#include "gd32e10x_dma.h"
#include "gd32e10x_exti.h"
#include "gd32e10x_fmc.h"
#include "gd32e10x_fwdgt.h"
#include "gd32e10x_gpio.h"
#include "gd32e10x_i2c.h"
#include "gd32e10x_pmu.h"
#include "gd32e10x_bkp.h"
#include "gd32e10x_rtc.h"
#include "gd32e10x_spi.h"
#include "gd32e10x_timer.h"
#include "gd32e10x_usart.h"
#include "gd32e10x_wwdgt.h"
#include "gd32e10x_misc.h"
#include "gd32e10x_exmc.h"
#endif /* GD32F10X_LIBOPT_H */
8、编译发现以下三个错误。我们只要将提示gd32f30x.h文件替换成gd32e10x.h即可,把提示在man.c中的include <sfud_cfg.h>删除即可
9、再编译有以下错误,修改头文件为gd32e10x_exti.h即可
10、编译,有新错误出现,修改dev_gpio.c文件,由于原文件是对应GD32F303E的,而我们使用GD32E103没有那些GPIO所以需要修改。
注意:哪里提示有错误就将__GD32_PIN_DEFAULT,替换上去,因为没有这个GPIO。
修改前:
修改后:
11、再次编译,令人惊喜的是提示0错误0警告。
二、移植代码
1、修改board.c文件
/* setup systick timer for 1000Hz interrupts */
if (SysTick_Config(SystemCoreClock / 1000U)){
/* capture error */
while (1){
}
}
/* configure the systick handler priority */
NVIC_SetPriority(SysTick_IRQn, 0x00U);
2、修改board.h中的动态内存池大小,GD32E103RBT6只有运行内存只有32k,我先使用24k,尽量分配大一些,现在都还不知道是否一致成功,避免定义小了遇到什么奇怪,原本这里是64k肯定会有问题的。
3、打开Debug,选择对应的芯片。
3、编译,下载和运行,一切正常。
4、输入ps,根据各个线程占用的栈百分比,调整一下栈分配值,尽量节省空间
5、修改tidle0线程栈大小
修改main线程栈大小
修改tshell线程栈大小
6、输入free查看总内存占用情况。
7、自己适当修改一下动态内存池大小,我修改成10k。
8、再次编译下载运行,一切运行正常。
三、编写main函数
1、让板子的LED闪烁一下,说明他在运行。
#include <rtthread.h>
#include <board.h>
int main(void)
{
/* enable the LED2 GPIO clock */
rcu_periph_clock_enable(RCU_GPIOC);
/* configure LED2 GPIO port */
gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);
/* reset LED2 GPIO pin */
gpio_bit_reset(GPIOC,GPIO_PIN_6);
while(1)
{
/* turn on LED2 */
gpio_bit_set(GPIOC,GPIO_PIN_6);
rt_thread_mdelay(500);
/* turn off LED2 */
gpio_bit_reset(GPIOC,GPIO_PIN_6);
rt_thread_mdelay(500);
}
}
2、代码下载。