工具与软件:
当按下按钮1或按钮2时、我的代码使用 DMA 通过 UART 发送数据、但它仅执行一次、因为即使我在 DMA 中断处理程序中将其清除、UCA0TXIFG 标志仍保持置位状态。 但是、如果我在 UCA0TXIFG 标志被清除前、在 DMA 中断处理程序内插入一个断点、那么当按下任一按钮时、代码都会一直发送数据。 当我检查寄存器值时、没有断点、UCA0IFG 寄存器内的 UCATXIFG 保持置位。 问题可能是什么? 我的代码基本上与下面的代码类似。
#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. }