瑞萨RA4M2的串口(UART)是其多功能串行通信接口(SCI)的一部分。在嵌入式开发中,掌握其硬件资源、配置方法和数据收发技巧是高效使用该芯片的基础。以下是对RA4M2串口知识的系统总结
一:串口的基础参数:
串口通道 (SCI):最多 6个 SCI通道 (SCI0 - SCI5),每个都可配置为UART模式
数据缓冲:每个SCI通道配备独立的发送和接收FIFO缓冲区,减少CPU中断次数,提高通信效率
引脚功能:支持引脚功能复用,可将UART功能映射到多个不同的I/O引脚上,方便PCB布局
相关时钟:时钟源可选自内部或外部时钟,经过分频后产生精确的波特率
二:关键参数配置:
在进行串口初始化时,需要关注以下核心配置,这些通常在FSP(Flexible Software Package)配置界面中完成
工作模式:选择 UART 模式(SCI可配置为UART、简单SPI或简单I2C)
波特率:根据应用需求选择,常见的有9600、19200、38400、115200等
数据格式:
数据位:通常为 8位。
停止位:通常为 1位 或2位。
校验位:可选择无校验、偶校验或奇校验
中断与回调:配置中断优先级并绑定 回调函数。串口的所有事件(如发送完成、接收到数据)都会在中断服务程序中通过该回调函数通知用户代码.
引脚选择:在配置工具的“Pins”页面,为选定的SCI通道指定具体的发送(TXD)和接收(RXD)引脚。
三:开发流程:
3.1工程配置 (FSP Configurator)
在PIN选项卡中配置SCI的TXD/RXD引脚。
在 Stacks卡中,新增“Driver -> Connectivity -> UART Driver on r_sci_uart”。
在属性窗口中配置波特率、数据位、停止位、回调函数名等参数。
配置完成后,点击“Generate Project Content”生成初始化代码
3.2 核心驱动API
主要依赖 r_sci_uart 驱动提供的接口
R_SCI_UART_Open:根据FSP生成的配置结构体,初始化并使能指定的UART通道
R_SCI_UART_Write:以阻塞或非阻塞方式通过串口发送指定长度的数据。
R_SCI_UART_Read:启动一个非阻塞的接收过程,将接收到的数据存入指定的缓冲区
3.3 数据收发处理:
数据发送:通常采用“非阻塞+回调”模式。调用R_SCI_UART_Write();后,CPU可继续执行其他任务。当数据从发送FIFO中全部发送完毕时,硬件产生中断,并在之前注册的回调函数中触发发送完成中断(UART_EVENT_TX_COMPLETE)事件,以此通知应用程序发送已完成。
数据接收:接收一个字节时,硬件中断触发回调函数,并传入数据接收中断(UART_EVENT_RX_CHAR)事件。应用程序需在此事件中及时将接收到的数据读取并存入用户缓冲区,防止溢出。
printf重定向:重定向标准C库的printf 函数,使其输出到串口
四:FSP库配置
4.1 CH340的原理图如下所示:

这里使用的是 P110 P109两个引脚,但是这两个引脚同时又是JLINK的调试引脚,所以这里我们把调试模式修改还曾SWD模式,将改引脚配置成串口所使用的引脚。

4.2 串口的配置

五:软件代码:
5.1 串口的初始化:
void uart9_init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg); if (FSP_SUCCESS != err)
{ while(1);
}
}5.2 串口的回调函数:void g_uart9_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;
}
}5.3 重新映射printf 函数:#ifdef __GNUC__ //串口重定向 #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endifPUTCHAR_PROTOTYPE
{
fsp_err_t err = FSP_SUCCESS;
err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1); if(FSP_SUCCESS != err) __BKPT(); while(g_data_transmit_flag == false){}
g_data_transmit_flag = false; return ch;
}这里注意一下,需要打开软件的printf 函数的调用功能。
5.4 添加printf 函数的输出:
定义一个输出的字符串:
char buffer[]="RA4M2 test !!!!\r\n";
在任务调度中添加对字符串的输出就可以了。
六:调试串口心得:
接收不定长数据:由于标准UART驱动本身无帧结束判断,需通过应用层逻辑实现:
空闲中断:如果硬件支持(部分SCI通道可能不支持),可开启空闲中断,在接收到一帧数据后的空闲时刻自动产生中断,确认为一帧完整数据。
定时器超时:利用一个定时器,在每次接收到数据时重置计时并开启定时。若定时器超时,说明在设定的间隔内未收到新数据,可认为一帧结束。
数据格式约定:在通信协议中约定帧头、帧尾(如AA BB开头,BB AA结尾)或固定长度,软件根据特征来判断帧完整性。
状态机查询:在main循环中周期性检查接收字节计数器的变化,若在一段时间内计数值未增加,则认为数据接收完成。
总结如下:
1:printf是在C语言中经常使用的输出函数,主要是用于输出一些调试信息,可以更加方便灵活的观察到变量的数值,在没有仿真的情况下,也可以直观的看到变量数值的大小。
2:当使用printf函数时候,需要设置堆栈的大小,这里我设置的是0x2000,由于是新建立的软件工程,开始没有设置堆栈的大小,自己移植的RA4M2的串口输出函数,没想到堆栈大小不足,导致程序运行出现的问题。
3:合理的设置串口的运行频率,开始设置的频率不合理,导致串口输出的也不正常。
我要赚赏金
