和大家分享一下瑞萨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模式外,发送器和接收器都具有双缓冲区结构,因此在传输或接收过程中可以读写数据,从而实现连续的数据传输和接收。
五:硬件连接
RA8D1 的串口3 与J-link调试器的引脚相连,所以本次我们以串口3进行配置、调试和分享经验。
六:FSP库配置过程如下:
对于使用软件新建工程的过程,大家可以参考之前的帖子,这里就不再过的介绍,仅介绍串口3的配置过程
【瑞萨RA8D1开发板学习历程】:01新建工程+控制LED引脚功能-电子产品世界论坛
6.1 串口3时钟的配置,这里使能串口3的时钟。
6.2 配置串口3的引脚
这里需要配置串口3的引脚与开发板的引脚功能保持一致。
6.3 新建串口3的任务
6.4 配置串口3的通讯参数信息
主要是函数名,波特率,回调函数信息,配置完成后,直接生成代码就可以了。
6.5 软件配置:
七:软件代码如下所示:
串口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接口即可。
串口接收工具测试图片如下:
工程代码如下:(开发环境:Renesas e² studio Version: 2025-04 (25.4.0))
总结如下:
1:printf是在C语言中经常使用的输出函数,主要是用于输出一些调试信息,可以更加方便灵活的观察到变量的数值,在没有仿真的情况下,也可以直观的看到变量数值的大小。
2:当使用printf函数时候,需要设置堆栈的大小,这里我设置的是0x2000,由于是新建立的软件工程,开始没有设置堆栈的大小,自己移植的RA4L1的串口输出函数,没想到堆栈大小不足,导致程序运行出现的问题。
3:合理的设置串口的运行频率,开始设置的频率不合理,导致串口输出的也不正常。