这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【瑞萨RA8D1开发板学习历程】:02串口调试+实现printf重映射功能

共1条 1/1 1 跳转至

【瑞萨RA8D1开发板学习历程】:02串口调试+实现printf重映射功能

高工
2025-06-07 11:30:39     打赏

和大家分享一下瑞萨RA8D1的串口输出功能。

串行通信接口(SCI)

1:RA8D1 串口的基本特性:

UART模块数量:RA8D1通常包含多个UART模块(具体数量取决于型号)

通信速率:支持高达数Mbps的波特率

数据格式:可配置数据位(7/8位)、停止位(1/2位)和奇偶校验位

流控制:支持硬件流控制(RTS/CTS)

2:RA8D1 串口功能特点

全双工通信:可同时进行发送和接收

FIFO缓冲:内置FIFO缓冲区减少CPU中断负载

DMA支持:可与DMA控制器配合实现高效数据传输

错误检测:支持帧错误、奇偶校验错误和溢出错误检测

自动波特率检测:部分型号支持自动检测波特率功能

3:RA8D1 寄存器配置

主要配置寄存器包括:

控制寄存器(SCR、SCMR等)

波特率寄存器(BRR)wu

状态寄存器(SSR)

数据寄存器(TDR/RDR)

 四:异步模式操作

一个帧由起始位(低级)、发送或接收数据、校验位和停图31.6显示了异步串行通信的一般格式。

止位(高级)组成。在异步串行通信中,通信线路通常保持在标记状态(高电平)。

SCI监视通信线路。当SCI检测到起始位时,它就开始出行通信。起始位的检测条件根据CCR3.RXDESEL设置改变。当CCR3.RXDESEL为0时,SCI将空格(低电平)作为起始位。当RXDESEL为1时,SCI将下降沿视为起始位。

在SCI内部,发送器和接收器是独立的单元,能够实现全双工通信。除了FIFO模式外,发送器和接收器都具有双缓冲区结构,因此在传输或接收过程中可以读写数据,从而实现连续的数据传输和接收。

1.png

五:硬件连接

3.png

RA8D1 的串口3 与J-link调试器的引脚相连,所以本次我们以串口3进行配置、调试和分享经验。

六:FSP库配置过程如下:

对于使用软件新建工程的过程,大家可以参考之前的帖子,这里就不再过的介绍,仅介绍串口3的配置过程

【瑞萨RA8D1开发板学习历程】:01新建工程+控制LED引脚功能-电子产品世界论坛

6.1 串口3时钟的配置,这里使能串口3的时钟。

4.png

6.2 配置串口3的引脚

5.png

这里需要配置串口3的引脚与开发板的引脚功能保持一致。

6.3 新建串口3的任务

6.png

6.4 配置串口3的通讯参数信息

7.png

主要是函数名,波特率,回调函数信息,配置完成后,直接生成代码就可以了。

6.5 软件配置:

8.png

七:软件代码如下所示:

串口3的重映射和初始化部分

volatile bool g_data_received_flag = false;
volatile bool g_data_transmit_flag = false;

void user_uart3_callback(uart_callback_args_t *p_args)
{
switch (p_args->event)
{
case UART_EVENT_TX_COMPLETE:
g_data_transmit_flag = true;
break;

case UART_EVENT_RX_COMPLETE:
g_data_received_flag = true;
break;

default:
break;
}
}

int fputc(int ch, FILE *f)
{
FSP_PARAMETER_NOT_USED(f);

// Start Transmission
g_data_transmit_flag = false;
if(ch != 0)
{
fsp_err_t err = R_SCI_B_UART_Write(&g_uart3_ctrl, (uint8_t * const)(&ch), 1U);
if (FSP_SUCCESS != err)
{
return -1;
}
}
else
return 0;

// Wait for event receive complete
while (!g_data_transmit_flag)
{
}

return FSP_SUCCESS;
}

主程序如下所示:

/*初始化 串口3部分*/
err = R_SCI_B_UART_Open(&g_uart3_ctrl, &g_uart3_cfg);
if (FSP_SUCCESS != err)
{
while(1);
}

while(1)
    {
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_10_PIN_01, BSP_IO_LEVEL_HIGH);
R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_10_PIN_01, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS);

printf("Hello EEPW! by:keyboard007!\r\n");
}

硬件连接:

使用USB线将RA8D1的 JDBG的接口连接到电脑的的USB接口即可。

微信图片_20250607135630.jpg

串口接收工具测试图片如下:

9.png

工程代码如下:(开发环境:Renesas e² studio Version: 2025-04 (25.4.0))

02uart3.zip

总结如下:

1:printf是在C语言中经常使用的输出函数,主要是用于输出一些调试信息,可以更加方便灵活的观察到变量的数值,在没有仿真的情况下,也可以直观的看到变量数值的大小。

2:当使用printf函数时候,需要设置堆栈的大小,这里我设置的是0x2000,由于是新建立的软件工程,开始没有设置堆栈的大小,自己移植的RA4L1的串口输出函数,没想到堆栈大小不足,导致程序运行出现的问题。

3:合理的设置串口的运行频率,开始设置的频率不合理,导致串口输出的也不正常。




关键词: RA8D1     实现     printf     串口    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]