硬汉嵌入式论坛

 找回密码
 立即注册
查看: 986|回复: 10
收起左侧

[DMA] HAL库DMA传输中断标志位没有被清除,看寄存器操作没问题

[复制链接]

4

主题

9

回帖

21

积分

新手上路

积分
21
发表于 2024-11-21 11:37:56 | 显示全部楼层 |阅读模式
DMA2开启了中断,在结构体里也给了函数指针回调函数。进入DMA中断后,我采用HAL_DMA_IRQHandler处理的,然后在半传输中断,传输完成中断函数里做操作。仿真进入HAL_DMA_IRQHandler后,执行了IFCR寄存器的清除操作,但是寄存器数据还是0。查看了操作的地址也没问题。后来改成安富莱那种自己判断,自己清除就可以正常使用,官方的HAL库就不行。


回复

使用道具 举报

4

主题

9

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-11-21 11:41:37 | 显示全部楼层
代码如下....................
111.png
222.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-11-22 09:24:52 | 显示全部楼层
多多吃点 发表于 2024-11-21 11:41
代码如下....................

这种情况也有可能是MDK调试组件展示有误。你实际下载使用正常吗
回复

使用道具 举报

4

主题

9

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-11-22 10:24:20 | 显示全部楼层
eric2013 发表于 2024-11-22 09:24
这种情况也有可能是MDK调试组件展示有误。你实际下载使用正常吗

昨天已经解决好了,在DMA为Normal模式下,必须打开DMA中断和串口中断,有一个不开,串口就只能发送一次便卡在Busy。然后HAL库串口对DMA传输中断又进行一次封装了,得调用HAL串口半传输或者传输完成中断回调函数。
回复

使用道具 举报

5

主题

157

回帖

172

积分

初级会员

积分
172
发表于 2024-11-22 16:02:13 | 显示全部楼层
多多吃点 发表于 2024-11-22 10:24
昨天已经解决好了,在DMA为Normal模式下,必须打开DMA中断和串口中断,有一个不开,串口就只能发送一次便 ...

跟DMA模式没关系吧,循环模式下就不用打开串口中断?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-11-23 10:05:49 | 显示全部楼层
多多吃点 发表于 2024-11-22 10:24
昨天已经解决好了,在DMA为Normal模式下,必须打开DMA中断和串口中断,有一个不开,串口就只能发送一次便 ...

好的,解决了就好

另外你说的"串口就只能发送一次便卡在Busy",感觉像是上一次还没有发送完毕就启动新的了,这个会有busy问题

回复

使用道具 举报

4

主题

9

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-11-25 16:46:29 | 显示全部楼层
2859932063 发表于 2024-11-22 16:02
跟DMA模式没关系吧,循环模式下就不用打开串口中断?

一般用的都是循环多吧,我也是第一次用normal,hal库每次进入都会判断state,而且DMA和其他外设配合,都是从外设的回调函数的传输完成中断和半传输完成中断中进行操作
回复

使用道具 举报

5

主题

157

回帖

172

积分

初级会员

积分
172
发表于 2024-11-25 17:08:53 | 显示全部楼层
eric2013 发表于 2024-11-23 10:05
好的,解决了就好

另外你说的"串口就只能发送一次便卡在Busy",感觉像是上一次还没有发送完毕就启动新 ...

不是的,其实是因为串口的状态没有及时修改成ready,其实可以关闭串口的中断的,在第一次的DMA中断中直接修改串口的状态为ready就可以减少一次串口的中断了,进而降低CPU的负载。
回复

使用道具 举报

5

主题

157

回帖

172

积分

初级会员

积分
172
发表于 2024-11-25 17:09:22 | 显示全部楼层
多多吃点 发表于 2024-11-25 16:46
一般用的都是循环多吧,我也是第一次用normal,hal库每次进入都会判断state,而且DMA和其他外设配合,都 ...

在第一次的DMA中断中直接修改串口的状态为ready就可以。这样少一次中断。
回复

使用道具 举报

4

主题

9

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-11-25 17:27:16 | 显示全部楼层
2859932063 发表于 2024-11-25 17:09
在第一次的DMA中断中直接修改串口的状态为ready就可以。这样少一次中断。

之前我就是这样解决的,现在用hal库的方式解决,hal库确实嵌套来嵌套去的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-11-26 07:45:31 | 显示全部楼层
2859932063 发表于 2024-11-25 17:08
不是的,其实是因为串口的状态没有及时修改成ready,其实可以关闭串口的中断的,在第一次的DMA中断中直接 ...

那你这个可能是只等待了DMA中断,串口本身有个收发完整中断回调,一般等待串口这个就行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-28 23:31 , Processed in 0.355886 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表