硬汉嵌入式论坛

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

[μCOS-III] 无法进入DMA中断

[复制链接]

31

主题

53

回帖

146

积分

初级会员

积分
146
发表于 2016-6-6 07:44:21 | 显示全部楼层 |阅读模式
音乐播放器实验,把这个实验移植到ucosIII下,不过不是读出来的音乐文件,
而是用sin函数产生正弦波数据,采样频率44100,I2S模式,DMA双缓冲。
但是启动后,任务工作工正常,只是一直不进入DMA中断,能帮忙看看吗?


DMA配置
000.png


DMA中断服务函数,判断哪个缓冲在使用,填充未使用的缓冲
111.png


初始化
222.png


在任务代码中启动dma传输
444.png


启动DMA
555.png



工程代码见附件
MorseDemoF4.rar (3.3 MB, 下载次数: 132) 工程代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2016-6-6 09:40:29 | 显示全部楼层
没看出什么问题,帮顶。
回复

使用道具 举报

31

主题

53

回帖

146

积分

初级会员

积分
146
 楼主| 发表于 2016-6-7 13:12:56 | 显示全部楼层
除了版主你也没谁了。
这个dma双缓冲的代码问题我调试了将近两个月了。
从学习wav文件格式,i2s标准,双缓冲机制,搞到现在,这个不进中断的问题卡住我1个多月了,
感觉像是低级错误,但是自己看也看不出啥毛病,
用printf("%d",DMA_GetCurrDataCounter(DMA1_Stream4));显示的dma始终是缓冲区大小,应该是dma没有启动,
猜测是dma没有配置正确。
我现在接的外部器件是pcm1770扩展模块,模块是否正常工作还不清楚,但是I2S数据是单向的,应该不会影响stm32自身的dma工作。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2016-6-8 01:11:58 | 显示全部楼层

回 ggafish 的帖子

ggafish:除了版主你也没谁了。
这个dma双缓冲的代码问题我调试了将近两个月了。
从学习wav文件格式,i2s标准,双缓冲机制,搞到现在,这个不进中断的问题卡住我1个多月了,
感觉像是低级错误,但是自己看也看不出啥毛病,
用printf("%d",DMA_GetCurrDataCounter(DMA1_Stream4)); .. (2016-06-07 13:12) 
你的DMA配置应该没问题,有可能是你的I2S配置有问题。
回复

使用道具 举报

31

主题

53

回帖

146

积分

初级会员

积分
146
 楼主| 发表于 2016-6-14 23:38:09 | 显示全部楼层
i2s也没看有什么毛病,就是死活不进dma中断。
我已经快得抑郁症了。

111.png



222.png
回复

使用道具 举报

31

主题

53

回帖

146

积分

初级会员

积分
146
 楼主| 发表于 2016-6-15 00:23:46 | 显示全部楼层
有没有可能是没有开启浮点数?
main函数中第一个任务没有指定使用浮点数寄存器,
222.png


在第一个任务中做了bsp的初始化,再bsp_init()中有初始化i2s的代码,
333.png


i2s的库函数中有根据采样率计算预分频的代码,这部分会涉及到浮点数寄存器吗?
貌似整个初始化过程还没有发生任务调度,应该没有问题。
另外变量类型没有float类型,都是uint32的,
如何判断是否使用了浮点数寄存器?
111.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2016-6-16 11:02:50 | 显示全部楼层

回 ggafish 的帖子

ggafish:有没有可能是没有开启浮点数?
main函数中第一个任务没有指定使用浮点数寄存器,



....... (2016-06-15 00:23) 
这里没问题的。
回复

使用道具 举报

31

主题

53

回帖

146

积分

初级会员

积分
146
 楼主| 发表于 2016-6-23 07:49:45 | 显示全部楼层

回 eric2013 的帖子

eric2013:

这里没问题的。
谢谢,问题已经解决,是跟一个一年多没见的同学讨论了一下,第二天就找到原因了。
是I2s的配置问题,我不知道这算不算I2S库函数的一个BUG,
I2S_Init()函数执行后,还要再单独配置一下预分频器的值,I2S_Init()并不能执行完成这些配置。


现在我又遇到两个新问题:
我这个程序的目的是:STM32F29作为主机,发出I2S数据,这个数据不是MP3,而是一个单一频率的正弦波,数据由stm计算产生,频率在500-1000Hz之间,音频范围,通过加上一个开关,来控制喇叭是否发生,
这样就可以发出:摩尔斯码。关于摩尔斯电码的知识就不在这里介绍了。
问题:
1.stmf429(180M主频)使用dma的双缓冲机制发送i2s数据,就是在dma发送完成中断的ISR中,判断哪个缓冲在使用,通过一个标志位给任务发出消息,
然后在任务中根据采样频率和要发出的单音频频率,计算出数据并填充空白的那个缓冲区。(计算过程应该比从一个文件中直接读取一定长度的数据要慢得多,)
现在的问题是:填缓冲区的时间过长,感觉是计算比较耗时的原因(已经开启了DSP)。
11.png



采样率太高的话,就会大于dma中断的时间。
我stm的I2S配制成8Khz采样率,cpu就占用35%左右,44.1k的时候就没法工作了。
我做了一个实验,44.1K的时候,我只填充一个缓冲区,cpu占用70%以上。
这个问题有解决方法吗?
stm做MP3播放器是一点问题都没有的,是不是因为stm32的dsp部分毕竟能力有限?才使得我这种计算生成数据的方法不可行了?


单纯的扩大缓冲区或减小缓冲区是解决不了这个问题的。扩大缓冲区,虽然dma中断发生时间间隔变成,但是填充时间也会边长,减小缓冲区,虽然计算时间变短,但是dma中断发生的也越频繁。
有什么好的建议吗,版主?难不成要专门加一片dsp?感觉也不是不可行啊,反正成本不在考虑问题之内。

2.我在i2s芯片(wm8978)后和耳机之间,加了个模拟开关(adg601),用来控制通断,但是,我还想用wm8978做一些声音混合的功能,比如还有一路模拟音频(音乐),通过wm8978,和i2s数据音频(摩尔斯码)做混合输出,作为一个对摩尔斯码的干扰,
由于我开关是加上I2S芯片后的,所以开关断开的时候,音乐信号也会断,这是我不想要的。
我想要的是:音乐是持续播放的。 但是开关又不能加上I2S数据的输入端,这是个难题。
版主有什么好的建议?
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2017-12-8 22:46:50 | 显示全部楼层
你好,我也出现跟你类似的情况,dma一直没法进入中断,想问下你i2s初始化之后是怎么配分频器值的?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 12:02 , Processed in 0.188398 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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