在RZ/T2M和RZ/N2L中Printf添加方法(使用查询模式实现UART)

描述

 

瑞萨RZ/N2L MPU

RZ/N2L是一种工业以太网通信用MPU,可轻松将网络功能添加到工业设备中。它搭载支持TSN的三端口千兆以太网交换机和EtherCAT从控制器,可支持EtherCAT、PROFINET RT/IRT、EtherNet/IP、OPC UA等主要的工业以太网通信协议。它对网络专用配套芯片加以优化,无需大幅改变设备的内部配置即可直接连接并快速访问外部应用主机CPU。

此外,Arm Cortex-R52的最大工作频率为400MHz,外设功能包括带ECC的大容量RAM与ΔΣ I/F、A/D转换器、PWM定时器、UART和CAN等,可在单个芯片上实现远程I/O、传感器集线器、变频器和网关。

变频器

 

瑞萨RZ/T2M MPU

RZ/T2M是一款行业领先的高性能、多功能MPU,可实现AC伺服系统和工业电机等工业设备的高速处理、高精度控制和功能安全。RZ/T2M具有最大频率为800 MHz的双Arm Cortex-R52内核,可进行实时控制,而且还拥有能够与CPU直接连接的大容量紧密耦合内存(576KB),以实现高性能实时处理。

此外,它还可以将电机控制的外设布置到能直接连接至CPU的LLPP(低延迟外设端口)上,来实现较低的延迟访问。RZ/T2M拥有多协议编码器硬件接口,可为A-format、EnDat 和BiSS等各种绝对编码器协议提供支持。此外,RZ/T2M还拥有一个3端口的千兆以太网交换机,可为TSN标准及EtherCAT、PROFINET RT/IRT和EtherNet/IP等工业以太网协议提供支持,而无需额外的以太网交换机IC。

变频器

在项目调试过程中经常会用到printf函数,但是有时候printf函数需要运行在不打开中断的情况下,但是官方FSP给出的UART驱动使用的是中断模式,下面介绍一种使用查询模式实现UART的方式。

FSP的配置

1

添加UART模块,为了使用printf设置fsp配置器如下,选择使用fifo模式来提高效率,UART的通道可以根据自己的硬件设计任意选取。

变频器

2

如果使用标准输入函数,需要选择接收UART的接收FIFO的trigger level是1,这样只要收到一个数据就可以产生uart接收标志。

变频器

编译器配置

在工程上点右键选择Properties → C/C++ Build → setting,然后按照下图来设置编译器。

变频器

选择Do not use syscalls。

添加代码

1

添加初始化程序

 

static R_SCI0_Type *uart_reg=NULL;
void uart_no_intp_init(uart_ctrl_t * const p_api_ctrl, uart_cfg_t const * const p_cfg)
{
    if(uart_reg != NULL)return;
    R_SCI_UART_Open(p_api_ctrl, p_cfg);
    R_BSP_IrqDisable(p_cfg->txi_irq);
    R_BSP_IrqDisable(p_cfg->tei_irq);
    R_BSP_IrqDisable(p_cfg->rxi_irq);
    R_BSP_IrqDisable(p_cfg->rxi_irq);
    uart_reg = ((sci_uart_instance_ctrl_t *)p_api_ctrl)->p_reg;
}

 

调用这个函数时,将hal_data.c的uart实例的cfg和ctrl作为参数即可,调用完后UART的寄存器地址会保存在uart_reg内,以备write和read使用。

2

添加write和read函数

 

int32_t _write(int32_t file_no,int8_t *buffer,uint32_t writing_b)
{
    uint32_t tempcnt=writing_b;
    (void) ((file_no));
    if(writing_b ==0)return 0;
    if(uart_reg==NULL)return -1;
    while(tempcnt!=0)
    {
         while(uart_reg->FTSR>13);
         uart_reg->TDR_b.TDAT = (uint8_t)*buffer;
         __DSB();
         buffer++;
         tempcnt--;
    }
    return writing_b;
}
/*******************************************************************************
* Function Name: SioRead
* Description  : The character strings specified with buffer is input for
*              : n bytes from serial port.The input is determined by file number fileno.
*              : The effective input in this version is STDIN.
* Arguments    : int32_t  file_no  ; I : File number to be the target of reading
*              : int_t  * buffer   ; O : Pointer to the area in which reading data is stored
*              : uint32_t reading_b; I : Reading bytes
* Return Value : >0 : Number of receiving characters
*              : -1 : File number, receiving data error
*******************************************************************************/
 
int32_t _read (int32_t file, int8_t *ptr, uint32_t len)
{
    (void) ((file));
    if(uart_reg==NULL)return 0;
    if(uart_reg->FRSR_b.R!=0)
    {
        *ptr = (uint8_t)uart_reg->RDR_b.RDAT;
        __DSB();
    }
    else
    {
        return 0;
    }
    return 1;
}

 

3

使用方法

先调用初始化函数后就可以使用了,下面是一个初始化的调用例子:

 uart_no_intp_init(&g_uart0_ctrl,&g_uart0_cfg);

 

g_uart0_ctrl和g_uart0_cfg是 FSP生成的两个变量。

 



审核编辑:刘清

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

全部0条评论

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

×
20
完善资料,
赚取积分