2026 / 07 / 22
瑞萨RA8系列教程 | 基于 e2 studio 实现串口输出
作者 | strongerHuang
UART:Universal Asynchronous Receiver/Transmitter,即通用异步收发器,简称串口。
UART串口是学习单片机开发最常见的一个通信接口,也是实际项目中最常用的一个通信接口。
本文基于e2 studio 开发环境,教大家实现 RA8 单片机串口输出的方法。
准备工作
本文以 Windows 操作系统下 e2 studio V5.8.0、瑞萨RA8D1单片机为例。
前面文章《瑞萨 RA8 开发环境搭建》有提到具体的下载和安装方法。
e2 studio瑞萨GitHub下载地址:
2、准备开发板和下载调试器
瑞萨官方推出的开发板,很多都自带有J-Link调试器,比如,本文基于瑞萨CPKCOR-RA8D1B 开发板就自带有J-Link调试器。
如果你要用到J-Link的一些功能,比如:Hex下载代码、J-Link RTT 等功能,建议下载并安装J-Link配套的软件。
基于 e2 studio 配置串口
本文基于之前Demo工程进行配置 RA8 单片机的串口。这里推荐参看文章:瑞萨RA8系列教程 | 基于 e2 studio 创建RA8工程
我们复制之前生成的整个工程目录,并重命名(比如:RA8D1_UART)。

打开 e2 studio 开发环境,直接导入工程:


当然,我们也可以参看之前文章《瑞萨RA8系列教程 | 基于 e2 studio 创建RA8工程》自己从头到尾新建一个工程。本文不重复造轮子,省略这一步,直接配置UART串口。
RA8单片机串口被定义为SCI(Serial Communications Interface),即串行通信接口。

本文基于瑞萨CPKCOR-RA8D1B 开发板,使用SCI3作为调试串口。

3、新建串口模块

UART串口模块有很多配置选项,作为初学者,我们只需要配置几个基础的即可,其他大部分默认即可。

如果要使用printf打印输出,还需要配置两个地方。
heap栈大小

工程设置
项目 -> C/C++ Project Setting -> C/C++ 构建 -> 设置:

以上就是串口输出的一些基础配置。
上面工程配置好之后,接下来是添加串口printf打印输出相关的代码。
我们在 src 文件夹下添加一个 bsp 文件夹,并新建 bsp_uart.c 和 bsp_uart.h文件。

bsp_uart.h源代码很简单,包含头文件,申明函数:
#ifndef __BSP_UART_H
#define __BSP_UART_H
#include "hal_data.h"
#include
void UART3_Init(void);
#endif
bsp_uart.c源文件包含UART3_Init初始化、UART3_Callback回调函数、重定向 printf 输出。
#include "bsp_uart.h"
/* 发送完成标志 */
volatile bool uart_send_complete_flag = false;
/**
* @brief 调试串口 UART3 初始化
* @param 无
* @retval 无
*/
void UART3_Init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_SCI_B_UART_Open(&g_uart3_ctrl, &g_uart3_cfg);
assert(FSP_SUCCESS == err);
}
/**
* @brief 串口中断回调
* @param 无
* @retval 无
*/
void UART3_Callback (uart_callback_args_t * p_args)
{
switch (p_args->event)
{
case UART_EVENT_RX_CHAR:
{
/* 把串口接收到的数据发送回去 */
R_SCI_B_UART_Write(&g_uart3_ctrl, (uint8_t *)&(p_args->data), 1);
break;
}
case UART_EVENT_TX_COMPLETE:
{
uart_send_complete_flag = true;
break;
}
default:
break;
}
}
/**
* @brief 重定向 printf 输出
* @param 无
* @retval 无
*/
#if defined __GNUC__ && !defined __clang__
int _write(int fd, char *pBuffer, int size); //防止编译警告
int _write(int fd, char *pBuffer, int size)
{
(void)fd;
R_SCI_B_UART_Write(&g_uart3_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
while(uart_send_complete_flag == false);
uart_send_complete_flag = false;
return size;
}
#elseint
fputc(int ch, FILE *f)
{
(void)f;
R_SCI_B_UART_Write(&g_uart3_ctrl, (uint8_t *)&ch, 1);
while(uart_send_complete_flag == false);
uart_send_complete_flag = false;
return ch;
}
#endif
主函数我们添加一个测试printf的代码:
uint8_t Cnt = 0;
printf("Cnt = %d\r\n", Cnt);
Cnt++;
if (100 < Cnt)
{
Cnt = 0;
}
如果上面一切正常,我们就能正常编译了:

通过J-Link下载代码到芯片里面,就会有这样的现象:间隔1秒LED闪烁一下,并打印Cnt累加的值。
瑞萨RA8系列教程······