0 前言
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
所以,为了方便后续调试,在这一节中,学习使用FSP库进行UART串口通信。
1 硬件部分
从RA-Eco-RA4E2-64PIN-V1.0
开发板的原理图可以知道,这块板子使用CH340N USB转串口,连接到P109和P110 IO口。
USB转串口模块在板子的左下角区域
2 软件部分
2.1 新建工程
将先前创建的工程模板文件夹复制一份,并将文件夹重命名为02_UART
在e2s里面,选择菜单栏的文件--导入--常规--现有项目到工作空间中--选择根目录"浏览"--完成。
2.2 配置工程
2.2.1 设置外设对应引脚
双击e2s界面左侧的项目资源管理器
当中的configuration.xml
文件,在中间选择Pins--peripherals--Connectivity:SCI--SCI9,将右侧的RXD9设置为P110、TXD9为P109
2.2.2 新建并设置模块属性
点击Stacks,New Stack--Connectivity--UART(r_sci_uart)
单击g_uart0_UART,在属性对话框中更改name
为g_uart9
,Channel
改为9
,其他属性配置保持默认。
然后,在Interrupts--Callback中,修改为debug_uart9_callback
,这是串口中断回调函数,稍后将在代码中写具体逻辑。每当串口发送或者接收完成一个字符时,都会默认触发串口的中断,而在串口中断中会调用函数 debug_uart9_callback,在函数里我们需要根据不同的中断情况进行相应的处理。
2.2.3 重定向printf输出到串口
虽然我们可以直接使用 R_SCI_UART_Write
函数来将字符串输出到串口,但是这个函数在很多情况下没有 printf
函数那样方便。所以我们需要添加一段代码来将 printf 输出重定向到串口UART9。
在菜单栏中单击项目--C/C++ Project Settings,按下图所示进行勾选,最后应用并关闭。
最后,修改一下堆大小,点击BSP--Heap Size--修改为0x1000
2.2.4 生成代码
保存配置文件,并点击Generate Project Content让其自动为我们生成代码。
2.3 编写代码
2.3.1 新建文件夹及源文件
在工程的src文件夹下,新建一个文件夹名为debug_uart
,以及debug_bsp_uart.h
头文件和debug_bsp_uart.c
源文件。
2.3.2 修改debug_bsp_uart.c
在debug_bsp_uart.c
中键入如下代码,包含了一个发送完成标志uart_send_complete_flag
、调试串口 UART9 初始化Debug_UART9_Init
和先前配置的串口回调函数debug_uart9_callback
。
#include "bsp_debug_uart.h"
volatile int uart_send_complete_flag = 0;
void Debug_UART9_Init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_SCI_UART_Open (&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
}
void debug_uart9_callback (uart_callback_args_t * p_args)
{
switch (p_args->event)
{
case UART_EVENT_RX_CHAR:
{
R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&(p_args->data), 1);
break;
}
case UART_EVENT_TX_COMPLETE:
{
uart_send_complete_flag = 1;
break;
}
default:
break;
}
}
还是在debug_bsp_uart.c
文件中,加入重定向 printf 输出的函数
#if defined __GNUC__ && !defined __clang__
int _write(int fd, char *pBuffer, int size);
int _write(int fd, char *pBuffer, int size)
{
(void)fd;
R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
while(uart_send_complete_flag == 0);
uart_send_complete_flag = 0;
return size;
}
#else
int fputc(int ch, FILE *f)
{
(void)f;
R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
while(uart_send_complete_flag == 0);
uart_send_complete_flag = 0;
return ch;
}
#endif
2.3.3 修改debug_bsp_uart.h
在debug_bsp_uart.h
中加入以下代码,用于声明函数:
#include "hal_data.h"
#include "stdio.h"
void Debug_UART9_Init(void);
2.3.4 修改hal_entry.c
在文件开头,加入以下代码:
#include "debug_uart/debug_bsp_uart.h"
在hal_entry
函数中,加入以下代码:
Debug_UART9_Init();
printf("这是一个串口收发回显例程\r\n");
printf("打开串口助手发送数据,接收窗口会回显所发送的数据\r\n");
3 下载测试
编译项目、烧录程序。
用Type-C USB线连接开发板 POWER/UART 接口跟电脑。打开任意一个串口调试助手软件,配置波特率为115200,打开串口后,在调试助手的发送区域输入任意字符并点击发送,即可在接收区看见相同字符,如下图所示