主题中讨论的其他器件:SysConfig
尊敬的香槟:
我是为我们的客户提出这个问题。
假设用户已经在 NVIC_EnableIRQ ()的初始化中启用了一些中断,那么用户如何禁用所有这些启用的中断一段时间,然后启用它们一次?
在 MSP430和 C2000 F28x 中有些采用了以下模式。
Dint;
EINT;
是否有适合用户的相应简单 API 或 C/内在函数代码?
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.
尊敬的香槟:
我是为我们的客户提出这个问题。
假设用户已经在 NVIC_EnableIRQ ()的初始化中启用了一些中断,那么用户如何禁用所有这些启用的中断一段时间,然后启用它们一次?
在 MSP430和 C2000 F28x 中有些采用了以下模式。
Dint;
EINT;
是否有适合用户的相应简单 API 或 C/内在函数代码?
韦恩、您好!
我不太熟悉 C2000、但是 MSP430有一个全局中断启用(GIE)功能、这个功能使用 DINT、EINT 样式指令来禁用/启用所有中断。
对于 MSMP0系列、客户有两个选项;一个是禁用特定的 NVIC、另一个是外设。
示例:
NVIC -> NVIC_EnableIRQ (TIMER_0_INST_INT_IRQN);
外设-> DL_TimerG_enableInterrupt (TIMER_0_INST、DL_TIMERG_INTERRUPT_ZERO _EVENT);
这有什么用吗?
尊敬的 Dennis:
如果在初始化过程中启用了许多中断、
(例如、SysTick _IRQn、 GPIOA_INT_IRQn、 TIMG1_INT_IRQn、ADC0_INT_IRQn、 UART1_INT_IRQn)、
那么、用户可以使用上述方法在一个语句中一次性禁用它们吗?
例如、
NVIC -> NVIC_DisableIRQ (SysTick _IRQn|GPIOA_INT_IRQn|TIMG1_INT_IRQn|ADC0_INT_IRQn|UART1_INT_IRQn);
NVIC -> NVIC_EnableIRQ (SysTick _IRQn|GPIOA_INT_IRQn|TIMG1_INT_IRQn|ADC0_INT_IRQn|UART1_INT_IRQn);
而不是在许多语句中逐个禁用和启用。
"你以为你赢了吗?
尊敬的 Dennis:
您是否还可以参考此内容?
你认为使用 CLRENA[31:0]/SETENA[31:0]禁用所有中断并一次全部启用是否合理?
如果需要、我们如何在 TI driverlib API、CMSIS API 或其他地方编写代码?
尊敬的 Dennis:
似乎有更好的方法来使用 PRIMASK (PM)的位0。
在 TRM 的 P168中、可以看到如下所示、

在 ARM M0+ TRM 中、该字段也表示相同。
https://developer.arm.com/documentation/ddi0484/c/Programrs-Model/Instruction-set-summary?lang=en

您能否帮助您确认它是否起作用、以及我们如何在 C 代码中使用它?
例如、按 TI driverlib API、按下面的 CMSIS API 或者 使用 asm ()直接调用嵌入式汇编?
是否可以调用 asm ()来直接使用 CPSID,CPSIE?
asm (" CPSID I"); 
asm (" CPSIE I"); 
韦恩、您好!
据我们的软件团队称,我们尚未确认这项工作。 也就是说、它是一个 ARM 内核、因此这些 asm 指令应该可以工作。 您试过吗?
它们确实工作正常。 使用"i"来实现启用/禁用中断。
对于组装、这些工作:
_asm volatile ("CPSID I");
_asm volatile ("CPSIE I");
对于 CMSIS、这些工作:
__enable_IRQ ();
_disable_irq ();
以下是 ARM 开发人员文档中这些指令的特定用途。
如果您遇到任何问题或遇到意外行为、请告诉我。