【瑞萨RA-eco-RA6M4评测】- TOF测距准备篇
一、前言
本篇文章是上一篇《[评测分享] 【瑞萨RA-eco-RA6M4评测】- 解决demo中串口收发问题》文章的延续,在该篇文章中我们会创建另外一路串口,那么这样一来我们就有两路串口了,该两路串口的目的为,一路用于和UWB模块进行通信,负责测距,另外一路串口将测试到的数据上传到电脑端,电脑端通过上位机来显示测试到的距离。
二、开发板图片
1、瑞萨开发板图片
2、UWB测距模块
备注:测距至少用到两块UWB模块,该模块的型号为MK8000
三、正文
1、使用瑞萨e2 studio配置另外一路串口
在一篇文章中我们已经配置了一路串口,该串口的引脚如下图所示
接下来我们配置第二路串口,首先打开e2 studio软件,按如下步骤进行串口2的配置
按上图所示进行配置的串口TX为P101,RX为P100
2、配置软件模块栈
按上图所示的顺序生成新的串口stacks
3、配置通道和回调名称
将通道配置为1,波特率保持115200不变
将中断的回调函数名称赋值为user_uart1_callback
4、点击生成代码
5、串口初始化
err = R_SCI_UART_Open(&g_uart1_ctrl, &g_uart1_cfg);
assert(FSP_SUCCESS == err);如上所示,需要将串口进行初始化
6、相关串口变量设置
volatile bool uart_send_complete_flag = false;
volatile bool uart1_send_complete_flag = false;
uint8_t RxBuff; //进入中断接收数据的数组
uint8_t RxBuff1; //进入中断接收数据的数组1
uint8_t DataBuff; //保存接收到的数据的数组
uint8_t DataBuff1; //保存接收到的数据的数组
int RxLine=0; //接收到的数据长度
int Rx_flag=0; //接受到数据标志
int Rx_flag_finish=0; //接受完成或者时间溢出
int RxLine1=0; //接收到的数据长度
int Rx_flag1=0; //接受到数据标志
int Rx_flag_finish1=0; //接受完成或者时间溢出
如上所示,基本上是将前一个串口的命令,给复制了一个。
7、串口回调函数编写
void user_uart1_callback (uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart1_send_complete_flag = true;
}
if(p_args->event == UART_EVENT_RX_CHAR)
{
RxBuff1 = p_args->data;
RxLine1++; //每接收到一个数据,进入回调数据长度加1
DataBuff1=RxBuff1;//把每次接收到的数据保存到缓存数组
if(RxBuff1==0xaa) //接收结束标志位,这个数据可以自定义,根据实际需求,这里只做示例使用,不一定是0xff
{
Rx_flag_finish1=1;
}
RxBuff1=0;
}
}该串口回调的功能是,将接收到的数据存入数组DataBuff1中,当接收到0xaa的字节之后,说明串口接收完毕
8、串口测试函数编写
该函数的作用是检查是否接收完毕,如果接收完毕则原封不动的回传到串口。
9、完整的C代码
#include "hal_data.h"
#include <stdio.h>
#include <sys/stat.h>
#include <errno.h>
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
void printf_usart(void);
fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
volatile bool uart1_send_complete_flag = false;
uint8_t RxBuff; //进入中断接收数据的数组
uint8_t RxBuff1; //进入中断接收数据的数组1
uint8_t DataBuff; //保存接收到的数据的数组
uint8_t DataBuff1; //保存接收到的数据的数组
int RxLine=0; //接收到的数据长度
int Rx_flag=0; //接受到数据标志
int Rx_flag_finish=0; //接受完成或者时间溢出
int RxLine1=0; //接收到的数据长度
int Rx_flag1=0; //接受到数据标志
int Rx_flag_finish1=0; //接受完成或者时间溢出
void user_uart_callback (uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
if(p_args->event == UART_EVENT_RX_CHAR)
{
RxBuff = p_args->data;
RxLine++; //每接收到一个数据,进入回调数据长度加1
DataBuff=RxBuff;//把每次接收到的数据保存到缓存数组
Rx_flag=1;
if(RxBuff==0xff) //接收结束标志位,这个数据可以自定义,根据实际需求,这里只做示例使用,不一定是0xff
{
Rx_flag_finish=1;
}
RxBuff=0;
err = R_GPT_Reset(&g_timer0_ctrl);
assert(FSP_SUCCESS == err);
}
}
void user_uart1_callback (uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart1_send_complete_flag = true;
}
if(p_args->event == UART_EVENT_RX_CHAR)
{
RxBuff1 = p_args->data;
RxLine1++; //每接收到一个数据,进入回调数据长度加1
DataBuff1=RxBuff1;//把每次接收到的数据保存到缓存数组
if(RxBuff1==0xaa) //接收结束标志位,这个数据可以自定义,根据实际需求,这里只做示例使用,不一定是0xff
{
Rx_flag_finish1=1;
}
RxBuff1=0;
}
}
#ifdef __GNUC__ //串口重定向
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
err = R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){}
uart_send_complete_flag = false;
return ch;
}
int _write(int fd,char *pBuffer,int size)
{
for(int i=0;i<size;i++)
{
__io_putchar(*pBuffer++);
}
return size;
}
/* Callback function */
void timer0_callback(timer_callback_args_t *p_args)
{
/* TODO: add your own code here */
if (TIMER_EVENT_CYCLE_END == p_args->event)
{
if(Rx_flag==1)
{
printf_usart();
Rx_flag=0;
}
}
}
void hal_entry(void)
{
/* TODO: add your own code here */
/* Open the transfer instance with initial configuration. */
err = R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);
assert(FSP_SUCCESS == err);
err = R_SCI_UART_Open(&g_uart1_ctrl, &g_uart1_cfg);
assert(FSP_SUCCESS == err);
while(1)
{
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS); // NOLINT100->160
if(Rx_flag_finish1==1)
{
R_SCI_UART_Write(&g_uart1_ctrl, DataBuff1, RxLine1);
while(uart1_send_complete_flag == false){}
uart1_send_complete_flag = false;
Rx_flag_finish1 = 0;
RxLine1 = 0;
}
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
void printf_usart(void)
{
printf("length=%d\r\n",RxLine);
for(int i=0;i<RxLine;i++)
printf("data:[%d] = 0x%x\r\n",i,DataBuff);
memset(DataBuff,0,sizeof(DataBuff));//清空缓存数组
//memset()作用:可以方便的清空一个结构类型的变量或数组。
//例句:memset(aTxbuffer,0,sizeof(aTxbuffer))用memset清空aTxbuffer。
RxLine=0;//清空接收长度
Rx_flag_finish=0;
Rx_flag = 0;
}
/*******************************************************************************************************************//**
* This function is called at various points during the startup process.This implementation uses the event that is
* called right before main() to set up the pins.
*
* @paramevent Where at in the start up process the code is currently at
**********************************************************************************************************************/
void R_BSP_WarmStart(bsp_warm_start_event_t event)
{
if (BSP_WARM_START_RESET == event)
{
#if BSP_FEATURE_FLASH_LP_VERSION != 0
/* Enable reading from data flash. */
R_FACI_LP->DFLCTL = 1U;
/* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and
* C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */
#endif
}
if (BSP_WARM_START_POST_C == event)
{
/* C runtime environment and system clocks are setup. */
/* Configure pins. */
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
}
}
#if BSP_TZ_SECURE_BUILD
BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ();
/* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */
BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ()
{
}
#endif
int _close(int file) {
return -1; // 不支持关闭,返回错误
}
int _lseek(int file, int ptr, int dir) {
return 0; // 不支持定位,返回0
}
int _read(int file, char *ptr, int len) {
return 0; // 无输入,返回0(可在此通过UART实现接收)
}
int _fstat(int file, struct stat *st) {
st->st_mode = S_IFCHR; // 标记为字符设备
return 0;
}
int _isatty(int file) {
return 1; // 假设所有文件描述符都是终端
}
10、测试结果
https://www.bilibili.com/video/BV1utug6TE9X/
页:
[1]