[技术问答] 关于HC32F4A0 串口DMA 接收指定数据长度后无法自动重载的问题(已解决)

[复制链接]
 楼主| eyesmall 发表于 2025-3-16 17:52 | 显示全部楼层 |阅读模式
本帖最后由 eyesmall 于 2025-7-15 13:16 编辑

开始发错板块了,这里重新发一下
根据官方例程,串口1配置完成后收发正常,如法庖制串口2时,串口2正常,串口1接收异常,接收完预设大小的数据后计数为0,无法重置。目前根据自己理解配置DMA如下 /* DMA definition */
#define USART1_RX_DMA_UNIT                             (CM_DMA1)
#define USART1_RX_DMA_CH                               (DMA_CH0)
#define USART1_RX_DMA_FCG_ENABLE()              (FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_DMA1, ENABLE))
#define USART1_RX_DMA_TRIG_SEL                         (AOS_DMA1_0)
#define USART1_RX_DMA_TRIG_EVT_SRC             (EVT_SRC_USART1_RI)

void APP_DMA_Config(void)
{
            int32_t i32Ret;
            stc_dma_init_t stcDmaInit;
            stc_dma_llp_init_t stcDmaLlpInit;
            stc_irq_signin_config_t stcIrqSignConfig;
            static stc_dma_llp_descriptor_t stcLlpDesc;
        stc_dma_repeat_init_t stcdmarepeatinit_t;

    /* DMA&AOS FCG enable */
            USART1_RX_DMA_FCG_ENABLE();
            USART1_TX_DMA_FCG_ENABLE();
            FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_AOS, ENABLE);

    /* USART_RX_DMA */
    (void)DMA_StructInit(&stcDmaInit);
    stcDmaInit.u32IntEn = DMA_INT_DISABLE;
    stcDmaInit.u32BlockSize = 1UL;
    stcDmaInit.u32TransCount = 512;
    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
    stcDmaInit.u32DestAddr = (uint32_t)DMARecBuf_USART1;
    stcDmaInit.u32SrcAddr = (uint32_t)(&CM_USART1->RDR);
    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_FIX;
    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_INC;
    DMA_Init(USART1_RX_DMA_UNIT, USART1_RX_DMA_CH, &stcDmaInit);
                       
//    /* Repeat Config */
        (void)DMA_RepeatStructInit(&stcdmarepeatinit_t);
        stcdmarepeatinit_t.u32Mode=DMA_RPT_DEST;
        stcdmarepeatinit_t.u32DestCount=512;
        stcdmarepeatinit_t.u32SrcCount=1;
        DMA_RepeatInit(USART1_RX_DMA_UNIT, USART1_RX_DMA_CH, &stcdmarepeatinit_t);               
        stcIrqSignConfig.enIntSrc = DF_USART1_RX_DMA_TC_INT_SRC;
        stcIrqSignConfig.enIRQn  = DF_USART1_RX_DMA_TC_IRQn;
        stcIrqSignConfig.pfnCallback = &USART1_RX_DMA_TC_IrqCallback;
        (void)INTC_IrqSignIn(&stcIrqSignConfig);
        NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);
        NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
        NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);
        DMA_TransCompleteIntCmd(DF_USART1_RX_DMA_UNIT, DF_USART1_RX_DMA_TC_INT, ENABLE);        

测试效果  串口1接收完512字节后  DMA cnt由512变为0  之后再发送数据则无法接收, 计数一直为0,不知道是理解的问题还是怎么回事,望高人指教一二


解决:接收完成后,在接收完成中断内将计数重置为512,在开启通道即可,高频接收过多数据时可能产生一些不确定结果,比如一段时间内无法触发中断,从而导致一定程度的丢包,常规交互式通讯没什么问题。

wubangmi 发表于 2025-3-17 09:27 | 显示全部楼层
给你提个醒,不能两个DMA都用自动重置的方式,这样会冲突。
你可以改成一个自动重置,一个手动重置的方式。
 楼主| eyesmall 发表于 2025-3-21 14:43 | 显示全部楼层
wubangmi 发表于 2025-3-17 09:27
给你提个醒,不能两个DMA都用自动重置的方式,这样会冲突。
你可以改成一个自动重置,一个手动重置的方式。 ...

我现在8个串口,16路DMA全部改成手动重置了,省心
lxs0026 发表于 2025-3-31 12:43 | 显示全部楼层
没有显式地配置中断使能,也没有配置中断服务程序。
 楼主| eyesmall 发表于 2025-4-3 11:01 | 显示全部楼层
lxs0026 发表于 2025-3-31 12:43
没有显式地配置中断使能,也没有配置中断服务程序。

我理解循环模式应该可以自动重置,结果发现并不能,只能重载地址不能重载次数有点太尬了,
发顺丰更大nc 发表于 2025-4-23 10:47 | 显示全部楼层
配置完成后收发正常
Amazingxixixi 发表于 2025-4-24 14:56 | 显示全部楼层
学习一下啊!感觉有点知识慌了
有何不可0365 发表于 2025-4-30 15:42 | 显示全部楼层
确保 DMA 完成后,你需要清除相关的中断标志或者重置 DMA 通道,以便重新开始下一次数据接收。
onlycook 发表于 2025-5-27 12:12 | 显示全部楼层
在HC32F4A0中,若两个DMA通道均配置为自动重载模式,可能引发通道间的配置冲突,导致接收完成后计数器无法正常重置。
flycamelaaa 发表于 2025-5-27 14:20 | 显示全部楼层
未显式配置中断使能或中断服务程序,导致DMA完成传输后无法触发后续处理流程。
powerantone 发表于 2025-5-27 15:30 | 显示全部楼层
接收完成后未清除中断标志或重置DMA通道?
stormwind123 发表于 2025-5-27 18:00 | 显示全部楼层
可能是DMA与串口初始化时序问题吧。。
probedog 发表于 2025-5-27 19:00 | 显示全部楼层
优化DMA重载模式配置,改为手动重载模式,通过软件控制DMA通道的重新启动。
classroom 发表于 2025-5-27 20:00 | 显示全部楼层
在DMA中断服务程序中,显式清除中断标志并重置DMA通道。
初级工程渣 发表于 2025-6-30 15:25 | 显示全部楼层
代码中同时配置了块传输和重复模式,但参数设置可能不匹配
 楼主| eyesmall 发表于 2025-7-15 11:57 | 显示全部楼层
初级工程渣 发表于 2025-6-30 15:25
代码中同时配置了块传输和重复模式,但参数设置可能不匹配

低速率传输没问题,高速率丢包严重,估计有10%
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

168

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部