【瑞萨EK-RA4C1】板卡串口测试
e² studio 串口(SCI/UART)通信测试RA4C1 拥有 6 个 SCI 多功能串口(均可配置为 UART / 简单 SPI / 简单 I2C)和 2 个支持 32kHz 时钟的低功耗 UART,接口资源非常充裕。作为嵌入式开发中最基础也最常用的外设,串口通信往往是我们拿到新板子后的"第一行 Hello World"。下面就用瑞萨官方 IDE——e² studio,从零搭建一个 SCI-UART 串口收发测试工程。
开发环境搭建回顾
软件环境:
组件 版本/说明
IDE e² studio(基于 Eclipse,瑞萨官网免费下载)
FSP Flexible Software Package,推荐使用最新 Release 版本
RASC RA Smart Configurator,随 e² studio 集成或独立安装
调试器 板载 SEGGER J-Link OB(Type-C USB 直连)
串口工具 SSCOM / MobaXterm / PuTTY 任意一款
硬件连接:
EK-RA4C1 板载 J-Link OB 的 Debug USB 口(DEBUG1,Type-C)同时承担供电、调试和虚拟串口三合一功能。经 J-Link OB 内置的 VCOM(Virtual COM Port)桥接,RA4C1 的 SCI 串口数据可以通过同一根 USB 线回传至 PC,无需额外连接 USB-TTL 模块。
新建工程步骤(概要):
打开 e² studio,File → New → Renesas RA C/C++ Project
选择器件:R7FA4C1BD3CFP
选择 Board:EK-RA4C1(BSP 会自动配置系统时钟和板级外设)
工程类型选择 Flat (Non-TrustZone),Toolchain 选择 GCC ARM Embedded
点击 Finish,e² studio 自动创建工程并打开 FSP Configuration 视图
串口外设配置(RASC 图形化配置)
在 FSP Configuration 视图中,切换到 "Stacks" 标签页,按以下步骤添加 SCI-UART 驱动栈:
Step 1 — 添加 UART 驱动:
点击 New Stack → Connectivity → UART (r_sci_uart)
驱动栈出现在 HAL/Common Stacks 列表中
Step 2 — 配置 UART 参数(在 "Properties" 面板中设置):
参数项 设置值 说明
Name g_uart0 驱动实例名,代码中引用
Channel 0 使用 SCI0 通道
Baud Rate 115200 常用波特率
Data Bits 8 8 位数据位
Parity None 无校验
Stop Bits 1 1 位停止位
Flow Control None 无硬件流控
Clock Source Internal 使用内部波特率发生器
Receive Interrupt Priority Priority 12 使能接收中断
Transmit End Interrupt Priority Priority 12 使能发送完成中断
Error Interrupt Priority Priority 12 使能错误中断
Callback uart0_callback 用户回调函数名
Step 3 — 配置引脚复用:
切换到 "Pins" 标签页,在 Connectivity:SCI → SCI0 下确认引脚分配:
信号 引脚 功能
TXD0 P213 SCI0 数据发送
RXD0 P212 SCI0 数据接收
若引脚冲突(显示红色),手动调整为对应功能即可。EK-RA4C1 的 BSP 通常已将这些引脚默认映射好。
Step 4 — 生成代码:
点击 FSP Configuration 界面右上角的 "Generate Project Content" 按钮,RASC 自动生成以下关键文件:
ra_gen/hal_data.c / hal_data.h:包含 g_uart0 实例的配置结构体
ra_gen/pin_data.c / pin_data.h:引脚复用配置
src/hal_entry.c:用户代码入口(主逻辑在此编写)
示例代码编写
以下代码实现两个核心功能:printf 重定向(方便格式化输出)和 串口回环测试(PC 端发送数据,MCU 接收后原样返回)。
在 src/hal_entry.c 中修改(关键代码段):
c
#include "hal_data.h"
#include <stdio.h>
#include <string.h>
/* UART 接收缓冲区 */
static volatile uint8_tg_rx_byte;
static volatile bool g_rx_complete = false;
/* ========== UART 回调函数 ========== */
void uart0_callback(uart_callback_args_t *p_args)
{
switch (p_args->event)
{
case UART_EVENT_RX_CHAR:
/* 收到一个字节,存入缓冲区并置标志 */
g_rx_byte = *(uint8_t *)(p_args->p_context);
g_rx_complete= true;
break;
case UART_EVENT_TX_COMPLETE:
/* 发送完成 */
break;
case UART_EVENT_ERR_PARITY:
case UART_EVENT_ERR_FRAMING:
case UART_EVENT_ERR_OVERFLOW:
/* 错误处理 */
break;
default:
break;
}
}
/* ========== printf 重定向到 UART ========== */
#ifdef __GNUC__
int _write(int fd, char *buf, int len)
{
(void)fd;
fsp_err_t err;
err = R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)buf, (uint32_t)len);
if (FSP_SUCCESS != err)
{
return -1;
}
/* 等待发送完成 */
while (0U == g_uart0_ctrl.tx_data_bytes) { }
return len;
}
#else
/* IAR / Keil 用户需使用各自的 printf 重定向方式 */
#endif
/* ========== 主入口 ========== */
void hal_entry(void)
{
fsp_err_t err;
/* --- 1. 打开 UART 驱动 --- */
err = R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);
if (FSP_SUCCESS != err)
{
/* 初始化失败:快速闪烁红色 LED 提示 */
while (1)
{
R_BSP_PinWrite(BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_HIGH);
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
R_BSP_PinWrite(BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
}
}
/* --- 2. 打印启动信息 --- */
printf("\r\n========================================\r\n");
printf("EK-RA4C1 SCI-UART Demo\r\n");
printf("MCU:R7FA4C1BD3CFP @ 80MHz\r\n");
printf("UART: SCI0, 115200-8-N-1\r\n");
printf("========================================\r\n");
printf("\r\nEnter any character to test echo:\r\n");
/* --- 3. 主循环:串口回环测试 --- */
while (1)
{
if (g_rx_complete)
{
g_rx_complete = false;
/* 回显接收到的字符 */
R_SCI_UART_Write(&g_uart0_ctrl, &g_rx_byte, 1);
/* 收到回车时额外换行 */
if ('\r' == g_rx_byte || '\n' == g_rx_byte)
{
uint8_t lf = '\n';
R_SCI_UART_Write(&g_uart0_ctrl, &lf, 1);
}
}
}
}
代码说明:
UART 回调 uart0_callback:在中断上下文中被 R_SCI_UART 驱动调用,UART_EVENT_RX_CHAR 事件触发时读取接收到的字节并置标志位
printf 重定向 _write():调用 R_SCI_UART_Write() 将标准输出的数据通过 SCI0 发送,主循环中即可使用 printf() 进行格式化输出
主循环:轮询 g_rx_complete 标志,一旦有字节收到就原样发回,实现"回环 Echo"效果
编译烧录流程
编译:
在 e² studio 中,右键工程名 → Build Project(或直接点击工具栏锤子图标)
编译成功后在 Console 面板看到:Build Finished. 0 errors, 0 warnings.
编译产物位于 Debug/ 或 Release/ 目录下,文件为 <工程名>.elf 和 <工程名>.hex / .srec
烧录(通过板载 J-Link OB):
确保 EK-RA4C1 通过 Type-C 线连接到 PC,板载 J-Link OB 驱动已正确安装(Windows 下设备管理器出现 "J-Link driver")
在 e² studio 的 Debug Configuration 中,调试器选择 J-Link ARM,接口选择 SWD,设备自动识别为 R7FA4C1B
点击工具栏 Debug 按钮(小虫子图标),e² studio 自动完成:编译(如需)→ 连接 J-Link → 擦除 Flash → 烧录 → 复位 → 进入调试模式
若只需烧录不调试,点击 Run 按钮或使用 Run → Debug Configurations → 勾选 "Program the device" 后直接运行
注意:若首次使用板载 J-Link OB,可能需要通过 SEGGER J-Link Configurator 升级 OB 固件以匹配最新版 e² studio / FSP。固件升级工具从 SEGGER 官网 获取。
串口调试助手验证
PC 端操作步骤:
烧录完成后,板卡自动复位运行
打开串口调试工具(以 SSCOM 为例),选择 J-Link OB 虚拟出的 COM 口(可在设备管理器中确认端口号)
参数设置:波特率 115200、数据位 8、停止位 1、无校验、无流控
点击"打开串口"
页:
[1]