HC32F460JETA使用串口DMA循环传输数据时遇到问题,只传输了一次就停止传输。固件版本是HC32F460_DDL_Rev3.2.0.zip,以下是DMA配置部分
void DmaReconfigInit(void)
{
stc_dma_reconfig_init_t stcDmaReconfigInit;
DMA_ReconfigStructInit(&stcDmaReconfigInit);
stcDmaReconfigInit.u32CountMode = DMA_RC_CNT_SRC;
stcDmaReconfigInit.u32SrcAddrMode = DMA_RC_SRC_ADDR_RPT;
stcDmaReconfigInit.u32DestAddrMode = DMA_RC_DEST_ADDR_KEEP;
DMA_ReconfigInit(CM_DMA2, DMA_CH0, &stcDmaReconfigInit);
AOS_SetTriggerEventSrc(AOS_DMA_RC, EVT_SRC_DMA2_TC0);
DMA_ReconfigCmd(CM_DMA2, ENABLE);
}
int32_t DMA_Config(uint16_t len,uint8_t *txbuf)
{
int32_t i32Ret;
stc_dma_init_t stcDmaInit;
stc_dma_repeat_init_t stcDmaRepeatInit;
/* DMA&AOS FCG enable */
FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_DMA2, ENABLE);//TX_DMA_FCG_ENABLE
FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_AOS, ENABLE);
/* USART_TX_DMA */
DMA_StructInit(&stcDmaInit);
stcDmaInit.u32IntEn = DMA_INT_DISABLE;//DMA_INT_ENABLE;
stcDmaInit.u32BlockSize = 1UL;
stcDmaInit.u32TransCount = len;
stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
stcDmaInit.u32DestAddr = (uint32_t)(&CM_USART1->TDR);
stcDmaInit.u32SrcAddr = (uint32_t)txbuf;
stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC;
stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;
//stcDmaInit.u32TransferMode = DmaTransferModeCycle;
i32Ret = DMA_Init(CM_DMA2, DMA_CH0, &stcDmaInit);
if (LL_OK != i32Ret) while(1){}
AOS_SetTriggerEventSrc(AOS_DMA2_0, EVT_SRC_USART1_TI);
DMA_RepeatStructInit(&stcDmaRepeatInit);
stcDmaRepeatInit.u32Mode = DMA_RPT_BOTH;//DMA_RPT_SRC;
stcDmaRepeatInit.u32SrcCount = 0;
stcDmaRepeatInit.u32DestCount = 0;
DMA_RepeatInit(CM_DMA2, DMA_CH0, &stcDmaRepeatInit);
DmaReconfigInit();
DMA_Cmd(CM_DMA2, ENABLE);
DMA_ChCmd(CM_DMA2, DMA_CH0, ENABLE);
DMA_TransCompleteIntCmd(CM_DMA2, DMA_INT_TC_CH0, ENABLE);
AOS_SW_Trigger();
USART_FuncCmd(CM_USART1, USART_TX, ENABLE);
return i32Ret;
}