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/MSP430F6779:TIRTOS 多个 UART 初始化处理程序

Guru**** 2524460 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/691525/rtos-msp430f6779-tirtos-multiple-uart-initialization-eror

器件型号:MSP430F6779

工具/软件:TI-RTOS

您好!

我正在尝试将 MSP430上的2个 UART 与 TI-RTOS UART 驱动程序配合使用。 两个 UART 的 UART_open()都已成功初始化。 但当我再次调用 UART_write()时,它会重置控制器。

下面列出了初始化代码和枚举器

#define Board_UART0                MSP_EM430F67791_UARTA0

#define Board_UART1                MSP_EM430F67791_UARTA1
 
#define Board_UART2                MSP_EM430F67791_UARTA2

typedef 枚举 MSP_EM430F67791_UARTName{
   MSP_EM430F67791_UARTA0 = 0、
   MSP_EM430F67791_UARTA1、
   MSP_EM430F67791_UARTA2、

   MSP_EM430F67791_UARTCOUNT
}MSP_EM430F67791_UARTName;

CONST UARTEUSCI_BAURATEConfig uartEUSCIABAUDRATE[]={
   /*{波特率、输入时钟、预分频器、UCBRFx、UCBRSx、 过采样}*/
   {
       .outputBudrate = 9600、
       .inputClockFreq = 16777216、
       .prescalar = 109、
       hwRegUCBRFx = 3、
       hwRegUCBRSx = 181、
       过采样= 1.
   }、
    {9600、16777216、109、3、181、 1}、
   {2400、16777216、436、14、170、 1}、
   {4800、  16777216、 218、7、68、 1}、
   {19200、  16777216、 54、9、238、 1}、
   {38400、  16777216、 27、4、251、 1}、
   {57600、  16777216、 18、3、68、 1}、
   {115200、  16777216、 9、1、181、 1}、
};

CONST UARTEUSCI_HWAttrs uartEUSCIAHWAttrs[MSP_EM430F67791_UARTCOUNT]={
   {
       baseAddr = EUSCI_A0_BASE、
       时钟源= EUSCI_A_UART_CLOCKSOURCE_SMCLK、
       .bitOrder = EUSCI_A_UART_LSB_FIRST、
       numBudrateEndries = sizeof (uartEUSCIABAURATEes)/sizeof (UARTEUSCIA_BAUDRAateConfig)、
       .budrateLUT = uartEUSCIA波特 率
   }、
   
       {
       baseAddr = EUSCI_A1_base、
       时钟源= EUSCI_A_UART_CLOCKSOURCE_SMCLK、
       .bitOrder = EUSCI_A_UART_LSB_FIRST、
       numBudrateEndries = sizeof (uartEUSCIABAURATEes)/sizeof (UARTEUSCIA_BAUDRAateConfig)、
       .budrateLUT = uartEUSCIA波特 率
   }、
   
       {
       baseAddr = EUSCI_A2_base、
       时钟源= EUSCI_A_UART_CLOCKSOURCE_SMCLK、
       .bitOrder = EUSCI_A_UART_LSB_FIRST、
       numBudrateEndries = sizeof (uartEUSCIABAURATEes)/sizeof (UARTEUSCIA_BAUDRAateConfig)、
       .budrateLUT = uartEUSCIA波特 率
   }、
   
 
};



const UART_Config UART_config[]={
   {
       .fxnTablePtr =&UARTEUSCIA_fxnTable、
       .object = uartEUSCIAObjects[0]、
       .hwAttrs = uartEUSCIADHWAttrs[0]
   }、
   
      {
       .fxnTablePtr =&UARTEUSCIA_fxnTable、
       .object = uartEUSCIAObjects[1]、
       hwAttrs = uartEUSCIADHWAttrs [1]
   }、
   
      {
       .fxnTablePtr =&UARTEUSCIA_fxnTable、
       .object = uartEUSCIAObjects[2]、
       hwAttrs = uartEUSCIADHWAttrs [2]
   }、
   
   {NULL、NULL、NULL}
};

/*
 * ==== MSP_EM430F67791_initUART ===
 *
void MSP_EM430F67791_initUART (void)

 
   /* P3.1、0 = EUSCI_A0 TXD/RXD *
   GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、
        GPIO_PIN0);
  GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、
       GPIO_PIN1 );

  /* P3.5、4 = EUSCI_A0 TXD/RXD *
      GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、
        GPIO_PIN4);
  GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、
       GPIO_PIN5 );
   
  /* P3.7、6 = EUSCI_A0 TXD/RXD *
  GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、
       GPIO_PIN6 | GPIO_PIN7);
   
   /*初始化 UART 驱动程序*/
   UART_INIT();


//任务内

   UART_Params uartParams;
   const char echoPrompt[]="\fEchoing Characters:\r\n";
 
   /*创建一个数据处理关闭的 UART。 *
   UART_PARAMS_INIT (uartParams);
   uartParams.writeDataMode = UART_DATA_BINARY;
   uartParams.readDataMode = UART_DATA_BINARY;
   uartParams.readReturnMode = UART_return_full;
   uartParams.readEcho = UART_ECHO_OFF;
   uartParams.baudrate = 9600;

   HDLC_uart1_Handle = UART_OPEN (Board_UART1、&uartParams);

   if (hdlc_uart1_handle == NULL){
       System_abort ("打开 UART 时出错");
   }
   
       HDLC uart0_handle = UART_open (Board_UART0、uartParams);

   if (hdlc_uart0_handle == NULL){
       System_abort ("打开 UART 时出错");
   }

UART_WRITE (HDLC_uart0_handle、echoPrompt、sizeof (echoPrompt)); //大小

UART_WRITE (HDLC_uart1_Handle、echoPrompt、sizeof (echoPrompt));//失败并重置控制器

还需要注意的是、如果我更改 MSP_EM430F67791_UARTName 中的枚举码器、如所示

typedef 枚举 MSP_EM430F67791_UARTName{
   MSP_EM430F67791_UARTA2 = 0、
   MSP_EM430F67791_UARTA1、
   MSP_EM430F67791_UARTA0、

   MSP_EM430F67791_UARTCOUNT
}MSP_EM430F67791_UARTName;

那么、即使 UART0失败(导致复位条件)

IAM 使用 tirtos_msp43x_2_20_00_06和 IAR 7.11.2。

请帮助。

提前感谢。

Sreekanth MK

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

    您好、Sreenekanth、

    有希望缩小问题范围的几个问题:

    • 第二个 UART 是否正确打开? 您是否看到抛出的错误消息?
    • 如果第二次尝试写入第一个 UART (而不写入第二个 UART)、您是否仍然看到复位问题?

    此致、

    Nathan

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

    您好、Nathan、

    1)是的、打开句柄时第二个 UART 被正确打开、将返回有效地址。(HDLC_uart1_Handle = UART_CONFIG (0xD21E)和 HDLC_uart0_Handle = 0xD224 (UART_CONFIG + 6)) 、因此它不会引发任何错误。

    2) 2) MSP_EM430F67791_UARTName 中的第一个 UART 没有问题。 就像 MSP_EM430F67791_UARTA0是第一个条目(0)一样,多次将数据写入 第一个 UART 不会出现任何问题。  如果我将 MSP_EM430F67791_UARTA1更改为第一个条目(0)、则第二个 UART 不会出现任何问题、同时写入第一个 UART 会导致复位条件。

    此致

    Sreekanth MK

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

    您好、Nathan、

    在 RTOS cfg 文件中,我添加了 uart1 (53)的 ISR,现在修复了复位问题,但当我为第二个 UART 调用 UART_write()时,它会挂起系统。

    下面列出了 CFG 文件静态 Hwi 实例

    var hwiParams = new halHwi.Params();

    hwiParams.arg = 0;
    halHwi.create (59、"&UARTEUSCIA_hwiIntFxn"、hwiParams);

    var hwi4Params = new halHwi.Params();

    hwiParams.arg = 0;
    halHwi.create (53、"&UARTEUSCIA_hwiIntFxn"、hwi4Params);

    请帮助。

    提前感谢

    Sreekanth MK

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    问题出在 CFG 文件静态 Hwi 实例

    var hwiParams = new halHwi.Params();

    hwiParams.arg = 0;
    halHwi.create (59、"&UARTEUSCIA_hwiIntFxn"、hwiParams);

    var hwi4Params = new halHwi.Params();

    hwi4Params.arg = 0;//错误我必须将参数更改为1 hwi4Params.arg = 1;对于第二个实例
    halHwi.create (53、"&UARTEUSCIA_hwiIntFxn"、hwi4Params);

    此致
    Sreekanth MK