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.

[参考译文] MSPM0G3507:UART 中断信号生成。

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1556179/mspm0g3507-uart-break-signal-generation

器件型号:MSPM0G3507


工具/软件:

您好 TI 专家、

我正在处理 G3507 板、需要生成 UART 中断信号。
根据我的理解、正常 UART TX 在 3.3V 下处于空闲状态、因此为了生成中断、我需要在特定的持续时间(大约 50ms)内将 TX 线路驱动为低电平。

我的预期方法是:

  1. 禁用 UART 外设。

  2. 将 UART TX 引脚重新配置为 GPIO 输出并将其驱动为低电平。

  3. 保持低电平状态~50ms。

  4. 将引脚重新配置为其默认的 UART 功能并重新启用 UART。

您能否分享实现这一目标的示例代码或推荐方法?

如果我在下面附上了我需要的信息、请参阅

此致、
Amara Rakesh

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

    我想您可以通过设置/清除 LCRH:BRK [Ref TRM (SLAU846B) 表 18-42]要求 UART 生成中断。 你(仍然)必须自己做计时。 如果使用的是 Driverlib、则为 DL_UART_enableLINSendBreak () 和 DL_UART_disableLINSendBreak ()。

    数据表[Ref DS (SLASEX6B) 第 8.23]节中的内容并不十分清楚此特性是否仅限于 UART0 (“扩展“)。

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

    是的、我 目前使用的是 DriverlibDL_enableLINSendBreakDL_disableLINSendBreak、并尝试了和、但结果与我的期望不符。 因此、请你就另一种方法提供指导。

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

    我还没有看到一个 TI 示例即时在引脚功能 (PF) 之间切换、但有人快速切换。 在某些情况下、您可能会在过渡时出现毛刺脉冲、但对于您所做的事情、这可能无关紧要。

    使用 Driverlib、 可能类似于:

    DL_GPIO_clearPins(GPIO_UART_0_TX_PORT, GPIO_UART_0_TX_PIN); // Low
    DL_GPIO_enableOutput(GPIO_UART_0_TX_PORT, GPIO_UART_0_TX_PIN); // Output
    DL_GPIO_initDigitalOutput(GPIO_UART_0_IOMUX_TX); // PF=1
    delay_cycles(CPUCLK_FREQ / 20); // Spin for 50ms
    DL_GPIO_initPeripheralOutputFunction(GPIO_UART_0_IOMUX_TX, GPIO_UART_0_IOMUX_TX_FUNC); // PF=UART

    由于 GPIO 寄存器会“记住“这些设置、 您可能会在程序开始时执行一次 clearPins 和 enableOutput 调用。

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

    我尝试了两种方法、包括 LIN 和您分享的代码。 使用万用表、我观察到 UART_TX 引脚变为低电平、然后返回高电平、这很正常。 但是、它仍会发送0x00到 TX 线上、我不想这样做。 如何避免这种情况? 我已附上代码和输出以供您参考。

    void uart_break_signal()
    {
     
     
        /*Metho-1*/
        #if 0
         DL_UART_enableLINSendBreak(UART_1_INST);         
         delay_cycles(8000000);
         DL_UART_disableLINSendBreak(UART_1_INST);
    
        #endif
    
    
    
        /*Method -2*/
        #if 1
        DL_GPIO_clearPins(GPIO_UART_1_TX_PORT, GPIO_UART_1_TX_PIN);
        DL_GPIO_enableOutput(GPIO_UART_1_TX_PORT, GPIO_UART_1_TX_PIN);
    
        DL_GPIO_initDigitalOutput(GPIO_UART_1_IOMUX_TX);
    
        delay_cycles(CPUCLK_FREQ/2);
    
        DL_GPIO_initPeripheralOutputFunction(GPIO_UART_1_IOMUX_TX, GPIO_UART_1_IOMUX_TX_FUNC);
                                            
        #endif
    
    
        uint8_t packet_list []= {
         0xaa, 0x00, 0x0f, 0x2a, 0x28, 0x00, 0x00, 0x00,
         0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00
        };
        
        Printf_iwrl1432(packet_list,17);
    
    }

    此致、
    Amara

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

    导线的另一端是什么? (大概是产生显示的代理。) 我看到 UART 无法识别中断、但将其(连同垃圾字节)报告为组帧错误。

    我曾尝试将方法 1 (LIN) 插入到接收呼叫和发送呼叫之间的“uart_echo_interrupts_standby"副“副本中。 我将中断时间缩短到 2ms(2 个字节时间)、并在中断后插入了 10usec 延迟;这是为了使示波器迹线更易于读取。  [我还删除了 SleepOnExit 调用并将 LPM 策略更改为 SLEEP0。]

    我看到中断和回传字节;我没有看到杂散(正确帧)0x00 字节:

    Putty 和 Teraterm 都没有看到中断本身;我想他们要么忽略它,要么它在某个地方的 USB 丢失。

    实际顺序:

            case DL_UART_MAIN_IIDX_RX:
                DL_GPIO_togglePins(GPIO_LEDS_PORT,
                    GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
                gEchoData = DL_UART_Main_receiveData(UART_0_INST);
    #define SEND_BREAK 1
    #if SEND_BREAK
                DL_UART_enableLINSendBreak(UART_0_INST);
                delay_cycles(2*CPUCLK_FREQ/1000); // 2x character times at 9600bps
                DL_UART_disableLINSendBreak(UART_0_INST);
                delay_cycles(CPUCLK_FREQ/100000UL); // 10usec for the scope
    #endif // SEND_BREAK
                DL_UART_Main_transmitData(UART_0_INST, gEchoData);
                break;

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

    您好 Amara、

    值得一提的是、必须严格遵循 TRM 中的 PF 开关步骤、如下所示。 在更改 PF 之前禁用当前 IO 功能、否则会发生异常情况。

    例如、如果您要将 UART 切换到 GPIO、 请 按照以下两个步骤完全关闭 UART、然后将 PF 字段切换到 GPIO 函数。

    此致、
    彼得

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

    是的 Peter、我遇到了 UART 未接收数据且数据索引发生移动的意外行为。 根据您的参考添加禁用代码后、该代码现在可按预期运行。 我的要求是 UART→GPIO→UART、通过您的代码参考、我实现了这个要求

        DL_UART_Main_disable(UART_1_INST);
        DL_UART_Main_disablePower(UART_1_INST);
    
      
        DL_GPIO_clearPins(GPIO_UART_1_TX_PORT, GPIO_UART_1_TX_PIN);
        DL_GPIO_enableOutput(GPIO_UART_1_TX_PORT, GPIO_UART_1_TX_PIN);
      
        DL_GPIO_initDigitalOutput(GPIO_UART_1_IOMUX_TX);
    
        delay_cycles(CPUCLK_FREQ/2);
        
        DL_GPIO_initPeripheralOutputFunction(GPIO_UART_1_IOMUX_TX, GPIO_UART_1_IOMUX_TX_FUNC);
    
        DL_UART_Main_enablePower(UART_1_INST);
        DL_UART_Main_enable(UART_1_INST);
        SYSCFG_DL_UART_1_init();

    谢谢、

    Amara

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

    很高兴听到这个问题已经解决了,所以,我会关闭这个话题,如果有任何新问题,请随时提交帖子,谢谢!

    此致、
    彼得