2026 / 07 / 21
在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/N2L:https://www.renesas.cn/cn/zh/products/microcontrollers-microprocessors/rz-mpus/rzn2l-integrated-tsn-compliant-3-port-gigabit-ethernet-switch-enables-various-industrial-applications


瑞萨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。


更多信息您可点击链接查看:

RZ/T2M:https://www.renesas.cn/cn/zh/products/microcontrollers-microprocessors/rz-mpus/rzt2m-high-performance-multi-function-mpu-realizing-high-speed-processing-and-high-precision-control


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


一 FSP的配置

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


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


二 编译器配置

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


选择Do not use syscalls。


三 添加代码

添加初始化程序

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使用。


添加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;
}


使用方法

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

 uart_no_intp_init(&g_uart0_ctrl,&g_uart0_cfg);


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

文件下载
隐私条款

一、接受条款 使用者(也称"您")在访问或使用本网站及其服务时,即已经表示同意并不加修改地接受本《用户协议》、本网站的《隐私声明》、《法律声明》以及其关或相链接的网页和网站的条件和条款的规定。我们强烈建议:在您阅读和接受本《用户协议》时,也应阅读并接受本《用户协议》中所提到《隐私声明》、《法律声明》及其相关或相链接网页或网站所包含的资料,因为《隐私声明》、《法律声明》及其它相关网页或网站可能包含对您适用的进一步规定。(请注意:点击划有底线的词句即可链接到上述《隐私声明》、《法律声明》及其它相关或相链接的网页和网站。

 

二、使用者的资格要求 在本网站中"使用者"指的是浏览、阅读、使用本网站信息或服务的任何个人或组织。本网站的服务仅适用于根据相关法律的规定具有签订有约束力的合同的个人或组织并仅由其使用。本网站的服务不向18周岁以下的个人使用者提供,也不向临时被本网站中止或取消使用者资格的使用者提供。如果使用者不符合本条规定,请停止使用本网站或本网站的服务。

样品
申请

应用
资源

微信