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.

[参考译文] CCS/MSP432P401R:启用/禁用中断

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/586071/ccs-msp432p401r-enabling-disabling-interrupts

器件型号:MSP432P401R

工具/软件:Code Composer Studio

我正在将两个不同的示例和一个用途合并到 Franken 的过程中:

MAP_Interrupt_enableMaster();来自 DriverLib 和其他用途:

 

_enable_interrupt ();

 

我是否做了两次同样的事情? 两者之间是否存在差异?

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

    我认为这两者在功能上都大致相同。  我需要进一步挖掘、以确定它们是否相同。  _enable_interrupt ()是一个内在函数,您可以在 本文档中查看汇编调用

    DriverLib 函数调用可在 driverlib 文件夹的 cpu.c 中找到、看起来是一个非常相似的调用。  下面:第一张图片来自内在函数;第二张图片来自最终由 MAP_Interrupt_enableMaster()调用的 cpu.c 函数;  M4 cortex 似乎与预期不匹配、但可能有原因。

    简短回答:是的、我认为它们在功能上是相同的。  但是、如果不执行适当的包括/等操作、它们就不能真正互换 因此、我通常只会在应用时坚持使用 TI-REX 中的示例代码所使用的任何实现。

    这是适合您的答案、还是需要此答案来解决更复杂的问题?

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

    谢谢。 我目前正在同时使用这两种方法! ^μ A)

    //启用中断*/
    MAP_UART_enableInterrupt (EUSCI_A0_BASE、
    EUSCI_A_UART_receive_interrupt | EUSCI_A_UART_Transmit _interrupt);
    MAP_Interrupt_enableInterrupt (INT_EUSCIA0);
    MAP_Interrupt_enableMaster ();
    
    //初始化演示。 */
    boardInit();
    clockInit();
    初始化 Buttons();
    
    /*全局启用中断。 */
    __enable_interrupt ();
    

    当您尝试合并两个示例时、会发生这种情况。 我提出这一要求是因为我想关闭串行接收代码的一部分中的中断、只是想知道这一差异、我怀疑 driverlib 最终会调用__enable_interrupt ();

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

    DriverLib 不直接调用该内在函数、但该内在函数的 asm 几乎与 DriverLib 函数的 asm 相同。

    这两种方法都不会有伤害、但我认为您只需要一种。  由于您一直在使用 DriverLib 函数、我建议使用 DriverLib 函数。  是否有一个例子、您看到它使用过类似这样的方法、或者您是否出于另一个原因决定这样做?  (此外、我在前面测试了一些 DriverLib 示例、只是为了了解在没有调用的情况下会发生什么情况。  我尝试的那些仍然正常工作、这意味着 UART_enableInterrupt 等函数也可能启用主中断。  但最好至少保持冗余。)

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

    k3500 grlib 示例实现了这一点:

    /*初始化演示。 *
    boardInit();
    clockInit();
    initializeDemoButtons();
    
    /*全局启用中断。 *
    _enable_interrupt ();
    
    

    驱动程序库 UART 回显示例实现了这一点:

    /*启用中断*/
    MAP_UART_enableInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt);
    MAP_Interrupt_enableInterrupt (INT_EUSCIA0);
    MAP_Interrupt_enableSlepOnIsrExit();
    MAP_Interrupt_enableMaster(); 

    由于我希望通过 grlib 程序进行 UART 通信、因此我将这两者结合在一起。 奇怪的是,另一个 UART 示例*不*使用 enableMaster()。

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

    好的、这很有道理!

    我认为您无需同时使用这两种方法即可完成此操作(或者很可能没有这两种方法、因为某些冗余似乎已经内置)。  

    我想您可以不使用__enable_interrupts ();但我看不到任何损害(在我看来,由于这种情况,增加了最小的代码大小或处理能力)。