🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
问题描述
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;
}
解决方案
如下是上述问题的解决方案,仅供参考:
在HC32F460JETA单片机上使用DMA进行串口循环传输数据时,遇到只传输一次就停止传输的问题,可能与DMA配置或触发机制相关。以下是一些排查和可能的解决方案:
1. 检查DMA传输完成中断
- DMA只传输一次后停止,通常是因为传输完成中断触发了但没有再次配置或启动DMA。确认您在DMA传输完成后,重新配置并启用了DMA。
- 可以在DMA传输完成中断回调函数中,手动重新配置和启动DMA。比如,重新设置
DMA_ChCmd(CM_DMA2, DMA_CH0, ENABLE);
,以便让DMA继续循环传输。
2. 确保DMA触发事件正确配置
- 在DMA配置中,您使用了
AOS_SetTriggerEventSrc(AOS_DMA2_0, EVT_SRC_USART1_TI);
设置DMA的触发源。请确认这个触发源在每次发送完数据后都能被正确触发。 - 试着替换或测试其他触发事件源,以确定USART的发送中断或事件是否能够正确地触发DMA。
3. DMA重复模式和重配置模式
- 在
DMA_RepeatStructInit
和DmaReconfigInit
中,您配置了DMA的重复模式和重配置模式。 - 确认
stcDmaRepeatInit.u32Mode
的设置是否适合您的应用需求。如果只是源地址重复且目的地址不变,确保DMA_RPT_SRC
而不是DMA_RPT_BOTH
可能更适合您的需求。
4. 重配置命令启用
- 通过
DMA_ReconfigCmd(CM_DMA2, ENABLE);
启用DMA的重配置命令,确保每次传输完成后,DMA能够自动重新配置源地址或传输计数器,以便实现循环传输。
5. 增加Log调试信息
- 可以在代码中添加调试信息(例如使用串口打印或LED指示)来监控DMA传输完成中断是否被触发,以及查看DMA配置是否被正确重新加载。
6. 确保数据缓存区持续有效
- 确保
txbuf
数据缓存区在传输过程中没有被修改或销毁。如果缓存区内容被更改,DMA可能会遇到不可预见的行为。
代码调整示例
尝试在DMA传输完成中断中重新启动DMA:
void DMA_IRQ_Handler(void)
{
if (DMA_GetTransCompleteStatus(CM_DMA2, DMA_INT_TC_CH0) == SET)
{
DMA_ClearTransCompleteStatus(CM_DMA2, DMA_INT_TC_CH0);
// 重新配置并启动DMA
DMA_ChCmd(CM_DMA2, DMA_CH0, ENABLE);
AOS_SW_Trigger();
}
}
总结
上面列出的步骤可以帮助您解决DMA循环传输数据的问题,尤其是配置和触发机制的正确设置非常重要。如果以上方法仍未解决问题,建议进一步检查芯片文档或联系HC32技术支持以获取更详细的帮助。
希望如上措施及解决方案能够帮到有需要的你。
PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。
若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。
☀️写在最后
如上问题有的来自我自身项目开发,有的收集网站,有的来自读者…如有侵权,立马删除。再者,针对此专栏中部分问题及其问题的解答思路或步骤等,存在少部分搜集于全网社区及人工智能问答等渠道,若最后实在是没能帮助到你,还望见谅!并非所有的解答都能解决每个人的问题,在此希望屏幕前的你能够给予宝贵的理解,而不是立刻指责或者抱怨!如果你有更优解,那建议你出教程写方案,一同学习!共同进步。
ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。
码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。
同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!
📣关于我
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。