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.

[参考译文] TM4C1290NCPDT:EPI DMA 中断

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/937644/tm4c1290ncpdt-epi-dma-interrupt

器件型号:TM4C1290NCPDT

您好!

我将配置 DMA、以便从内部 RAM 写入 EPI。 虽然这个传输工作一次、但我没有清除中断、所以它会不断被重新触发。 我认为 EPIIntErrorClear (EPI0_BASE、EPI_INT_ERR_DMAWRIC)

应该执行该任务、但不应该执行该操作。 要清零:如果发生任何其他中断、我选中了该复选框、但该中断仅为 EPI_INT_DMA_TX_DONE 中断。

欢迎您提供任何帮助、

此致

Micky

我的代码是

uint16_t auData[512]={1、2、3};
uint16_t* pDst =(uint16_t*) 0x80000400;

ROM_uDMAChannelAttributeDisable (UDMA_CH21_EPI0TX、UDMA_ATTR_USEBURST);
ROM_uDMAChannelAttributeEnable (UDMA_CH21_EPI0TX、UDMA_ATTR_USEBURST);
ROM_uDMAChannelControlSet (UDMA_CH21_EPI0TX| UDMA_PRI_SELECT、
UDMA_SIZE_16| UDMA_SRC_INC_16 |
uDMA_dst_INC_none| uDMA_ARB_8);
ROM_uDMAChannelTransferSet (UDMA_CH21_EPI0TX | UDMA_PRI_SELECT、
UDMA_MODE_AUTO、AUData、&pDst、
256);
ROM_uDMAChannelAssign (UDMA_CH21_EPI0TX);
ROM_uDMAIntClear (UDMA_CH21_EPI0TX);

ROM_uDMAChannelEnable (UDMA_CH21_EPI0TX);
ROM_uDMAChannelRequest (UDMA_CH21_EPI0TX);
EPIDMATxCount (EPI0_BASE、256); 

和中断服务处理程序

void vfnEpi0Handler()
{
uint32_t USTATUS;
静态 uint32_t suEpiReady=0;
uint32_t uInts = ROM_EPIIntStatus (EPI0_BASE、TRUE);
开关(uInts)
{
EPI_INT_TXREQ 案例:
suEpiReady++;
中断;
EPI_INT_RXREQ 案例:
suEpiReady++;
中断;
EPI_INT_ERR 案例:
suEpiReady++;
中断;
EPI_INT_DMA_TX_DONE 情况:
suEpiReady++;
EPIIntErrorClear (EPI0_BASE、EPI_INT_ERR_DMAWRIC);
中断;
EPI_INT_DMA_RX_DONE 情况:
suEpiReady++;
中断;
默认值:
中断;
}
USTATUS = ROM_uDMAChannelModeGet (UDMA_CH21_EPI0TX);
if (USTATUS = UDMA_MODE_STOP)
{
// DMA 就绪
suEpiReady++;
}


}; 

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

    在调用 EPIIntErrorClear 之前和之后、EPI 掩码后中断状态寄存器中的值是多少?

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

    尊敬的 Bob:

    我检查了是否发生了任何其他中断、但它仅是 EPI_INT_DMA_TX_DONE 中断。  uInts 的值

    uint32_t uInts = ROM_EPIIntStatus (EPI0_BASE、TRUE);

    是16。 因此、在服务例程中的开关情况下、只有 EPI_INT_DMA_TX_DONE、由调试器控制。

    直接写入 EPI 时工作正常、运行正常。 我不会清除中断。

    此致

    Michael

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

    尊敬的 Bob:

    我发现了问题。

    首先是 C 语法错误

    ROM_uDMAChannelTransferSet(UDMA_CH21_EPI0TX | UDMA_PRI_SELECT,
                           UDMA_MODE_AUTO, auData,&pDst,
                           256);
    必须是
    ROM_uDMAChannelTransferSet(UDMA_CH21_EPI0TX | UDMA_PRI_SELECT,
                           UDMA_MODE_AUTO, auData,pDst,
                           256);
    第二、我通过试错发现:如果我移除线、它运行得非常完美:
    EPIDMATxCount (EPI0_BASE、256);
    无论如何、感谢您的关注、
    此致
    Micky