Part Number: MSP430FR5969
Tool/software:
My code sends data over UART using DMA, when a button-1 or button-2 is pressed, but it only does it once because UCA0TXIFG flag remains set even though I clear it in DMA interrupt handler. But if I insert a breakpoint inside the DMA interrupt handler before UCA0TXIFG flag is cleared, the code keeps sending data when whichever button is pressed. When I inspect the register values, without breakpoint UCATXIFG remains set in UCA0IFG register. What could be the problem? My code is basically something like below.
#include "MSPEXP430FR5969.h"
#include <string.h>
char Button_1[] = "Button 1\r\n";
char Button_2[] = "Button 2\r\n";
/**
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
conf_gpio();
PM5CTL0 &= ~LOCKLPM5;
gpio_clearAllInts();
conf_cs();
conf_uart();
conf_dma();
__enable_interrupt();
__delay_cycles(1000);
enable_gpio_ints();
enable_dma_int();
while(1);
return 0;
}
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR(void)
{
__data20_write_long( (uint32_t) &DMA0SA, (uint32_t) Button_2 );
__data20_write_long( (uint32_t) &DMA0DA, (uint32_t) &UCA0TXBUF );
DMA0SZ = strlen( Button_2 );
DMA0CTL |= DMAEN;
P1IFG &= ~BIT1;
return;
}
#pragma vector=PORT4_VECTOR
__interrupt void Port4_ISR(void)
{
__data20_write_long( (uint32_t) &DMA0SA, (uint32_t) Button_2 );
__data20_write_long( (uint32_t) &DMA0DA, (uint32_t) &UCA0TXBUF );
DMA0SZ = strlen( Button_1 );
DMA0CTL |= DMAEN;
P4IFG &= ~BIT5;
return;
}
#pragma vector=DMA_VECTOR
__interrupt void DMA_ISR(void)
{
UCA0IFG &= ~UCATXIFG; // When I insert a breakpoint here, it works properly.
}