Part Number: MSP430FR5989-EP
Tool/software:
I am trying to understand if the behavior I am experiencing is what the errata DMA7 is describing. https://www.ti.com/lit/er/slaz523aa/slaz523aa.pdf?ts=1729560620562&ref_url=https%253A%252F%252Fwww.google.com%252F
What I under stand from the errata is that if the interrupt containing register is accessed while an active interrupt is trigger, it will drop that interrupt. But only that interrupt, further interrupts after enabling the interrupt system should be fine. I also do not know what TI is referring to when saying "a module register" is this saying the UCS A0 A1 B0 B1 interrupt subsystem only? or does that extend out to all the other peripherals / CPU. For instance if I were to do a memory to memory dma transfer with a dma interrupt on transfer completion, would that also be classified under what is a called "a module register" since the dma is a module with registers.
Though the case I find myself in is that if I disable interrupts as shown below and a interrupt request is generated from the peripheral while global interrupts are off. The DMA channel will stop receiving new interrupt requests outright, after enabling interrupts again.
Currently I am guarding some code with the following functions to enable and disable interrupts.
void enter_critical_section()
{
__asm__ volatile(
"DINT \n\t" /* Disable interrupts */
"NOP \n\t" /* Ensure DINT takes effect */
:
:
: "cc");
}
void exit_critical_section()
{
__asm__ volatile(
"NOP \n\t"
"EINT \n\t" /* Re-enable interrupts */
"NOP \n\t"
:
:
: "cc");
}
My dma channel is, DMA0 Channel 0 (highest priority) {I have also tested with the other 2 channels the behavior is the same}
I am connecting UART A0 RX to DMA0 channel 0 with interrupts for byte transfers.
Outside of this critical section, DMA + UART works as expected. but if it is triggered within a critical section, it then cuts out.