21ic问答首页 - 关于HC32F4A0 串口DMA 接收指定数据长度后无法自动重载的问题(已解决)
关于HC32F4A0 串口DMA 接收指定数据长度后无法自动重载的问题(已解决)
本帖最后由 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,在开启通道即可,高频接收过多数据时可能产生一些不确定结果,比如一段时间内无法触发中断,从而导致一定程度的丢包,常规交互式通讯没什么问题。
开始发错板块了,这里重新发一下
根据官方例程,串口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,在开启通道即可,高频接收过多数据时可能产生一些不确定结果,比如一段时间内无法触发中断,从而导致一定程度的丢包,常规交互式通讯没什么问题。
赞0
低速率传输没问题,高速率丢包严重,估计有10%
评论
2025-07-15
赞0
评论
2025-06-30
赞0
评论
2025-05-27
赞0
评论
2025-05-27
赞0
评论
2025-05-27
赞0
评论
2025-05-27
赞0
评论
2025-05-27
赞0
评论
2025-05-27
赞0
评论
2025-04-30
您需要登录后才可以回复 登录 | 注册