This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C129LNCZAD:切换 UART2引脚

Guru**** 2380860 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1133112/tm4c129lnczad-switching-uart2-pins

器件型号:TM4C129LNCZAD

我正在尝试切换 UART2的 GPIO 引脚、以便能够在 PA6、7上发送和接收数据、并切换至引脚 PD4、5以发送和接收数据。

void switch_uart2(bool mode)
{

    if (mode == 0)
    {
        //Computer Pins
        //UART 2 Config:
        ROM_GPIOPinConfigure(GPIO_PA6_U2RX);
        ROM_GPIOPinConfigure(GPIO_PA7_U2TX);
        ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7);
    }
    else
    {
        //Slave MCU Pins
        ROM_GPIOPinConfigure(GPIO_PD4_U2RX);
        ROM_GPIOPinConfigure(GPIO_PD5_U2TX);
        ROM_GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5);
    }
}

当我尝试从 PA6、7切换到 PD4、5时、数据仍在 PA6、7上发送。 是否可以切换 UART2的 GPIO 引脚?

//Switch UART2 GPIO Pins.
switch_uart2(1);
//Send slave measure command.
ROM_UARTCharPutNonBlocking(UART2_BASE, 'M');

谢谢、

Allan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Allan、

    那么、这是一个有趣的案例... 我之前没有见过 UART 的端口切换、认为答案是直接的、但并不像看起来那样简单。 明天我想和我的同事一起回顾这一点、也要了解他的想法、因为有几种可能的解决方案、但没有一种解决方案是我所说的与预期相比合乎逻辑的。

    根本问题是 UART 外设没有专用的引脚复用寄存器、因此它不清楚如何在这两个端口之间进行选择。 与此同时、GPIO 外设只是上升两个端口以进行 UART 操作、并且没有真正的内置方法可以通过 TivaWare API "撤消"该操作、而无需重置外设、这有点剧烈、会影响外设本身上的其他端口。

    也许 我只是在这里的一个“糟糕”的时刻忽略了一些东西,因为我觉得没有办法简单地这样做是非常不合逻辑的。

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    拉尔夫

    我在这里有一点不知道、但我可能使 UART2 GPIO 开关部件工作。 我将 switch_uart2 ()函数修改为、

    void switch_uart2(bool mode)
    {
    
        if (mode == 0)
        {
            //Computer Pins
            //UART 2 Config:
            ROM_GPIOPinConfigure(GPIO_PA6_U2RX);
            ROM_GPIOPinConfigure(GPIO_PA7_U2TX);
            ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7);
            //Slave Pins
            GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_4);
            GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_5);
        }
        else
        {
            //Slave MCU Pins
            ROM_GPIOPinConfigure(GPIO_PD4_U2RX);
            ROM_GPIOPinConfigure(GPIO_PD5_U2TX);
            ROM_GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5);
            //Slave Pins
            GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_6);
            GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_7);
        }
    }

    当在 GPIO 引脚 PA6、7上的 uart2上接收到"M A"时、我能够将 uart2切换到 PD4、5。

    if (rx_mode == 0)
        {
            char command = uart2_cmd[0];
            char channel = uart2_cmd[2];
            switch(command)
            {
            case 'M':
                switch(channel)
                {
                case 'A':
                    //Switch UART2 GPIO Pins.
                    switch_uart2(1);
                    //Send slave measure command.
                    ROM_UARTCharPutNonBlocking(UART2_BASE, 'M');
                    //Change the receive mode to 1 (slave).
                    rx_mode = 1;
                    
                    ......

    我遇到了计时问题。 当在 uart2上传输"M"时、从 MCU 需要大约300us 的时间才能将数据传回主微控制器。  

    蓝色=> UART2 TX、红色 UART2 RX

    再次调用 uart2中断处理程序、但它不接收从器件正在发送的数据。

    uart2_cmd 始终填充为0、32、65。 而从 MCU 正在传输62、45、0、40、162、245、60。

    我想添加一个计时器、在进行 UART 切换时、该计时器会延迟向从 MCU 发送"M"字符。

    您对如何解决此计时问题有什么建议吗?

    谢谢、

    Allan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    拉尔夫

    我想我已经非常接近 UART2开关问题了、但已经卡死了。 我添加了一个计时器、用于延迟将"M"字符传输到 PD4、5上的从 MCU。 当计算机在 PD6、7上发送"M A"时启用计时器、

    void UART2IntHandler(void)
    {
        uint32_t ui32Status;
    
        //
        // Get the interrrupt status.
        //
        ui32Status = ROM_UARTIntStatus(UART2_BASE, true);
    
        //
        // Clear the asserted interrupts.
        //
        ROM_UARTIntClear(UART2_BASE, ui32Status);
    
        //
        // Loop while there are characters in the receive FIFO.
        //
        //
        while(ROM_UARTCharsAvail(UART2_BASE))
        {
            //
            // Read the next character from the UART and write it back to the UART.
            //
            char buffer = ROM_UARTCharGetNonBlocking(UART2_BASE);
            uart2_cmd[uart2_cmd_index] = buffer;
            uart2_cmd_index++;
        }
    
        //Process packets from the computer.
        if (rx_mode == 0)
        {
            char command = uart2_cmd[0];
            char channel = uart2_cmd[2];
            switch(command)
            {
            case 'M':
                switch(channel)
                {
                case 'A':
                    //Switch UART2 GPIO Pins.
                    switch_uart2(1);
                    //Send slave measure command.
                    ROM_TimerEnable(TIMER0_BASE, TIMER_A);
                    //Change the receive mode to 1 (slave).
                    rx_mode = 1;
                    break;
                case 'B':
                    break;
                case 'C':
                    break;
                case 'D':
                    break;
                }
                break;
            case '?':
                UARTSend(&help_msg, 234);
                //UARTSend((uint8_t *)"Commands:\r\n", 12);
                break;
            }
    
            uart2_cmd_index = 0;
        }
        else
        {
    
            if (uart2_cmd[1] == '+' || uart2_cmd[1] == '-')
            {
                //adc_a = uart2_cmd[2] << 24 + uart2_cmd[3] << 16 + uart2_cmd[4] << 8 + uart2_cmd[5];
                char adc_s[14];
                usprintf(&adc_s, ">%c%010d<", uart2_cmd[1], (uart2_cmd[2] << 24 | uart2_cmd[3] << 16 | uart2_cmd[4] << 8 | uart2_cmd[5]));
                UARTSend(&adc_s,14);
    
                MAP_TimerDisable(TIMER0_BASE, TIMER_A);
                switch_uart2(0);
                rx_mode = 0;
                uart2_cmd_index = 0;
            }
            else
            {
                //UARTSend(&uart2_cmd,8);
            }
    
        }
    }

    延迟一段时间后、定时器将"M"字符发送到从 MCU。

    void Timer0IntHandler(void)
    {
        uint32_t ui32Status;
        //
        // Get the interrrupt status.
        //
        ui32Status = ROM_TimerIntStatus(TIMER0_BASE, true);
    
        //
        // Clear the asserted interrupts.
        //
        ROM_TimerIntClear(TIMER0_BASE, ui32Status);
    
        ROM_IntMasterDisable();
        //Send slave measure command.
        ROM_UARTCharPutNonBlocking(UART2_BASE, 'M');
        ROM_IntMasterEnable();
    }

    我遇到的问题是、启用定时器2后、不会再次调用 UART2事件处理程序。  UART2数据仍在传入、只是从不由 uart2中断处理程序处理。

    您对如何解决此问题有什么建议吗?

    谢谢、

    Allan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Allan、

    在与我的同事讨论这个问题后、我在这里添加了一些有关正在发生的情况的详细信息。

    [引用 userid="392758 " URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1133112/tm4c129lnczad-switching-uart2-pins 时]当我尝试从 PA6、7切换到 PD4、5时、数据仍在 PA6、7上发送。 是否可以切换 UART2的 GPIO 引脚?[/quot]

    因此、UART 外设没有任何专用寄存器来指示它也在发送 TX 信号的 GPIO 外设、因此当 UART 通过 TX 发送数据时、它将完全广播到 GPIO 外设。 此时、GPIO 外设知道哪些引脚配置为 UART、哪些引脚随后从连接到输出引脚的 UART 外设获取信号、因此它将在所有配置为 UART 的引脚之间发送 TX 数据。

    基于此、 将另一个端口重新转换为标准 GPIO 输出的代码是解决此问题的最有效方法、因为此时 GPIO 外设仅尝试通过您打算的端口发送 UART 数据、因为另一个 UART 端口现在是 GPIO 输出。

    [引用 userid="392758 " URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1133112/tm4c129lnczad-switching-uart2-pins/4205797 #4205797"]

    我遇到的问题是、启用定时器2后、不会再次调用 UART2事件处理程序。  UART2数据仍在传入、只是从不由 uart2中断处理程序处理。

    您对如何解决此问题有什么建议吗?

    [/报价]

    查看您的代码、您可以禁用中断、发送 UART 数据、然后启用中断。 我猜 UART2中断是在您禁用中断的过程中被触发的、由于这种情况、它只是位于此处、在清除中断之前无法重新触发。

    我并不建议在另一个外设的 ISR 中发送 UART 数据、因此您可能需要考虑使用全局标志、然后从应用发送 UART 数据、这样就不需要禁用中断。

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    拉尔夫

    如果在 PD4上接收到的数据不会触发 UART2中断、我仍会遇到问题。

    我已配置 GPIO、因此在 PD4或 PA6上接收到的数据将触发中断。

    //UART 2 Config:
    ROM_GPIOPinConfigure(GPIO_PD4_U2RX);
    ROM_GPIOPinConfigure(GPIO_PD5_U2TX);
    ROM_GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5);
    
    ROM_GPIOPinConfigure(GPIO_PA6_U2RX);
    ROM_GPIOPinConfigure(GPIO_PA7_U2TX);
    ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7);

    我可以在这两个上传输、但只能在 PA6上接收。

    在 PD4上接收到数据时、您对如何让中断处理程序做出响应有什么建议吗?

    谢谢、

    Allan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Allan、

    您是否在尝试在端口 D 上接收数据时使用此代码?

            //Slave MCU Pins
            ROM_GPIOPinConfigure(GPIO_PD4_U2RX);
            ROM_GPIOPinConfigure(GPIO_PD5_U2TX);
            ROM_GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5);
            //Slave Pins
            GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_6);
            GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_7);

    如果不是、并且端口 A 和端口 D 都配置为 UART RX、则可能是如何选择/路由共享 RX 信号的问题、如果是、我不确定是否有解决方案。 我对该 MCU 的设计细节没有深入了解、因此无法真正提供更多细节。

    不过、如果您已将端口 A 禁用为 GPIO 模块中的有效 UART 端口、那么我们需要进一步调试端口 A 以了解可能发生的情况。

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    很抱歉造成混淆。 让我澄清一下我要做的事情。 我已完全删除 switch_uart2()。 我现在正在尝试在 int main()中分配 PA6,7和 PD4,5。 下面是完整的 int main()函数。

    int
    main(void)
    {
        //
        // Run from the PLL at 120 MHz.
        // Note: SYSCTL_CFG_VCO_240 is a new setting provided in TivaWare 2.2.x and
        // later to better reflect the actual VCO speed due to SYSCTL#22.
        //
        g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
                                                 SYSCTL_OSC_MAIN |
                                                 SYSCTL_USE_PLL |
                                                 SYSCTL_CFG_VCO_240), 120000000);
                                                 
        //
        // Enable the GPIO ports.
        //
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOR);
    
        //
        // Enable the peripherals used by this example.
        //
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART3);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART5);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART7);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    
        //
        // Enable processor interrupts.
        //
        ROM_IntMasterEnable();
    
        //Setup the GPIO Pins for UART.
        //
        // Set GPIO A0 and A1 as UART pins.
        //
        ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
        ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
        ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    
        //UART 2 Config:
        ROM_GPIOPinConfigure(GPIO_PD4_U2RX);
        ROM_GPIOPinConfigure(GPIO_PD5_U2TX);
        ROM_GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5);
    
        ROM_GPIOPinConfigure(GPIO_PA6_U2RX);
        ROM_GPIOPinConfigure(GPIO_PA7_U2TX);
        ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7);
    
    
        //UART 3 Config:
        ROM_GPIOPinConfigure(GPIO_PJ0_U3RX);
        ROM_GPIOPinConfigure(GPIO_PJ1_U3TX);
        ROM_GPIOPinTypeUART(GPIO_PORTJ_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    
        //UART 5 Config:
        ROM_GPIOPinConfigure(GPIO_PC6_U5RX);
        ROM_GPIOPinConfigure(GPIO_PC7_U5TX);
        ROM_GPIOPinTypeUART(GPIO_PORTC_BASE, GPIO_PIN_6 | GPIO_PIN_7);
    
        //UART 7 Config:
        ROM_GPIOPinConfigure(GPIO_PC4_U7RX);
        ROM_GPIOPinConfigure(GPIO_PC5_U7TX);
        ROM_GPIOPinTypeUART(GPIO_PORTC_BASE, GPIO_PIN_4 | GPIO_PIN_5);
    
        // Configure the UART(s).
    
        //
        // Configure the UART2 for 115,200, 8-N-1 operation.
        //
        ROM_UARTConfigSetExpClk(UART2_BASE, g_ui32SysClock, 115200,
                                (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                                 UART_CONFIG_PAR_NONE));
    
         //
         // Configure the UART5 for 115,200, 8-N-1 operation.
         //
         ROM_UARTConfigSetExpClk(UART5_BASE, g_ui32SysClock, 115200,
                                 (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                                  UART_CONFIG_PAR_NONE));
    
         //
         // Configure the UART7 for 115,200, 8-N-1 operation.
         //
         ROM_UARTConfigSetExpClk(UART7_BASE, g_ui32SysClock, 115200,
                                 (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                                  UART_CONFIG_PAR_NONE));
    
        //
        // Configure the UART3 for 115,200, 8-N-1 operation.
        //
        ROM_UARTConfigSetExpClk(UART3_BASE, g_ui32SysClock, 115200,
                                 (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                                  UART_CONFIG_PAR_NONE));
        //
        // Enable the UART2 interrupt.
        //
        ROM_IntEnable(INT_UART2);
        ROM_UARTIntEnable(UART2_BASE, UART_INT_RX | UART_INT_RT);
        //
        // Enable the UART5 interrupt.
        //
        ROM_IntEnable(INT_UART5);
        ROM_UARTIntEnable(UART5_BASE, UART_INT_RX | UART_INT_RT);
        //
        // Enable the UART7 interrupt.
        //
        ROM_IntEnable(INT_UART7);
        ROM_UARTIntEnable(UART7_BASE, UART_INT_RX | UART_INT_RT);
        //
        // Enable the UART3 interrupt.
        //
        ROM_IntEnable(INT_UART3);
        ROM_UARTIntEnable(UART3_BASE, UART_INT_RX | UART_INT_RT);
    
        //
        // Loop forever counting electrons.
        //
        //USER RX -> 1
        //CH A RX -> 2
        //CH B RX -> 3
        //CH C RX -> 4
        //CH D RX -> 5
        while(1)
        {
            switch(system_state)
            {
            case 1: //User Commands
                switch(uart2_cmd[0])
                {
                case 'M':
                    switch(uart2_cmd[2])
                    {
                    case 'A':
                        //Switch UART2 GPIO Pins to Channel A.
                        switch_uart2(1);
                        UART2Send("M",1);
                        system_state = 2;
                        break;
                    case 'B':
                        break;
                    case 'C':
                        break;
                    case 'D':
                        break;
                    }
                    break;
                case '?':
                    UART2Send(&help_msg, 234);
                    system_state = 0;
                    break;
                }
                break;
            case 2: //Channel A RX
    
                if (uart2_cmd[1] == '+' || uart2_cmd[1] == '-')
                {
                    switch_uart2(0);
    
                    char adc_s[14];
                    usprintf(&adc_s, ">%c%010d<", uart2_cmd[1], (uart2_cmd[2] << 24 | uart2_cmd[3] << 16 | uart2_cmd[4] << 8 | uart2_cmd[5]));
    
                    UART2Send(&adc_s,14);
                    uart2_cmd_index = 0;
                }
                else
                {
                    UART2Send("M",1);
                    uart2_cmd_index = 0;
                }
                break;
            case 3: //Channel B RX
                break;
            case 4: //Channel C RX
                break;
            case 5: //Channel D RX
                break;
            }
        }
    }

    使用计算机、我可以发送字符串"M a"。 应用同时在端口 A 和端口 D 上重复发送一个"M"字符。 使用示波器、我可以确认正在接收数据以响应发送的"M"字符。 问题是只有在端口 A 上接收到数据而不是端口 D 上接收到数据时才调用 UARt2中断处理程序。下面是 UART2中断处理程序、

    void UART2IntHandler(void)
    {
        uint32_t ui32Status;
    
        // Get the interrrupt status.
        ui32Status = ROM_UARTIntStatus(UART2_BASE, true);
    
        // Clear the asserted interrupts.
        ROM_UARTIntClear(UART2_BASE, ui32Status);
    
        // Loop while there are characters in the receive FIFO.
        while(ROM_UARTCharsAvail(UART2_BASE))
        {
            char buffer = ROM_UARTCharGetNonBlocking(UART2_BASE);
            uart2_cmd[uart2_cmd_index] = buffer;
            uart2_cmd_index++;
        }
    
        if (system_state == 0)
        {
            system_state = 1;
        }
    
    }

    我正在阅读 ROM 用户指南、我可能找到了问题的答案。  

    If the same signal is assigned to two different GPIO port pins, the signal is assigned to the port
    with the lowest letter and the assignment to the higher letter port is ignored.
    

    那么、我想这不起作用吗? 你有什么想法?

    谢谢、

    Allan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Allan、

    感谢您发布完整的代码、这无疑对您有所帮助。 但更感谢您在 ROM 用户指南中找到该注释。 这正是我所期望的器件处理双端口分配的方式、但尚未找到确认。

    更正它不能正常工作、因为它是当前完成的。 您需要使用切换功能、以便一次仅为 UART2分配一个端口。 或者使用不同的 UART 模块、您不会遇到这类复杂问题(我假设硬件布局可以解决这一问题、但解决这一问题可能必须是长期解决方案...)

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    我希望避免使用不同的 UART 模块、因为这需要在100块电路板上进行返工。 我想我只需要对其进行修改。 感谢你的帮助。

    最棒的

    Allan