eefocus_3947073 发表于 2026-6-22 09:32:33

【瑞萨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]
查看完整版本: 【瑞萨EK-RA4C1】板卡串口测试

Baidu
map