基于RA2L1实现串口DTC数据接收

描述

 

介绍

开发环境:IAR FOR ARM 9.30.1

RASC V4.3.0

芯片型号:R7FA2L1AB2DFL#AA0

功能描述

在串口+DTC功能时无法得知接收一帧数据是否接收结束。本例程配合ELC功能联动定时器来判断串口接收字节与字节之间超时来判断一帧数据的接收完成。

主要内容

1新建RASC工程

RASC v4.3.0下载链接:

https://github.com/renesas/fsp/releases

如下图所示:

数据接收

2安装好RASC

默认安装目录:

C:RenesasRAsc_v2023-01_fsp_v4.3.0

双击 数据接收 运行RASC

数据接收

3打开后如下图所示:

数据接收

4新建工程

数据接收数据接收数据接收数据接收数据接收

5配置串口PIN脚功能

数据接收

6添加串口功能

数据接收

7添加串口dtc收发功能

数据接收数据接收

8配置串口属性

数据接收数据接收

9添加定时器

数据接收

10配置定时器

这里以超时时间为2ms为例,用户可以根据实际情况超时时间。

数据接收数据接收数据接收

11添加ELC

数据接收

12所需外设都已经配置好,生成IAR工程

数据接收

13打开IAR工程

数据接收

14在hal_entry.c文件添加如下代码:

 

#define TRANSFER_LENGTH         512
transfer_properties_t uart0_dtcinfo1;


typedef struct sf_uart_conf
{
    uint8_t uart_txflag;                                //发送标志
    uint8_t uart_rxflag;                                //接收标志
    uint16_t uart_txlen;                                //发送长度
    uint16_t uart_rxlen;                                //接收长度
    uint8_t uart_rxbuf[TRANSFER_LENGTH];                //接收buf
    uint8_t uart_txbuf[TRANSFER_LENGTH];                //发送buf
} sf_uart_conf_t;


sf_uart_conf_t uart0;
//2ms定时器0回调函数
void uart0_rxtimeout_cb( timer_callback_args_t* p_args )
{
    if ( TIMER_EVENT_CYCLE_END == p_args->event )
    {
        //关定时器0
        ( void ) R_GPT_Stop( &g_timer0_ctrl );
        //获取串口0 接收DTC信息
        R_DTC_InfoGet( &g_transfer1_ctrl, &uart0_dtcinfo1 );
        //计算串口0接收长度
        uart0.uart_rxlen = TRANSFER_LENGTH -  uart0_dtcinfo1.transfer_length_remaining;
        //置发送标志
        uart0.uart_rxflag = 1;
    }
}
//串口中断回调函数
void uart0isr_cb( uart_callback_args_t* p_args )
{
    /* Handle the UART event */
    switch ( p_args->event )
    {
        /* Received a character */
        case UART_EVENT_RX_CHAR:
            {
                break;
            }
        /* Receive complete */
        case UART_EVENT_RX_COMPLETE:
            {
                break;
            }
        /* Transmit complete */
        case UART_EVENT_TX_COMPLETE:
            {
              //置串口0发送完成标志,清接收标志
                uart0.uart_rxflag = 0;
                uart0.uart_txflag = 1;
                break;
            }
        default:
            {
            }
    }
}
void hal_entry(void)
{
 /* TODO: add your own code here */
  //初始化定时器0  2ms间隔中断
    R_GPT_Open( &g_timer0_ctrl, &g_timer0_cfg );
    //初始化串口0
    R_SCI_UART_Open( &g_uart0_ctrl, &g_uart0_cfg );
    //初始化ELC联动
    R_ELC_Open( &g_elc_ctrl, &g_elc_cfg );
    //使能ECL
    R_ELC_Enable( &g_elc_ctrl );
    //使能定时器0
    ( void ) R_GPT_Enable( &g_timer0_ctrl );
    //智串口0发送标志
    uart0.uart_txflag = 1;
    while ( true )
    {
        if ( uart0.uart_rxflag )
        {
            uart0.uart_rxflag = 0;
            uart0.uart_txlen = uart0.uart_rxlen;
            R_SCI_UART_Write( &g_uart0_ctrl,  uart0.uart_rxbuf, uart0.uart_txlen );
        }
        if ( uart0.uart_txflag )
        {
            uart0.uart_txflag = 0;
            R_SCI_UART_Read( &g_uart0_ctrl,  uart0.uart_rxbuf, TRANSFER_LENGTH );
        }
    }
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

 

15

仿真测试如下图所示:

数据接收

结论

该方式没有问题,可以正常应用到开发中。

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分