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.

[参考译文] MSP430FR6047:程序执行在 DMA 传输期间停止

Guru**** 2553450 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/734728/msp430fr6047-program-execution-stops-during-dma-transfer

器件型号:MSP430FR6047

我将使用 DMA 通过 UART3发送一些数据。 DMA 传输正在工作、数据正在 UART 上输出。 问题是调用"UART_Send_Bytes"后、程序不会继续执行。 使用仿真器、它锁定了最后一条指令。 单步执行仿真器保持在最后一条指令。 以下代码:

void UART_Send_bytes (unsigned char *地址、unsigned char 大小)

//清除中断标志-由 Steve 于2018年6月21日添加
DMA3CTL &=~DMAIFG;

//源地址
__data20_write_long ((unsigned long)&DMA3SA、(unsigned long)地址);

//要存储的数据数
DMA3SZ =大小;
DMA3CTL |= DMAEN + DMAIE;//启用 DMA。

//进行虚假边沿触发以激活 DMA
UCA3IFG &=~UCTXIFG;
UCA3IFG |= UCTXIFG;

LPM0;//如果我删除这个,DMA 不成功。
DMA3CTL &=~(DMAEN + DMAIE);//禁用 DMA。 仿真器卡在这里。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否在任何位置启用中断(GIE)? 尝试插入
    >_enable_interrupt ();
    LPM0线之前的某个位置。 在 main ()也是一个很好的地方。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在调用"UART_Send_Bytes"之前在 main 中添加了该行、但仍然停留在:

    DMA3CTL &=~(DMAEN + DMAIE); //禁用 DMA。 仿真器卡在这里。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果调试器指向该行、则意味着您卡在 LPM 中。

    您能否确认(断点)您是否曾访问过您的 ISR? 您的 ISR 与昨天的情况是否相同?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    看到一些奇怪的东西。 我在 UART.c 中的 ISR 被注释掉。 将其重新添加到中、然后我得到了一个错误、因为 ISR 在两个位置进行了声明。 它也在 USS_Lib_HAL.c 中声明

    我已决定使用 USS_Lib_HAL.c 中的一个 向开关添加了一条 case 语句(之前为空):

    情况0x08:
    DMA3CTL &=~(DMAIFG|DMAIE); //清除标志并停止中断
    LPM0_EXIT;
    中断;

    现在它正在工作。 非常感谢!