STM32
直播中

刘玉兰

8年用户 1096经验值
私信 关注
[问答]

求助,STM32F103C8T6的外设DMA共用通道冲突怎么解决?

我是用I2C和串口都用到了DMA,结果通道冲突了,然后我就加了互斥锁,且在串口或I2C外设使用DMA时就把所有用到这个DMA通道的外设都关闭了DMA功能,然后单独打开当前外设的DMA功能来使用。我是硬件I2C + DMA + 中断这么用的。
现在的问题是能用,串口和I2C都能用,就是用着用着会卡死,开了看门狗的,而且是不同任务的调用,且获取互斥锁是阻塞式的。我不知道是中断出问题了,还是因为频繁的切换DMA配置出问题了,因为每次调用都要更改DMA配置(内存地址、数据量、外设内存地址)。

回帖(2)

李兆存

2024-3-29 16:53:10
楼主我看了一下,串口2和I2C1是公用的,只能这样分时操作。建议选择其中一个用中断的方式操作吧。这样避免冲突。
举报

贾永世

2024-3-31 15:28:35
出现卡死的问题可能是由于以下几个原因导致的:

1. DMA配置错误:确保每次更改DMA配置时,都正确设置了内存地址、数据量以及外设内存地址。检查你的代码,确保这些参数在每次调用时都被正确配置。
2. 中断问题:确保DMA传输完成后的中断处理函数中的代码正确。你可以检查中断处理函数中是否正确释放了互斥锁,以及是否进行了必要的错误处理。
3. 互斥锁问题:检查互斥锁的使用方式是否正确。在单独打开当前外设的DMA功能之前,确保已经成功获取了互斥锁,并在使用完之后释放了互斥锁。确保对互斥锁的获取和释放是在正确的位置进行的。

另外,你还可以尝试减少频繁切换DMA配置的次数。如果可能的话,尝试在一次函数调用中完成所有必要的DMA传输,以减少切换的次数。

最好的方法是通过调试和排除法来确定问题的具体原因。你可以使用调试器来检查程序在卡死时所处的位置,并验证和确认DMA传输和互斥锁的使用是否正确。可以通过逐步注释或添加调试输出来验证和定位问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分