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.

[参考译文] MSP432P401R:UART暂停

Guru**** 2524460 points
Other Parts Discussed in Thread: MSP432WARE

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/631497/msp432p401r-uart-halt

部件号:MSP432P401R
主题中讨论的其他部件:MSP432WARE

当我使用uart0将数据发送到2g modern并中断接收到传输到uart1的数据时,uart1将打印到PC

IF (状态和EUSCI_A_UART_receive中断标志)
{
u8RecvData = UART_receiveData (EUSCI_A0_BASE);
UART_HESRData (EUSCI_A1_BASE,u8RecvData); 

但当我将数据发送到2g Modern时,程序在  MAP_UART_SENSDATE(EUSSCI_A0_base, A_pu8Buf[u16Index])中停止;

我发现UCTXIFG是0,它停止了,因为UCTXIFG不是1,但我不知道谁将UCTXIFG设置为0

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    如果将字符写入UCAxTXBUF,则UCTXIFG将自动重置。 当UCAxTXBUF准备好接受另一个字符时,就会设置该标志。 请参阅TRM的22.3 第15节(www.ti.com/.../slau356f.pdf ),

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

    您好,感谢您的回复,我想"重置"意味着设置1或设置0,UCTXIFG默认值为1,这意味着"重置"设置为1?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为什么UCTXIFG是0,没有自动重置,但uart1已经在UCA0BUF中获取字符并打印到我的PC? 整个程序都卡住了,因为UCTXIFG是0,不能设置1
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    复位表示'0'。 EUSCI_A0和EUSCI_A1是不同的外设。 了解如何配置每个外围设备可能会有所帮助。 您是否可以提供更多源代码?
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    /*
    --------------------------------------------
    * MSP432驱动程序库- v4_00_00_11
    *----------------------------------
    *
    **--版权所有--,BSD,BSD
    *版权所有(c) 2017,Texas Instruments Incorporated
    *保留所有权利。
    *
    **
    允许以源代码和二进制格式重新发布和使用,无论是否进行*修改,只要
    满足以下条件*:
    *
    ****重新发布源代码必须保留上述版权
    *声明,此条件列表和以下免责声明。
    *
    ***以二进制格式重新分发时,必须在
    
    随分发提供的*文档和/或其他材料中复制上述版权*声明,此条件列表和以下免责声明。
    *
    ***
    
    未经事先书面许可,不得使用德州仪器(TI)公司的名称或*其贡献者的名称来支持或促销由本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *,
    
    不提供任何明示或暗示的担保,包括但不限于*对适销性和特定*用途适用性的暗示担保。 在任何情况下,版权所有者或
    *贡献者均不对任何直接,间接,附带,特殊,
    *示范, 或后果性损害(包括但不限于
    *购买替代商品或服务;使用,数据或利润损失;
    (*或业务中断),但根据任何责任理论
    ,*无论是合同,严格责任还是侵权行为(包括疏忽或
    *其他),均因使用本软件而导致*
    ,即使已被告知此类损害的可能性。
    -/copyright--*//****************************************************************************************************************
    
    * MSP432 UART -使用12MHz BRCLK的PC回波
    *
    说明:此演示将回声通过PC串行端口接收的字符。
    * SMCLK/DCO用作时钟源,设备置于LPM0
    * eUSCI使用自动时钟启用功能,SMCLK关闭
    *当UART空闲时,当检测到接收边缘时打开。
    *请注意,在RS232和MSP
    *电压电平之间切换时需要电平转换器硬件。
    *
    ** MSP432P401
    * --------
    * | |
    * | |
    * | |
    * RST -| WFP (1.3)/UCA0TXD|----> PC (ECHO)
    * | |
    * | |
    * | WFP 1.2 PC*
    | |
    *
    *作者:Timothy Logan
    ******************************************************************************* /*
    DriverLib包括*/
    #include <ti/devices/msp432p4xx/driverlib/driverlib.h>/*
    
    Standard包括*/
    #include <stdint.h>
    #include <stdio.h>
    #include <stdbool.h>/*
    
    UART配置参数。 这些配置参数
    *使eUSCI成为UART模块,以9600波特率运行。 这些
    *值是使用TI提供
    的在线计算器*计算得出的:
    *software-dl.ti.com/.../index.html
    */
    const eUSI_UART_Config uartConfig ={
    
    EUSCI_A_UART_CLOCKSOURCE_SMCLK, // SMCLK时钟源
    6, // BRDIV = 78
    8, // UCXBRF = 2
    32岁 // UCXBRS = 0
    EUSCI_A_UART_NO_PARity, //不奇偶校验
    EUSCI_A_UART_LSB First, // LSB优先
    EUSCI_A_UART_ON_STOP_BIT, //一个停止位
    EUSCI_A_UART_MODE, // UART模式
    EUSCI_A_UART_oversampling_BAUDRATE_generation // Oversampling
    };
    
    int main(void)
    {
    /*正在停止WDT */
    MAP_WDT_A_HoldTimer();
    // MAP_GPIO _setAsModulalPeriphereFunctionInputPin (GPIO_PORT_P1,
    //gPIO_PIN1,gPIO_PRIMARY_MODULE_FUNCTION);
    /*在1.3 UART模式下选择WFP 1.2 和WFP *//
    map_gPIO_setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P1,
    // gPIO_PIN2 | gPIO_PIN3,gPIO_PRIMARY_MODULE_FUNCTION);
    	
    MAP_gPIO_setAsPeripheralModuleFunctionInputPin (gPIO_PORT_P1,
    GPIO _PIN2 | GPIO _PIN3,GPIO主要模块功能);
    
    /*将DCO设置为12MHz */
    cs_setDCOCenteredFrequency (CS_DCO_Frequency_12);
    
    /*配置UART模块*/
    //MAP_UART_INITModule (EUSCI_A0_BASE,&uartConfig);
    MAP_UART_INITModule (EUSCI_A0_BASE,&uartConfig);
    
    /*启用UART模块*/
    //MAP_UART_enableModule (EUSCI_A0_BASE);
    MAP_UART_enableModule (EUSCI_A0_BASE);
    
    /*启用中断*/
    //MAP_UART_enableInterrupt (EUSCI_A1_BASE,EUSCI_A_UART_receive中断);
    //MAP_Interrupt_enableInterrupt (INT_EUSCIA1);
    	MAP_UART_enableInterrupt (EUSCI_A0_BASE,EUSCI_A_UART_receive中断);
    MAP_Interrupt_enableInterrupt (INT_EUSCIA0);
    MAP_Interrupt_enableSleepOnIsrExit();
    MAP_Interrupt_enableMaster();
    
    同时(1)
    {
    
    			MAP_UART_ESDRAData(EUSI_A0_base,'1');
    			
    			//MAP_Interrupt_enableSleepOnIsrExit();
    			//MAP_PCM_gotoLPM3InterruptSafe ();
    			//MAP_PCM_gotoLPM0();
    }
    }/*
    
    
    
    
    EUSCI A0 UART ISR -将数据回波到PC主机*/
    void EUSCIA0_IRQHandler(void){
    
    UINT32_t status = MAP_UART_getEnabableInterruptStatus(EUSSCI_A0_base);
    
    MAP_UART_CLEARInterruptFlag (EUSCI_A0_BASE,状态);
    
    IF (状态和EUSCI_A_UART_receive中断标志)
    
    {
    			MAP_UART_receiveData(EUSI_A0_base);
    // map_UART_发射器 数据(EUSCI_A0_BASE,MAP_UART_receiveData (EUSCI_A0_BASE));
    			// MAP_UART_发射器 数据(EUSCI_A0_BASE,'p');
    			//MAP_UART_receiveData (EUSCI_A1_BASE);
    			//MAP_UART_发射器 数据(EUSSCI_A1_base, MAP_UART_receiveData(EUSSCI_A1_base));
    }
    
    }
    
    
    如果我的PC向uart0发送数据,同时uart0向PC发送数据,则此程序将被卡住
    
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    同时,2g Modern将数据发送到uart0,它不是关于uart1,只是当uart0同时发送和接收时,它将被卡住
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > UART_clearInterruptFlag (EUSCI_A0_BASE,状态);
    我建议你不要这样做。

    这是不必要的,因为读取RXBUF (几行后)将清除RXIFG (原子)。

    它所做的是邀请一个读-修改-写竞赛,该竞赛可能会清除一个新生的TXIFG。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它不起作用当我向uart0发送数据时程序被卡住
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    上面的代码(我引用的代码)似乎已经(完全)改变了。 您指的是哪个代码?

    在新代码中,我建议您不要这样做:
    > MAP_UART_CLEARInterruptFlag (EUSCI_A0_BASE,STATUS);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我怀疑您也不想这样做,但这是一件单独的事情:

    > MAP_Interrupt_enableSleepOnIsrExit();
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,我找到了一个简单的方法来重置此错误,所以我改变了它,我尝试执行您所说的操作,但它卡在接收数据中,它将发送到我的PC 1111,直到我将数据发送到uart0,它就卡住了
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没错
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我从您的(新)代码中删除该行时,它停止失败。 我不知道你和我在做什么。 (CCS 6.2 .0,黑色Launchpad,MSP432ware 3.50 .00.02)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,我再试一次,这个问题得到了解决,非常感谢! 这是TI演示中的错误,它在中断中清晰地标志着我。