硬汉嵌入式论坛

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

[DMA] BDMA传送完成中断问题

[复制链接]

3

主题

13

回帖

22

积分

新手上路

积分
22
发表于 2021-3-26 17:55:15 | 显示全部楼层 |阅读模式
本帖最后由 面包人 于 2021-3-26 17:57 编辑

问题描述:
在BDMA_Channel0 产生传送完成中断的时候,能正常进入BDMA_Channel0_IRQHandler,随后把传送完成中断标志清零后(因为只开启了传送完成中断),发现BDMA_Channel0_IRQHandler 会再次进入,断点函数入口发现此时BDMA->ISR = 0

就是BDMA_Channel0 传送完成之后会进入2次中断

BDMA配置如下:
BDMA_Channel0->CCR 配置为 0x00000023  也就是循环模式,开启了传送完成中断,最后使能BDMA_Channel0
BDMA_Channel0->CNDTR = 0xFFFF


其他配置省略了  外设地址和内存地址都是D3域的  

研究了很久也没找到问题所在,请问这是什么原因导致的呀?


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2021-3-27 00:09:12 | 显示全部楼层
你的DMA开的是循环模式吗? 循环模式下DMA是一直执行的,执行完一次进一次中断,如果你要仅进入一次中断,设置为正常模式即可。

回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2021-3-27 09:40:39 | 显示全部楼层
BDMA是开的循环模式,我的目的是让一直执行  因为我设置传送数量是0xFFFF,
就是传送完0xFFFF数量的时候  正常来就会触发传送完成中断然后中断清除了标志位 ,就会等下次传送完成才会进
现在的现象就是 传送完0xFFFF会连续进两次 ,清除完成标志位后 又进中断一次 ,此时断点中断入口那个位置 查看 BDMA->ISR 是为0的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2021-3-27 09:46:16 | 显示全部楼层
面包人 发表于 2021-3-27 09:40
BDMA是开的循环模式,我的目的是让一直执行  因为我设置传送数量是0xFFFF,
就是传送完0xFFFF数量的时候   ...

明白了,你的意思是你清除完毕后,立即又进入了一次,那的确奇怪,我之前做过一个BDMA的双缓冲实现任意GPIO脉冲输出控制的案例,一切正常。

第41章
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2021-3-27 09:57:40 | 显示全部楼层
eric2013 发表于 2021-3-27 09:46
明白了,你的意思是你清除完毕后,立即又进入了一次,那的确奇怪,我之前做过一个BDMA的双缓冲实现任意GP ...

谢谢大佬  我先去再试下看看
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2021-3-27 13:39:55 | 显示全部楼层
如果这样写的情况下 是不会连续进入两次中断

我之前是这样写的(会连续进入两次) 因为只开了完成中断所以没有去做判断了





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2021-3-28 08:44:17 | 显示全部楼层
面包人 发表于 2021-3-27 13:39
如果这样写的情况下 是不会连续进入两次中断

我之前是这样写的(会连续进入两次) 因为只开了完成中断所 ...

我的半传输完整中断和传输完成中断都开启了,否则无法实现任意脉冲数输出的。
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2021-3-28 10:03:22 | 显示全部楼层
eric2013 发表于 2021-3-28 08:44
我的半传输完整中断和传输完成中断都开启了,否则无法实现任意脉冲数输出的。

我不是做脉冲输出计数 我用做外部中断输入计数的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2021-3-28 10:07:02 | 显示全部楼层
面包人 发表于 2021-3-28 10:03
我不是做脉冲输出计数 我用做外部中断输入计数的

你也可以开个半传输完成中断和传输完成中断的,不管用来干什么,这两种都可以使用的,测试下是否正常。

首先可以肯定的是:你楼主位说的这种现象不正常,感觉你的配置有问题,建议全部用HAL库配置,然后中断函数也直接调用HAL库的那个处理方式,详细检查下。
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2021-3-28 10:12:32 | 显示全部楼层
eric2013 发表于 2021-3-28 10:07
你也可以开个半传输完成中断和传输完成中断的,不管用来干什么,这两种都可以使用的,测试下是否正常。
...

撸的寄存器没用HAL库   

昨天发的图片怎么没有。。。

我用大佬例程这种写法是没有问题了
        if((BDMA->ISR & BDMA_FLAG_TC0) != RESET)
        {
                BDMA->IFCR = BDMA_FLAG_TC0;
        }

        /* 半传输完成中断 */   
        if((BDMA->ISR & BDMA_FLAG_HT0) != RESET)
        {
                BDMA->IFCR = BDMA_FLAG_HT0;
        }

        /* 传输错误中断 */
        if((BDMA->ISR & BDMA_FLAG_TE0) != RESET)
        {
                BDMA->IFCR = BDMA_FLAG_TE0;
        }


我开始这样写就有问题

BDMA->IFCR = 0x0000000F
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 17:09 , Processed in 0.435858 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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