目录
概述
1 软硬件介绍
1.1 软件版本信息
1.2 硬件介绍
2 FSP配置项目
2.1 项目参数配置
2.2 配置UART参数
3 功能实现
3.1 软件架构实现
3.2 UART接口函数
3.2.1 R_SCI_UART_Open()
3.2.2 R_SCI_UART_Close()
3.2.3 R_SCI_UART_Read()
3.2.4 R_SCI_UART_Write()
3.2.5 R_SCI_UART_CallbackSet()
4 串口功能实现
4.1 初始化函数
4.2 设置Buad函数
4.3 串口中断函数
4.4 源代码
5 测试
6 参考文档
概述
本文主要介绍使用Renesas MCU之串口的发送接收功能实现,包括硬件资源介绍,FSP配置项目的方法,还介绍了UART的接口函数,还编写测试函数验证该功能。
1 软硬件介绍
1.1 软件版本信息
软硬件信息 | 版本信息 |
---|---|
Renesas MCU | R7FA4M2AD3C |
Keil | MDK ARM 5.38 |
FSP 版本 | 5.3.0 |
调试工具:st-link | ST-LINK/V2-1 |
1.2 硬件介绍
笔者使用的板卡上UART端口通过USB-UART芯片CH340G做转换,实现串口收发数据功能
TXD: P110
RXD: P109
2 FSP配置项目
2.1 项目参数配置
1)配置系统时钟
笔者使用的开发板上配置的晶振为12M Hz,在Clock时钟蓝选择该型号的时钟配置参数
2)配置debug接口,选择swo类型
3)配置TX和RX的IO接口
2.2 配置UART参数
1)在Stacks中创建UART对象
2) 配置uart的参数
注意:在Interrupt中定义Callback函数g_uart0_Callback
3 功能实现
3.1 软件架构实现
在FSP中配置完成参数后,点击Generate Project生成项目文件
3.2 UART接口函数
该模块使用TXD和RXD与外部设备通信。CTS或RTS或两者都可以由硬件控制(CTS和RTS)。一些mcu在某些通道上支持CTS和RTS的硬件流控制。一些mcu和通道支持CTS或RTS的硬件流控制,但不支持两者。如果两者都需要,GPIO引脚可以用于RTS。当内部时钟是波特率发生器的源时,SCK引脚可用于输出与比特率相同频率的时钟。
3.2.1 R_SCI_UART_Open()
函数原型:
fsp_err_t R_SCI_UART_Open ( uart_ctrl_t *const p_api_ctrl,uart_cfg_t const *const p_cfg )
根据输入配置配置UART驱动程序。如果在编译时启用接收,则在此函数结束时启用接收。实现串口uart_api_t::open打开功能。
3.2.2 R_SCI_UART_Close()
函数原型:
fsp_err_t R_SCI_UART_Close ( uart_ctrl_t *const p_api_ctrl )
中止任何正在进行的传输。禁用中断、接收器和发送器。如果使用,关闭较低级别传输驱动程序。删除的权力。应用uart_api_t::close实现关闭串口功能。
3.2.3 R_SCI_UART_Read()
函数原型:
fsp_err_t R_SCI_UART_Read ( uart_ctrl_t *const p_api_ctrl,uint8_t *const p_dest,uint32_t const bytes )
在目标缓冲区指针中接收用户指定的字节数
3.2.4 R_SCI_UART_Write()
函数原型:
fsp_err_t R_SCI_UART_Write ( uart_ctrl_t *const p_api_ctrl,uint8_t const *const p_src,uint32_t const bytes )
从源缓冲区指针传输用户指定的字节数。
3.2.5 R_SCI_UART_CallbackSet()
函数原型:
fsp_err_t R_SCI_UART_CallbackSet ( uart_ctrl_t *const p_api_ctrl,void(*)(uart_callback_args_t *) p_callback,void const *const p_context,uart_callback_args_t *const p_callback_memory )
更新用户回调,并可选择为回调结构提供内存.
4 串口功能实现
4.1 初始化函数
代码第91行:打开串口
代码第93行:从串口读取数据
代码第95行:从串口写数据
4.2 设置Buad函数
代码第73行:计算baud
代码第78行:设置串口baud
4.3 串口中断函数
代码第24行:接收数据事件,在该事件里接收数据包
代码第47行:接收数据完成事件
代码第53行:发送数据完成事件
4.4 源代码
创建bsp_uart.c文件,编写如下代码:
/*FILE NAME : bsp_uart.cDescription: uart interfaceAuthor : tangmingfei2013@126.comDate : 2024/06/03*/
#include "bsp_uart.h"#define TRANSFER_LENGTH 128bool uart_send_complete_flag = false;
uint8_t g_dest[TRANSFER_LENGTH];
uint8_t g_src[TRANSFER_LENGTH];
uint8_t g_out_of_band_received[TRANSFER_LENGTH];
uint32_t g_receive_complete = 0;
uint32_t g_out_of_band_index = 0;void g_uart0_Callback (uart_callback_args_t * p_args)
{/* Handle the UART event */switch (p_args->event){/* Received a character */case UART_EVENT_RX_CHAR:{/* Only put the next character in the receive buffer if there is space for it */if (sizeof(g_out_of_band_received) > g_out_of_band_index){/* Write either the next one or two bytes depending on the receive data size */if (UART_DATA_BITS_8 >= g_uart0_cfg.data_bits){g_out_of_band_received[g_out_of_band_index++] = (uint8_t) p_args->data;}else{uint16_t * p_dest = (uint16_t *) &g_out_of_band_received[g_out_of_band_index];*p_dest = (uint16_t) p_args->data;g_out_of_band_index += 2;}if( g_out_of_band_index >= TRANSFER_LENGTH )g_out_of_band_index = 0;}break;}/* Receive complete */case UART_EVENT_RX_COMPLETE:{g_receive_complete = 1;break;}/* Transmit complete */case UART_EVENT_TX_COMPLETE:{uart_send_complete_flag = true;break;}default:{}}
}#define SCI_UART_BAUDRATE_19200 (19200)
#define SCI_UART_BAUDRATE_ERROR_PERCENT_5 (5000)void r_sci_uart_baud_set (uint32_t baud_rate )
{baud_setting_t baud_setting;bool enable_bitrate_modulation = false;uint32_t error_rate_x_1000 = SCI_UART_BAUDRATE_ERROR_PERCENT_5;fsp_err_t err = R_SCI_UART_BaudCalculate( baud_rate, enable_bitrate_modulation, error_rate_x_1000, &baud_setting);assert(FSP_SUCCESS == err);err = R_SCI_UART_BaudSet(&g_uart0_ctrl, (void *) &baud_setting);assert(FSP_SUCCESS == err);
}void r_sci_uart_basic_init (void)
{/* Initialize p_src to known data */for (uint32_t i = 0; i < TRANSFER_LENGTH; i++){g_src[i] = (uint8_t) ('A' + (i % 26));}/* Open the transfer instance with initial configuration. */fsp_err_t err = R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);assert(FSP_SUCCESS == err);err = R_SCI_UART_Read(&g_uart0_ctrl, g_dest, TRANSFER_LENGTH);assert(FSP_SUCCESS == err);err = R_SCI_UART_Write(&g_uart0_ctrl, g_src, TRANSFER_LENGTH);assert(FSP_SUCCESS == err);
}int fputc(int ch, FILE *f)
{(void)f;R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);while(uart_send_complete_flag == false);uart_send_complete_flag = false;return ch;
}/* End of this file */
5 测试
编译代码,下载到板卡中 ,复位板卡后,在调试终端会看见接收到的数据
发送数据测试,使用ST--LINK测试,监测buff中的数据
6 参考文档
RA Flexible Software Package Documentation Release v5.3.0