weixin_41025763 2024-09-04 18:48 采纳率: 0%
浏览 238
已结题

HC32串口DMA循环发送数据

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;
}

  • 写回答

24条回答 默认 最新

  • 檀越@新空间 2024-09-04 18:50
    关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    针对你的问题,我已经找到了可能的原因,并提供了相应的解决方案。

    1. 在DMA初始化函数中,我们没有正确地设置u32SourceAddrModeu32DestinationAddrMode。这些参数决定了源地址模式和目标地址模式,它们应该与.u32SrcAddrMode.u32DestAddrMode相匹配。

    修改后的代码如下:

    DMA_ReconfigInit(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 RCDEST_ADDR_ke
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月9日
  • 创建了问题 9月4日