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.

[参考译文] TMS320F28379D:UART 在第二个内核上

Guru**** 2611705 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1574497/tms320f28379d-uart-on-second-core

部件号:TMS320F28379D


工具/软件:

您好、

我对 28379D 的 CORE 1 使用 SCIa、对 CORE 2 使用 SCIC。 这是一个测试。 我尝试在第二个内核上读取 SCIC 发送的数据、并将数据放在共享存储器上并在 CPU1 上读取。 我的问题是第二个内核跳转到 RX 中断例程只有一次。 中断未被清除、然后 RXFFST 显示为 10000! 非常感谢您对此的评论。 代码为:

//#############################################################################
// Included Files
#include "device.h"
#include "driverlib.h"
#include "inc/hw_ipc.h"
#pragma DATA_SECTION(rxData, ".myCharArraySection2_1")
char rxData[5];
volatile bool rxComplete = false;


__interrupt void scicRxFIFOISR(void)
{
 int i;
    // Assuming RX FIFO level is 4
    int16_t fifoCount = HWREG(SCIC_BASE + SCI_FFRX_RXFFST_M);
    for (i = 0; fifoCount && i < 5; i++)
    {
        rxData[i] =  HWREG(SCIC_BASE + SCI_O_RXBUF);  // Read each byte from FIFO
        // Process each byte (e.g., store, echo, parse)
    }
    rxComplete = true;
    if(!(HWREG(IPC_BASE + IPC_O_STS) & (1UL)))
    {
        //
        HWREG(IPC_BASE + IPC_O_SET) = 1UL;
    }
    // Clear RX FIFO interrupt flag
    //i=HWREG(SCIC_BASE + SCI_O_FFRX);
    HWREG(SCIC_BASE + SCI_O_FFRX) |= SCI_FFRX_RXFFINTCLR;
   // ScicRegs.SCIFFRX.bit.RXFFINTCLR = 1;  //same as above
    // Acknowledge PIE interrupt
    HWREG(PIECTRL_BASE + PIE_O_ACK) = INTERRUPT_ACK_GROUP8;
}

//
void main(void)
{
    uint32_t count;
    uint16_t state;
    uint16_t TXBSY;
    //

    Device_init();
  Interrupt_initModule();
 Interrupt_initVectorTable();
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIC);
    SCI_setConfig(SCIC_BASE, 50000000, 115200, SCI_CONFIG_WLEN_8 | SCI_CONFIG_STOP_ONE | SCI_CONFIG_PAR_NONE);
    SCI_enableModule(SCIC_BASE);
    SCI_resetChannels(SCIC_BASE);
    HWREG(SCIC_BASE + SCI_O_FFTX)|=0X4000;
    HWREG(SCIC_BASE + SCI_O_FFTX)|=0X0040;
    Interrupt_register(INT_SCIC_RX, &scicRxFIFOISR);
    HWREG(SCIC_BASE + SCI_O_FFRX) =  0x6025;
    Interrupt_enable(INT_SCIC_RX);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
    Interrupt_enable(INTERRUPT_CPU_INT8);
    HWREG(PIECTRL_BASE + PIE_IER8_INTX5) =  PIE_IER8_INTX5;
    HWREG(SCIC_BASE + SCI_O_FFTX)|=0x0040;
    IER |= INTERRUPT_CPU_INT8;                      // Enable CPU INT8
    EINT;
    ERTM;

    HWREG(IPC_BASE + IPC_O_SET) = 1UL << ipcFlag17;
    state = GPIO_readPin(11UL);
    GPIO_togglePin(10UL);
    while(1) {
        if(count++ > 200000)      {
            count = 0;
           // GPIO_togglePin(35U);
                 GPIO_writePin(52U, 1);
           // GPIO_setPortPins(GPIO_PORT_B, 20U);
            SCI_writeCharBlockingFIFO(SCIC_BASE, '1');
            SCI_writeCharBlockingFIFO(SCIC_BASE, '2');
            SCI_writeCharBlockingFIFO(SCIC_BASE, '3');
            SCI_writeCharBlockingFIFO(SCIC_BASE, '4');
            SCI_writeCharBlockingFIFO(SCIC_BASE, '5');
          //  GPIO_clearPortPins(GPIO_PORT_B, 20U);
         //   GpioDataRegs.GPBSET.bit.GPIO51=0;
            // Toggle GPIO10
            GPIO_togglePin(10UL);
        }
        TXBSY= (HWREGH(SCIC_BASE + SCI_O_CTL2) & SCI_CTL2_TXEMPTY);
        TXBSY=  !(((HWREGH(SCIC_BASE + SCI_O_CTL2) & SCI_CTL2_TXEMPTY) == SCI_CTL2_TXEMPTY) ? true : false);
        GPIO_writePin(52U, TXBSY);
    }
}

// End of file

谢谢你

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

    您好:

    您能否首先检查 SCI 的初始化? 您能否请 按以下顺序尝试初始化 SCI 模块:

    1. 首先、确保禁用所有 SCI 中断
    2. 接下来、清除所有 SCI 中断的中断状态 (RXFF、TXFF、FE、OE、PE、 RXERR、BRKDT、TXRDY)、方法是清除然后设置 SCI 的 CTL1.SWRESET 位、并设置 SCI 的 FFTX.TXFFINTCLR 和 FFRX.RXFFINTCLR 位。
    3. 接下来、通过设置 SCI 的 FFRX.RXFFOVRCLR 位来清除溢出状态位
    4. 接下来、通过清除然后设置 FFTX.TXFIFORESET 来重置 RX 和 TX FIFO
    5. 接下来、通过清除然后设置 FFTX.SCIRST 位来重置器件的 TX 和 RX 通道。
    6. 接下来、为您的系统实际配置所有 SCI 设置、例如波特率(SCIHBAUD + SCILBAUD 寄存器)、奇偶校验+数据长度+停止位(SCICCR 寄存器)。
    7. 接下来、通过设置 CTL1.TXENA、CTLA.RXENA 和 CTL1.SWRESET 来启用该模块。 这还会对 SCI 模块执行软件复位、以使其为运行做好准备。
    8. 接下来、如果使用 FIFO、则设置相应的 FIFO 中断级别、方法是在 FFTX.TXFFIL 和 FFRX.RXFFIL 字段中设置这些级别。 必须选择 FIFO 级别、以便在 FIFO 溢出之前为中断提供足够的时间来处理数据请求。 对于较长的 SCI ISR、应确保足够早地中断、或者将处理移出 ISR、并且仅在 SCI ISR 中执行数据移动(建议)。
    9. 最后、如果使用 FIFO、则通过设置 FFTX.SCIRST(如果未设置,但可以安全地重新设置)、FFTX.SCIFFENA、FFTX.TXFIFORESET 和 FFRX.RSFIFORESET 位来启用 FIFO。
    10. 最后、通过设置 CTL1.TXENA、CTLA.RXENA 和 CTL1.SWRESET 位再次启用该模块。 这还会对 SCI 模块执行软件复位、以使其为运行做好准备。

    在您的中断服务例程中、 请检查它是否 正确清除了中断标志:

    1. 从 FIFO 读取数据
    2. 清除溢出状态(如果有)
    3. 清除 RX FIFO 中断标志
      HWREG (SCIC_BASE + SCI_O_FFRX)|= SCI_FFRX_RXFFINTCLR;
    4. 使用 ACK 清除 PIE 中断

    另请 仔细检查:

    • 溢出条件已正确清除
    • 在初始化期间、FIFO 正在正确复位
    • 中断标志在 ISR 中正确清除
    • 检查 ISR 中是否存在任何 RX 错误、以便您可以处理它们

    此致、

    Allison

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

    尊敬的 Allison:

    感谢您的答复。

    我做了一些调查。 中断跳转到 ISR 一次、然后停止到那里。 我暂停了 CPU 并进行了检查; 设置了外设中断标志。 PIEIFR 被置位。 PIEIER 设置正确。 CPU IER 已正确设置(在内核寄存器中) 、但 IFR 不会传播到 CPU、在其他字中、 内核寄存器中关联的 IFR 未设置。 我确认中断是 ISR、并正确设置了 PIEACK。 这是我第一次使用 TI MCU、我是否遗漏了一些东西?

    非常感谢您的帮助。

    谢谢你

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

    您好、

    感谢您提供的其他信息 — 让我根据您的意见与我们的一位 PIE 专家核实 。

    此致、

    Allison

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

    您好、

    感谢您的耐心。  您可以在暂停 CPU 时发送寄存器值(导出或屏幕截图)吗? 您能详细说明何时停止? 这是否在第一个 ISR 中? 或退出后? 您是否逐步执行 ISR 以检查在 PIE 中首次确认 CPU2 进入 ISR 时 ACK 是否已关闭?

    此致、

    Allison