Titan-RA8P1的芯片是Renensas的RA8P1系列芯片,瑞萨官方使用的IDE是e2studio。本文介绍如何在e2studio中创建工程并结合RT-Thread的源码,在e2studio实现RT-Thread工程的管理和调试。
目录
硬件外设
创建e2studio工程和配置基本外设
添加BSP模板并修改
1 硬件外设
使用RT-Thread实现控制Titan-RA8P1上的三色LED,并输出log都串口中断显示,查看开发板的原理图,串口和LED的控制引脚如图所示。


板载外部晶振用于提供系统时钟源。

2 创建e2studio工程和配置基本外设
根据Titan-RA8P1开发板的芯片的型号,创建基于芯片型号的工程,编译器选择GCC。

选择工程使用的RTOS类型为 No RTOS。

FSP Configurator中的Stacks菜单中添加串口模块

设置串口uart8模块的参数,指定其名称为g_uart8,中断回调函数名为usr_uart8_callback


保存配置只并生成代码。
3 添加BSP模板并修改
3.1 复制文件
复制bsp\renesas\libraries\bsp-template文件夹中的内容,到e2studio工程文件夹中。RTThread中使用KConfig工具对代码进行配置,生成rt_config.h头文件用于配置不同的软件组件。

复制bsp\renesas\中的libraries\HAL_Drivers中的文件夹到工程中。
3.2 修改Kconfig文件
由于存放Kconfig文件夹结构发生变化,需要修改复制到e2studio工程中的顶层目录中的Kconfig文件中的RTT_DIR变量,指定存放RT-Thread代码的位置。参考官方提供的Titan-RA8P1的工程配置,在其中添加芯片相关的项目,修改后的内容如下。
mainmenu "RT-Thread Configuration"BSP_DIR := .RTT_DIR := ../../rt-thread# you can change the RTT_ROOT default "../.." to your rtthread_root,# example : default "F:/git_repositories/rt-thread"PKGS_DIR := packagesENV_DIR := /source "$(RTT_DIR)/Kconfig"osource "$PKGS_DIR/Kconfig"rsource "libraries/Kconfig"source "$(BSP_DIR)/board/Kconfig"
修改board\Kconifg中的内容,在On-chip Peripheral Drivers菜单中添加片上的串口驱动,用于支持RT-Thread串口终端功能。同时根据libraries\Kconfig文件的存放位置修改文件中的rsource语句参数。主要的添加内容如下。
menu "Hardware Drivers Config" config SOC_R7KA8P1KF bool select SOC_SERIES_R7KA8P1 select SOC_SERIES_R7KA8P1_CORE0 select RT_USING_COMPONENTS_INIT select RT_USING_USER_MAIN default y menu "Onboard Peripheral Drivers" endmenu menu "On-chip Peripheral Drivers" rsource "../libraries/HAL_Drivers/drivers/Kconfig" menuconfig BSP_USING_UART bool"Enable UART" default y select RT_USING_SERIAL select RT_USING_SERIAL_V2 if BSP_USING_UART menuconfig BSP_USING_UART8 bool"Enable UART8" default n if BSP_USING_UART8 config BSP_UART8_RX_BUFSIZE int"Set UART8 RX buffer size" range 6465535 depends on RT_USING_SERIAL_V2 default256 config BSP_UART8_TX_BUFSIZE int"Set UART8 TX buffer size" range 065535 depends on RT_USING_SERIAL_V2 default0 endif endif endmenu menu "Board extended module Drivers" endmenuendmenu
完成添加后,在e2studio工程中使用RT-Thread提供的env工具,在其中运行menuconfig指令,验证Kconfig文件修改是否成功,报错的话根据提示修改即可。进入menuconfig界面,修改RT-Thread Kernel中的shell使用的uart名称。

uart组件驱动使用Serial_V2

使能添加的uart8驱动

保存并退出。
3.3 修改源码
修改board\board.h中的内存大小以及起始位置如下。
#define RA_SRAM_SIZE 256/* The SRAM size of the chip needs to be modified */#define RA_SRAM_END (0x22000000 + RA_SRAM_SIZE * 1024)
修改board\port\gpio_cfg.h文件中的内容如下,添加外部中端的引脚信息。
/* * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2025-04-07 kurisaW first version *//* Number of IRQ channels on the device */#define RA_IRQ_MAX 32/* PIN to IRQx table */#define PIN2IRQX_TABLE(pin) \{ \ switch (pin) \ { \ case BSP_IO_PORT_01_PIN_05: \ case BSP_IO_PORT_04_PIN_00: \ case BSP_IO_PORT_08_PIN_06: \ case BSP_IO_PORT_09_PIN_02: \ case BSP_IO_PORT_11_PIN_06: \ case BSP_IO_PORT_12_PIN_14: \ return 0; \ case BSP_IO_PORT_01_PIN_01: \ case BSP_IO_PORT_01_PIN_04: \ case BSP_IO_PORT_05_PIN_08: \ case BSP_IO_PORT_09_PIN_03: \ case BSP_IO_PORT_11_PIN_07: \ case BSP_IO_PORT_12_PIN_13: \ return 1; \ case BSP_IO_PORT_01_PIN_00: \ case BSP_IO_PORT_02_PIN_13: \ case BSP_IO_PORT_05_PIN_09: \ case BSP_IO_PORT_07_PIN_12: \ case BSP_IO_PORT_09_PIN_04: \ case BSP_IO_PORT_12_PIN_12: \ return 2; \ case BSP_IO_PORT_02_PIN_08: \ case BSP_IO_PORT_02_PIN_12: \ case BSP_IO_PORT_05_PIN_10: \ case BSP_IO_PORT_07_PIN_11: \ case BSP_IO_PORT_09_PIN_13: \ case BSP_IO_PORT_12_PIN_11: \ return 3; \ case BSP_IO_PORT_02_PIN_01: \ case BSP_IO_PORT_03_PIN_00: \ case BSP_IO_PORT_04_PIN_11: \ case BSP_IO_PORT_10_PIN_10: \ case BSP_IO_PORT_12_PIN_10: \ return 4; \ case BSP_IO_PORT_03_PIN_02: \ case BSP_IO_PORT_04_PIN_10: \ case BSP_IO_PORT_09_PIN_12: \ case BSP_IO_PORT_10_PIN_09: \ case BSP_IO_PORT_12_PIN_09: \ return 5; \ case BSP_IO_PORT_03_PIN_01: \ case BSP_IO_PORT_04_PIN_09: \ case BSP_IO_PORT_05_PIN_03: \ case BSP_IO_PORT_09_PIN_11: \ case BSP_IO_PORT_10_PIN_08: \ return 6; \ case BSP_IO_PORT_04_PIN_08: \ case BSP_IO_PORT_05_PIN_04: \ case BSP_IO_PORT_06_PIN_15: \ case BSP_IO_PORT_07_PIN_06: \ case BSP_IO_PORT_09_PIN_10: \ return 7; \ case BSP_IO_PORT_03_PIN_05: \ case BSP_IO_PORT_04_PIN_15: \ case BSP_IO_PORT_05_PIN_05: \ case BSP_IO_PORT_07_PIN_07: \ case BSP_IO_PORT_09_PIN_05: \ case BSP_IO_PORT_09_PIN_15: \ return 8; \ case BSP_IO_PORT_03_PIN_04: \ case BSP_IO_PORT_04_PIN_14: \ case BSP_IO_PORT_05_PIN_06: \ case BSP_IO_PORT_09_PIN_06: \ case BSP_IO_PORT_09_PIN_14: \ case BSP_IO_PORT_11_PIN_04: \ return 9; \ case BSP_IO_PORT_05_PIN_07: \ case BSP_IO_PORT_07_PIN_09: \ case BSP_IO_PORT_09_PIN_07: \ case BSP_IO_PORT_10_PIN_11: \ case BSP_IO_PORT_11_PIN_00: \ return 10; \ case BSP_IO_PORT_07_PIN_08: \ case BSP_IO_PORT_08_PIN_00: \ case BSP_IO_PORT_08_PIN_07: \ case BSP_IO_PORT_09_PIN_08: \ case BSP_IO_PORT_10_PIN_12: \ case BSP_IO_PORT_11_PIN_02: \ return 11; \ case BSP_IO_PORT_05_PIN_15: \ case BSP_IO_PORT_07_PIN_15: \ case BSP_IO_PORT_08_PIN_01: \ case BSP_IO_PORT_10_PIN_13: \ case BSP_IO_PORT_11_PIN_01: \ return 12; \ case BSP_IO_PORT_00_PIN_15: \ case BSP_IO_PORT_05_PIN_14: \ case BSP_IO_PORT_07_PIN_14: \ case BSP_IO_PORT_10_PIN_14: \ case BSP_IO_PORT_11_PIN_03: \ return 13; \ case BSP_IO_PORT_00_PIN_10: \ case BSP_IO_PORT_00_PIN_13: \ case BSP_IO_PORT_05_PIN_12: \ case BSP_IO_PORT_07_PIN_13: \ case BSP_IO_PORT_08_PIN_04: \ case BSP_IO_PORT_10_PIN_15: \ return 14; \ case BSP_IO_PORT_00_PIN_12: \ case BSP_IO_PORT_05_PIN_11: \ case BSP_IO_PORT_08_PIN_08: \ case BSP_IO_PORT_08_PIN_13: \ case BSP_IO_PORT_08_PIN_15: \ case BSP_IO_PORT_11_PIN_05: \ return 15; \ case BSP_IO_PORT_00_PIN_11: \ case BSP_IO_PORT_01_PIN_03: \ case BSP_IO_PORT_01_PIN_06: \ case BSP_IO_PORT_06_PIN_10: \ case BSP_IO_PORT_08_PIN_14: \ case BSP_IO_PORT_10_PIN_07: \ return 16; \ case BSP_IO_PORT_01_PIN_02: \ case BSP_IO_PORT_06_PIN_11: \ case BSP_IO_PORT_07_PIN_10: \ case BSP_IO_PORT_10_PIN_06: \ case BSP_IO_PORT_13_PIN_07: \ return 17; \ case BSP_IO_PORT_04_PIN_13: \ case BSP_IO_PORT_06_PIN_12: \ case BSP_IO_PORT_08_PIN_02: \ case BSP_IO_PORT_10_PIN_05: \ case BSP_IO_PORT_13_PIN_06: \ return 18; \ case BSP_IO_PORT_01_PIN_11: \ case BSP_IO_PORT_06_PIN_13: \ case BSP_IO_PORT_07_PIN_05: \ case BSP_IO_PORT_08_PIN_03: \ case BSP_IO_PORT_10_PIN_04: \ case BSP_IO_PORT_13_PIN_05: \ return 19; \ case BSP_IO_PORT_01_PIN_10: \ case BSP_IO_PORT_02_PIN_15: \ case BSP_IO_PORT_06_PIN_14: \ case BSP_IO_PORT_08_PIN_09: \ case BSP_IO_PORT_10_PIN_03: \ case BSP_IO_PORT_13_PIN_04: \ return 20; \ case BSP_IO_PORT_02_PIN_14: \ case BSP_IO_PORT_08_PIN_10: \ case BSP_IO_PORT_10_PIN_01: \ case BSP_IO_PORT_12_PIN_07: \ case BSP_IO_PORT_13_PIN_02: \ case BSP_IO_PORT_13_PIN_03: \ return 21; \ case BSP_IO_PORT_04_PIN_07: \ case BSP_IO_PORT_06_PIN_08: \ case BSP_IO_PORT_08_PIN_11: \ case BSP_IO_PORT_10_PIN_00: \ case BSP_IO_PORT_12_PIN_06: \ case BSP_IO_PORT_13_PIN_01: \ return 22; \ case BSP_IO_PORT_01_PIN_09: \ case BSP_IO_PORT_02_PIN_11: \ case BSP_IO_PORT_06_PIN_07: \ case BSP_IO_PORT_08_PIN_12: \ case BSP_IO_PORT_12_PIN_05: \ case BSP_IO_PORT_13_PIN_00: \ return 23; \ case BSP_IO_PORT_01_PIN_08: \ case BSP_IO_PORT_02_PIN_10: \ case BSP_IO_PORT_05_PIN_00: \ case BSP_IO_PORT_06_PIN_06: \ case BSP_IO_PORT_12_PIN_04: \ return 24; \ case BSP_IO_PORT_02_PIN_07: \ case BSP_IO_PORT_02_PIN_09: \ case BSP_IO_PORT_05_PIN_01: \ case BSP_IO_PORT_06_PIN_05: \ case BSP_IO_PORT_12_PIN_03: \ return 25; \ case BSP_IO_PORT_05_PIN_02: \ case BSP_IO_PORT_06_PIN_04: \ case BSP_IO_PORT_07_PIN_04: \ case BSP_IO_PORT_12_PIN_02: \ return 26; \ case BSP_IO_PORT_00_PIN_14: \ case BSP_IO_PORT_01_PIN_12: \ case BSP_IO_PORT_06_PIN_03: \ case BSP_IO_PORT_12_PIN_01: \ return 27; \ case BSP_IO_PORT_00_PIN_07: \ case BSP_IO_PORT_01_PIN_13: \ case BSP_IO_PORT_06_PIN_02: \ case BSP_IO_PORT_12_PIN_00: \ return 28; \ case BSP_IO_PORT_00_PIN_03: \ case BSP_IO_PORT_06_PIN_01: \ case BSP_IO_PORT_06_PIN_09: \ case BSP_IO_PORT_12_PIN_08: \ return 29; \ case BSP_IO_PORT_04_PIN_05: \ case BSP_IO_PORT_06_PIN_00: \ case BSP_IO_PORT_08_PIN_05: \ case BSP_IO_PORT_12_PIN_15: \ return 30; \ case BSP_IO_PORT_01_PIN_07: \ case BSP_IO_PORT_04_PIN_06: \ case BSP_IO_PORT_05_PIN_13: \ case BSP_IO_PORT_10_PIN_02: \ return 31; \ default : \ return -1; \ } \}
修改ra\fsp\src\bsp\cmsis\Device\RENESAS\Source\startup.c中的Reset_Handler函数如下
voidReset_Handler(void){ /* Initialize system using BSP. */ SystemInit(); /* Call user application. */#if defined(__GNUC__) externintentry(void); entry();#elif defined(__ICCARM__) externvoid __low_level_init(void); __low_level_init();#else /* Jump to main. */ main();#endif while (1) { /* Infinite Loop. */ }}
3.4 链接RT-Thread源码
RT-Thread源代码使用Scons工具用于管理代码编译,不过使用e2studio进行管理后,需要开发者自行将RT-Thread工程需要使用到的代码添加e2studio的工程代码管理中。使用新增文件夹的链接功能,添加RT-Thread源码仓库中的相关文件夹。使用到的文件夹如下:
components
include
libcpu
src
其中src文件夹与e2studio工程中的src文件夹重名,在链接该文件夹时,设置不同的名称即可,具体页面操作如下。

在工程属性的 Path and Symbols 中 include 菜单中添加RT-Thread源码的路径。Assembly选项卡中添加如下。

GNU C选项卡中添加以下路径。

RT-Thread源码适配很多场景,其中有很多代码是不使用的,通过Paths and Symbols的Source location中添加源码的管理。在其中添加上述提到的源码文件夹路径。

其中libcpu中的排除文件如图。

components目录中的finsh和libc中文件排除情况如下

components/drivers中的文件包含情况如下

3.4.1 参考RT-Thread示例工程确定源文件
RT-Thread中有大量的文件,如何确定需要排除哪些文件,可以通过参考官方提供的RT-Thread Studio中的示例工程,参考其中的配置信息

3.4.2 利用scons生成CMake文件确定需要使用的源文件
也可以通过修改Scons编译需要用到的文件,利用scons --target=cmake指令,生成CMakeLists.txt文件,获取构建的文本信息。从官方的示例程序中复制其中的SConstruct、SConscript中的内容,根据RT-Thread源码的存放位置,修改SConstruct中的RTT_ROOT路径信息。
if os.path.exists('rt-thread'): RTT_ROOT = os.path.normpath(os.getcwd() + '/rt-thread')else: RTT_ROOT = os.path.normpath(os.getcwd() + '../../../rt-thread')print(os.path.normpath(os.getcwd() + '../../../rt_thread'))
运行scons --target=cmake指令后,通过查看输出的CMakeLists.txt,其中给出不同模块中需要添加工程中文件信息,据此,可以修改e2studio中的源码exclude项目。
SET(RT_CPU_SOURCES ../../rt-thread/libcpu/arm/common/atomic_arm.c ../../rt-thread/libcpu/arm/common/div0.c ../../rt-thread/libcpu/arm/common/showmem.c ../../rt-thread/libcpu/arm/cortex-m85/context_gcc.S ../../rt-thread/libcpu/arm/cortex-m85/cpuport.c)SET(RT_DEVICEDRIVERS_SOURCES ../../rt-thread/components/drivers/core/device.c ../../rt-thread/components/drivers/ipc/completion_comm.c ../../rt-thread/components/drivers/ipc/completion_up.c ../../rt-thread/components/drivers/ipc/condvar.c ../../rt-thread/components/drivers/ipc/dataqueue.c ../../rt-thread/components/drivers/ipc/pipe.c ../../rt-thread/components/drivers/ipc/ringblk_buf.c ../../rt-thread/components/drivers/ipc/ringbuffer.c ../../rt-thread/components/drivers/ipc/waitqueue.c ../../rt-thread/components/drivers/ipc/workqueue.c ../../rt-thread/components/drivers/pin/dev_pin.c ../../rt-thread/components/drivers/serial/dev_serial_v2.c)SET(RT_DRIVERS_SOURCES libraries/HAL_Drivers/drivers/drv_gpio.c libraries/HAL_Drivers/drivers/drv_usart_v2.c libraries/HAL_Drivers/drv_common.c)SET(RT_FINSH_SOURCES ../../rt-thread/components/finsh/shell.c ../../rt-thread/components/finsh/msh.c ../../rt-thread/components/finsh/msh_parse.c ../../rt-thread/components/finsh/cmd.c)SET(RT_KERNEL_SOURCES ../../rt-thread/src/clock.c ../../rt-thread/src/components.c ../../rt-thread/src/cpu_up.c ../../rt-thread/src/defunct.c ../../rt-thread/src/idle.c ../../rt-thread/src/ipc.c ../../rt-thread/src/irq.c ../../rt-thread/src/kservice.c ../../rt-thread/src/mem.c ../../rt-thread/src/mempool.c ../../rt-thread/src/object.c ../../rt-thread/src/scheduler_comm.c ../../rt-thread/src/scheduler_up.c ../../rt-thread/src/thread.c ../../rt-thread/src/timer.c)SET(RT_LIBC_SOURCES ../../rt-thread/components/libc/compilers/common/cctype.c ../../rt-thread/components/libc/compilers/common/cstdlib.c ../../rt-thread/components/libc/compilers/common/cstring.c ../../rt-thread/components/libc/compilers/common/ctime.c ../../rt-thread/components/libc/compilers/common/cunistd.c ../../rt-thread/components/libc/compilers/common/cwchar.c ../../rt-thread/components/libc/compilers/newlib/syscalls.c ../../rt-thread/src/klibc/kerrno.c ../../rt-thread/src/klibc/kstdio.c ../../rt-thread/src/klibc/kstring.c ../../rt-thread/src/klibc/rt_vsnprintf_tiny.c ../../rt-thread/src/klibc/rt_vsscanf.c)
e2studio工程的src文件夹中的hal_warmstart.c中的代码和RTThread提供的适配代码冲突,在源码控制中将其排除出构建即可。
3.5 修改编译器选项和链接脚本以及添加示例源码
在工程的属性的Settings菜单中修改编译器的选项如下,解决编译时汇编指令支持的问题。

修改编译器的优化参数,解决RT-Thread串口输出乱码的问题。

e2studio工程中script文件夹中的fsp.ld链接文件中引用两个生成的链接脚本,为Debug文件夹中的fsp_gen.ld和memory_gen.ld文件,复制其中的内容到fsp.ld文件中。
文件中定位到MCU Vector Table位置,添加以下内容
/* MCU vector table */ __flash_vectorsBase = .; _VECTORS = .; KEEP(*(.fixed_vectors)) KEEP(*(.application_vectors)) __flash_vectors$$Limit = .; /* section information for finsh shell */ . = ALIGN(4); __fsymtab_start = .; KEEP(*(FSymTab)) __fsymtab_end = .; . = ALIGN(4); __vsymtab_start = .; KEEP(*(VSymTab)) __vsymtab_end = .; /* section information for initial. */ . = ALIGN(4); __rt_init_start = .; KEEP(*(SORT(.rti_fn*))) __rt_init_end = .; . = ALIGN(4); KEEP(*(FalPartTable)) }> FLASH
另外定位到SDRAM区域具体可以参考工程中代码查看,添加以下内容
.ram.flat_nsc : { __sau_ddsc_RAM_NSC = .; }> RAM /* This symbol represents the end of user allocated RAM. The RAM after this symbol can be used at run time for things such as ThreadX memory pool allocations. */ __RAM_segment_used_end__ = ALIGN(__sau_ddsc_RAM_NSC , 4);
在hal_entry中添加以下代码,实现控制EK-RA8P1上LED灯并输出log的功能。
#include#include"hal_data.h"#include#include#define DBG_TAG "led"#define DBG_LVL DBG_LOG#include/* 配置 LED 灯引脚 */#define LED_PIN_R BSP_IO_PORT_00_PIN_12#define LED_PIN_B BSP_IO_PORT_00_PIN_13#define LED_PIN_G BSP_IO_PORT_06_PIN_13/* 定义 LED 亮灭电平 */#define LED_ON (0)#define LED_OFF (1)/* 定义 8 组 LED 闪灯表,其顺序为 R B G */staticconstrt_uint8_t _blink_tab[][3] ={ {LED_OFF, LED_OFF, LED_OFF}, {LED_ON, LED_OFF, LED_OFF}, {LED_OFF, LED_ON, LED_OFF}, {LED_OFF, LED_OFF, LED_ON}, {LED_ON, LED_OFF, LED_ON}, {LED_ON, LED_ON, LED_OFF}, {LED_OFF, LED_ON, LED_ON}, {LED_ON, LED_ON, LED_ON},};voidhal_entry(void){ rt_kprintf("\nHello RT-Thread!\n"); rt_kprintf("==================================================\n"); rt_kprintf("This example project is an RGB flicker routine!\n"); rt_kprintf("==================================================\n"); unsignedint count = 0; unsignedint group_num = sizeof(_blink_tab)/sizeof(_blink_tab[0]); unsignedint group_current; /* 设置 RGB 灯引脚为输出模式 */ rt_pin_mode(LED_PIN_R, PIN_MODE_OUTPUT); rt_pin_mode(LED_PIN_G, PIN_MODE_OUTPUT); rt_pin_mode(LED_PIN_B, PIN_MODE_OUTPUT); rt_pin_write(LED_PIN_R, LED_OFF); rt_pin_write(LED_PIN_G, LED_OFF); rt_pin_write(LED_PIN_B, LED_OFF); do { /* 获得组编号 */ group_current = count % group_num; /* 控制 RGB 灯 */ rt_pin_write(LED_PIN_R, _blink_tab[group_current][0]); rt_pin_write(LED_PIN_B, _blink_tab[group_current][1]); rt_pin_write(LED_PIN_G, _blink_tab[group_current][2]); /* 输出 LOG 信息 */ LOG_D("group: %d | red led [%-3.3s] | | blue led [%-3.3s] | | green led [%-3.3s]", group_current, _blink_tab[group_current][0] == LED_ON ? "ON" : "OFF", _blink_tab[group_current][1] == LED_ON ? "ON" : "OFF", _blink_tab[group_current][2] == LED_ON ? "ON" : "OFF"); count++; /* 延时一段时间 */ rt_thread_mdelay(500); }while(count > 0);}
【Titan-RA8P1】e2studio中使用pyocd调试(https://club.rt-thread.org/ask/article/ee532d8d659ae45b.html)
保存并编译工程,烧录到开发板运行,使用串口工具可以看到如下的log输出。

示例工程如下,需要配合RT-Thread仓库源码使用。
Titan_RA8P1_rtthread.zip
全部0条评论
快来发表一下你的评论吧 !