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.

[参考译文] RTOS/MSP-EXP430FR5994:CAN't使EUSCI_A1或UESICI_A3正常工作

Guru**** 2587365 points
Other Parts Discussed in Thread: MSP-EXP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/618958/rtos-msp-exp430fr5994-can-t-get-eusci_a1-or-uesci_a3-operational

部件号:MSP-EXP430FR5994

工具/软件:TI-RTOS

我尝试让EUSCI_A1or EUSCI_A3正常工作,以便与具有UART接口的设备通信。  我开始尝试让UART在外部环回模式下工作,但没有成功。  我一直使用TI-RTOS项目"uartecho_MSP_EXP430FR5994_TI"作为起点。  为了使UART正常运行,我添加了以下内容:


在Board.h中,我添加了以下定义:

#define Board_UART1 MSP_EXP430FR5994_UARTA1

#define Board_UART2 MSP_EXP430FR5994_UARTA2

#define Board_UART3 MSP_EXP430FR5994_UARTA3 


在MSP_EXP430FR5994.h中,我添加了一些定义并更改了UART init的定义,如下所示:

/*!
*@def MSP_EXP430FR5994_UARTName
*@MSP_EXP430FR5994开发板
上UART名称的简要枚举*/
typedef enum MSP_EXP430FR5994_UARTName {
MSP_EXP430FR5994_UARTA0 = 0,
MSP_EXP430FR5994_UARTA1 = 1,
MSP_EXP430FR5994_UARTA2 = 2,
MSP_EXP430FR5994_UARTA3 = 3,

MSP_EXP430FR5994_UARTCOUNT
} MSP_EXP430FR5994_UARTName;

/*!
*@def MSP_EXP430FR5994_UARTEnable
*@简要枚举UART模式的UART到初始化GPIO
*/
typedef enum MSP_EXP430FR5994_UARTEnable {
MSP_EXP430FR5994_UART0_ENABLE =(1U <0),
MSP_EXP430FR5994_UART1_ENABLE =(1U <1),
MSP_EXP430FR5994_UART2_ENABLE =(1U<< 2),
MSP_EXP430FR5994_UART3_ENABLE =(1U <3)
} MSP_EXP430FR5994_UARTEnable;

...

外部无效MSP_EXP430FR5994_INITUART (无符号int uartEnable);

在MSP_EXP430FR5994.c中,我更新了init,如下所示:

const UARTEUSCIA_HWAttrs uartEUSCIHWAttrs[MSP_EXP430FR5994_UARTCOUNT]={
{
.baseAddr = EUSCI_A0_BASE,
.clockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK,
bitOrder = EUSCI_A_UART_LSB First,
numBaudrateEntries = sizeof(uartEUSCIABAUdrates)/sizeof(UARTEUSCIA_BaudrateConfig),
.baudrateLUT = uartEUSCIAUdrates
},
{
baseAddr = EUSCI_A1_BASE,
.clockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK,
bitOrder = EUSCI_A_UART_LSB First,
numBaudrateEntries = sizeof(uartEUSCIABAUdrates)/sizeof(UARTEUSCIA_BaudrateConfig),
.baudrateLUT = uartEUSCIAUdrates
},
{
baseAddr = EUSCI_A2_BASE,
.clockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK,
bitOrder = EUSCI_A_UART_LSB First,
numBaudrateEntries = sizeof(uartEUSCIABAUdrates)/sizeof(UARTEUSCIA_BaudrateConfig),
.baudrateLUT = uartEUSCIAUdrates
},
{
baseAddr = EUSCI_A3_BASE,
.clockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK,
bitOrder = EUSCI_A_UART_LSB First,
numBaudrateEntries = sizeof(uartEUSCIABAUdrates)/sizeof(UARTEUSCIA_BaudrateConfig),
.baudrateLUT = uartEUSCIaBaudrates
}
};

const UART_Config UART_CONFIG[]={
{
.fxnTablePtr =&UARTEUSCIA_fxnTable,
.object =&uartEUSCIAObjects[0],
.hwAttrs =&uartEUSCIAHWAttrs[0]
},
{
.fxnTablePtr =&UARTEUSCIA_fxnTable,
.object =&uartEUSCIAObjects[1],
.hwAttrs =&uartEUSCIHWAttrs[1]
},
{
.fxnTablePtr =&UARTEUSCIA_fxnTable,
.object =&uartEUSCIAObjects[2],
.hwAttrs =&uartEUSCIAHWAttrs[2]
},
{
.fxnTablePtr =&UARTEUSCIA_fxnTable,
.object =&uartEUSCIAObjects[3],
.hwAttrs =&uartEUSCIAUWAttrs[3]
},
{NULL, NULL, NULL}
;


/*
==== MSP_EXP430FR5994_initUART =========
*/
void MSP_EXP430FR5994_initUART (无符号int uartEnable)
{
IF (uartEnable和MSP_EXP430FR5994_UART0_ENABLE)
{
/* WFP 2.0 1 = EUSCI_A0 TXD/RXD */
GPIO _setAsPeripheralModuleFunctionOutputPin (GPIO_PORT_P2,
GPIO _PIN0,GPIO辅助模块功能);
GPIO _setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P2,
GPIO_PIN1,GPIO辅助模块功能);
}

IF (uartEnable和MSP_EXP430FR5994_UART1_ENABLE)
{
/* WFP 2.5 6 = EUSCI_A1 TXD/RXD */
GPIO _setAsPeripheralModuleFunctionOutputPin (GPIO_PORT_P2,
GPIO _PIN5,GPIO辅助模块功能);
GPIO _setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P2,
GPIO_PIN6,GPIO辅助模块功能);
}

IF (uartEnable和MSP_EXP430FR5994_UART2_ENABLE)
{
/* WFP 5.4 ,5= EUSCI_A2 TXD/RXD */
GPIO _setAsPeripheralModuleFunctionOutputPin (GPIO_PORT_P5,
GPIO _PIN4,GPIO主要模块功能);
GPIO _setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P5,
GPIO _PIN5,GPIO主要模块功能);
}

IF (uartEnable和MSP_EXP430FR5994_UART3_ENABLE)
{
/* WFP 6.0 1 = EUSCI_A3 TXD/RXD */
GPIO _setAsPeripheralModuleFunctionOutputPin (GPIO_PORT_P6),
GPIO _PIN0,GPIO主要模块功能);
GPIO _setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P6),
GPIO _PIN1,GPIO主要模块功能);
}

/*初始化UART驱动程序*/
UART_INIT();
}

我按此方式设置它,以便我选择要启用和禁用的UART。  我已单独尝试了每个,并且已尽我所能验证每个UART的GPIO已正确设置。  然后,我将以下内容添加到TI-RTOS XCD配置文件中:

halHWI.CREATE (24,"&UARTEUSCIA_hwiIntFxn",hwiParams);// UARTA3
halHWI.CREATE (43,"&UARTEUSCIA_hwiIntFxn", hwiParams);// UARTA1

为每个UART建立ISR。  然后,我将echoFxn任务更改如下:

void echoFxn (UArg arg0,UArg arg1)
{
UART_handle uartLog;
UART_HANDLE uartLoopback;
UART_Params uartParams;

/*创建数据处理关闭的UART。 */
UART_PARAM_INIT (&uartParams);
uartParams.writeDataMode = UART_DATA_binary;
uartParams.readDataMode = UART_DATA_binary;
uartParams.readReturnMode = UART_RETURE_FULL;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudrate = 9600;
uartLog = UART_OPEN (Board_UART0,&uartParams);

/*创建数据处理关闭的UART */
UART_PARAM_INIT (&uartParams);
uartParams.writeDataMode = UART_DATA_binary;
uartParams.readDataMode = UART_DATA_binary;
uartParams.readReturnMode = UART_RETURE_FULL;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudrate = 9600;
uartLoopback = UART_OPEN (Board_UART3,&uartParams);

IF((uartLog != NULL)&&(uartLoopback != NULL))
{
同时(1)
{
字符c;
CHAR数据='k';

UART_WRITE (uartLoopback,&DATA,1);
UART_READ (uartLoopback,&c,1);
UART_WRITE (uartLog,&c,1);
}
}
否则
{
/*如果UART打开,请关闭其中一个UART */
IF (uartLog!= NULL)
{
UART_CLOSE (uartLog);
}
IF(uartLoopback !=空)
{
UART_CLOSE (uartLoopback;
}
}
}

在本例中,我正在测试UART 3上的环回。  我在MSP-EXP430FR5994板上将WFP 6.0 和WFP 6.1 连接在一起。  上述代码成功地调用UART_WRITE到环回UART,但随后将在UART_READ上无限期阻止。  我也尝试过UART1,在这种情况下,我将WFP 2.5 和WFP 2.6 连接到MSP-EXP430FR5994板上。  无论哪种情况,我都无法传输UART1或UART3,然后读取发送的内容。  我的UART1和UART3设置中缺少什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否能够获得在RTOS之外工作的示例,例如C或DriverLib代码? 我并不是建议这是一个长期的解决方案,而只是作为隔离问题的一种手段。 考虑到MSP-EXP430FR5994在可用标题行上带有引脚,我肯定不会出现硬件问题。 您可以尝试使用调试器,并查找工作实现和非工作实现之间存在的任何寄存器差异,特别是端口和eUSCI外围设备。 如果您在进一步尝试后仍然遇到困难,那么也许可以将您的更改发送给我,我将尝试找出问题。

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

    我尚未找到一个示例项目,该项目已设置为使用除EUSCI_A0之外的任何UART。  但是,我确实找到了“msp430FR599x_euscia0_UART_04”示例,它是在EUSCI_A0上环回的寄存器级别示例。  我将所有寄存器引用更改为“A0”,并且我能够获得EUSCI_A1上的回送。  我还没有通过登记来确定发生了什么,但当我发现差异时,我会重新发布。

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

    我发现了问题。  UARTEUSCIA_hwiIntFxn函数是所有ESUCIA UART的通用ISR,但它需要一个索引参数来让它知道它在哪个UART上执行操作。  因此EUSCI_A1的RX中断正在查看EUSCI_A0的寄存器。  为了解决这个问题,我必须在XDC文件中输入以下内容。

    var hwiParams = new halHWI.Params();
    
    hwiParams.arg = 0;
    halHWi.create(48,"&UARTEUSCIA_hwiIntFxn",hwiParams); // uARTA0
    hwiParams.arg = 1;
    halHwi.create (43,"&UARTEUSCIA_hwiIntFxn",hwiParams);// uARTA1 

    将hwParams.arg =1设置为UART1中断,然后设置ISR查看寄存器以查找正确的UART。  我现在可以在EUSCI_A1上回送。