串口DMA卡死问题

该博客探讨了在单片机串口使用DMA发送数据时遇到的卡死问题。当out_buf->wait信号量未释放且get指针指向末尾时,串口无输出。问题源于DMA中断处理函数中回调函数的执行不及时,导致信号量无法释放。解决方案是在中断处理函数开始时先清理中断,确保回调函数能正确配置DMA并释放信号量。

问题描述

串口发送使用DMA出现卡死的问题,串口无输出,out_buf->wait信号量未释放,out_buf的get指针指向末尾

原因分析:

DMA本次搬运完,在中断处理函数中调用对应的回调函数,在回调函数里进行buf指针的调整,若还有剩余数据则配置DMA继续搬运
out_buf的get指针指向末尾时,DMA下次搬运数据量较少,很快完成,本次进入DMA中断处理函数中没有及时清理中断,导致下一次中断到来时一起被清理,无法进入callback函数,释放out_buf->wait信号量,此时任务中再次调用serial_write时卡死

解决方案:

将清理中断调整到回调函数之前,进入中断处理函数先清理中断,再在回调函数中配置DMA,dma_isr中部分代码如下

if ((val32 & (0x1 << DMAC_INT_STATUS_TFR_BIT)) != 0) 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值