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.

[参考译文] TMS320F28388D:如何在 SysBIOS 初始化之前清除和停用 SCI 的 FIFO

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1326134/tms320f28388d-how-to-clear-and-deactivate-fifo-of-sci-before-sysbios-initialization

器件型号:TMS320F28388D
Thread 中讨论的其他器件:SYSBIOS

您好!

我有一个程序以"配置"模式启动、此时 SysBIOS 未初始化、功能应用程序仍然未启动、在此配置中、我使用 FIFO 模式下的 SCI 执行一些调试/配置。

我的 SCI FIFO 的代码通过 以下方式初始化和解初始化:

void idSCIinitFIFO(void)
{
    // Initialize PIE and clear PIE registers. Disables CPU interrupts.
    Interrupt_initModule();
    
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    Interrupt_initVectorTable();
    
    Interrupt_register(INT_SCIA_RX, sciaRXFIFOISR);
    Interrupt_register(INT_SCIA_TX, sciaTXFIFOISR);
    
    SCI_resetChannels(SCIA_BASE);
    SCI_enableFIFO(SCIA_BASE);

    SCI_enableInterrupt(SCIA_BASE, (SCI_INT_RXFF | SCI_INT_TXFF));
    SCI_disableInterrupt(SCIA_BASE, SCI_INT_RXERR);
    
    SCI_setFIFOInterruptLevel(SCIA_BASE, SCI_FIFO_TX0, SCI_FIFO_RX1);
    SCI_performSoftwareReset(SCIA_BASE);
    
    SCI_resetTxFIFO(SCIA_BASE);
    SCI_resetRxFIFO(SCIA_BASE);
    
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    EINT;
    ERTM;
}

void idSCIdisableFIFO(void)
{
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    // To disable if generates problems, actually deactivated in case is activated during initialization
    DINT;
    DRTM;
    
    SCI_disableInterrupt(SCIA_BASE, (SCI_INT_RXFF | SCI_INT_TXFF | SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT | SCI_INT_RXERR));
    
    SCI_resetTxFIFO(SCIA_BASE);
    SCI_resetRxFIFO(SCIA_BASE);
    
    SCI_disableFIFO(SCIA_BASE);
    
    Interrupt_disable(INT_SCIA_RX);
    Interrupt_disable(INT_SCIA_TX);
    
    Interrupt_unregister(INT_SCIA_RX);
    Interrupt_unregister(INT_SCIA_TX);
    
    SCI_performSoftwareReset(SCIA_BASE);
    
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    
    EINT;
    ERTM;
}

似乎有剩余的东西,因为当我 Bios_Start ()我有一个未被处理的中断上升.

在启动 SYSBIOS 之前、有一些东西我漏掉了? 我强烈建议避免将此中断添加到 SYSBIOS、因为它实际上是在应用程序外部。

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

    您好!

    由于美国放假、请预计在2月20日前收到答复。

    谢谢。此致、

    辛奇塔

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

    您好,Yaroslav,

    所说的"未处理"中断,你是否是指中断标志在 PIE 中等待,以便在调用 Bios_Start ()时,它试图分支到 ISR (即使用 Interrupt_clearACKGROUP 清除它)? 这是用于接收还是发送中断? 您是否使用 TXENA 或 RXENA 位来阻止数据流入/超过移位寄存器? 您知道"剩余"数据有多少吗?

    此致、

    艾里森

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

    寄存两个中断、当接收到1个字节时、RX 和 TX 为两级 RX、当为空时、TX。

    我取消注册和禁用这两者。 然后、如果中断被保留下来、则清除 FIFO 和 ACK。

    在这种情况下、我应该有初始条件。 但有一些东西不是正确的训斥,当 SYSBIOS 启动时,它有一个未注册的中断向量97(sciTX)。

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

    您好,Yaroslav,

    您应该能够像以前一样使用 RXFIFO 复位和 TXFIFO 复位来刷写 FIFO 寄存器、并且由于禁用了中断、SCI 在 SysBIOS 启动时不应该触发中断。 您如何检查未注册中断的源?

    您是否可以尝试在 Bios_Start ()处放置一个断点,并检查 PIE 和与中断相关的 CPU 寄存器以查看是否有任何内容被错误地启用,或是否仍有任何标志设置在该点?

    此致、

    艾里森

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

    调用以下函数时、会覆盖 SYSBIOS 矢量表:


    Interrupt_initVectorTable();
    Interrupt_register(INT_SCIA_RX, sciaRXFIFOISR);
    Interrupt_register(INT_SCIA_TX, sciaTXFIFOISR);
    Interrupt_unregister(INT_SCIA_RX, sciaRXFIFOISR);
    Interrupt_unregister(INT_SCIA_TX, sciaTXFIFOISR);

    SysBIOS 矢量表在生成的 app_xxx.c 内部定义并加载到存储器中。

    /*
    * ======== ti.sysbios.family.c28.Hwi TEMPLATE ========
    */
    
    
    extern Void _c_int00(Void);
    extern Void ti_sysbios_family_c28_Hwi_dispatchPie(Void);
    extern Void ti_sysbios_family_c28_Hwi_dispatchTable(Void);
    extern Void ti_sysbios_family_c28_Hwi_unPluggedInterrupt__I(Void);
    
    /* Interrupt vector table. This will be copied to 0xd00 at boot time. */
    const UInt32 ti_sysbios_family_c28_Hwi_vectors[] = {
    
    HERE
    
    }

    有办法解决这个问题吗?

    我已经考虑了这个矢量和 恢复的备份,但我不知道是否有会破坏其他东西的辅助过程。

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

    您好,Yaroslav,

    你可以在调用 Interrupt_register ()之前读取矢量表中的 SCI 中断条目并将它们保存到变量中(基本上是备份 BIOS 调度程序 ISR )吗? 然后,当你禁用中断,而不是调用 Interrupt_unregister()时,你可以调用 Interrupt_register()并将你之前保存的矢量表条目传递给它,以恢复 BIOS ISR。

    此致、

    艾里森

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

    该解决方案可部分运行。 应用程序 不再卡在未处理的中断中、中断可以正常工作、但没有调用的 IPC 中断除外。

    我已经检查了 IPC 也在 SYSBIOS 的调度矢量内,所以它是正确的申斥,但有些东西不能正常工作。

    你是否有建议如何惩戒也 IPC ?

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

    您好,Yaroslav,

    很高兴听到已经取得一些进展。 为了澄清一下、如果您说 IPC 中断不起作用、您在程序中看到的是特定问题还是停止点? 您是否在 CCS 中收到任何其他错误?

    此致、

    艾里森

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

    CM 上的程序进入一个等待例程以等待来自 CPU1的 IPC 生效,在 CPU1上被提出一个中断来清除这个标志。 通常、此例程起作用。

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

    您好,Yaroslav,

    是否根本没有调用中断? (即、如果您在中断中设置了一个断点、程序将不会命中 ISR。) 您是否能够验证 IPC 标志是否生效?

    还想再次检查您确认(ACK) PIE 中的中断?

    此致、

    艾里森