基于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
完善资料,
赚取积分