打印

【以青春的名义】[完结,领奖中]音频活动第三期

[复制链接]
4590|63
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 zhanzr21 于 2017-5-24 16:03 编辑

由于四月份编辑有ST峰会的任务, 加上本人两次出差. 音频系列竟然只出了一篇, 活动也是屡屡跳票, 令本来就小众的观众也有散场的趋势. 在此先说声对不起.

找理由永远都能找, 尤其是那些可做可不做的事情, 可看可不看的书, 是否付诸行动还是永远置之高阁, 完全在于自己, 没人指责你倒是更加显得责任重大.

五月四号是青年节, 热血澎拜, 朝气蓬勃的青春, 多么令人怀念. 虽然随着年龄的增长, 我的青春已经无可奈何地渐行渐远.

抗拒衰老的唯一途径就是行动. 以青春的名义!

本期的代言人是汪峰.

现在的年轻人, 不知道还听不听汪峰的歌. 我比较禧欢这首: 飞得很高.
生命就像 一条大河
  时而宁静 时而疯狂
  现实就像 一把枷锁
  把我捆住 无法挣脱
  这谜一样的生活锋利如刀
  一次次将我重伤
  我知道我要的那种幸福
  就在那片更高的天空
  我要飞得更高 飞得更高
  狂风一样舞蹈 挣脱怀抱
  我要飞得更高 飞得更高
  翅膀卷起风暴 心生呼啸
  飞得更高
................................
按照书呆子的理论,汪峰的音乐其实也不是摇滚, 也不是通俗流行, 只是牢牢地抓住了我们这个时代的小知识份子的困惑的心理与矛盾的现实状态. 可以说汪峰是网红时代之前的网红. 作为对比, 水木清华的音乐总是缅怀过去的美好, 对现实采取完全逃避的态度. 周杰伦的音乐呢, 调子美妙, 可惜听多了就是棒棒糖, 对成年男性没有持续的吸引力. 唐朝黑豹这种又太调子暗淡, 设立了更高的精神目标可惜不切实际. 只有汪峰的音乐, 承认了现实的荒谬与残忍, 认[sǒng]之后, 还拥有着爆发的雄心壮志. 崔健的音乐也贴合了时代, 而且比汪峰的音乐艺术性更加高一点. 但是崔健的音乐将时代定格在80年代, 属于无所事事, 毫无人生进取的希望但又没有衣食之忧的城市青年因为理想主义无法企及而只好堕落的自怨自怜.

好像扯的太多了,还是说说这期活动吧.

首先阅读这篇**:
第三篇-嵌入式系统音频基本实践-播放声音之二文中介绍了一种使用PWM+LPF播放音频的例子, 事实上LPF也可以不要.

活动的内容就是:
使用任何你有的一块板子, 不管是正规的开发板子还是从哪里捡来偷来的, 越有创意越好, 利用上述原理播放一段音频. 说简单也简单, 说复杂也复杂. 总之是希望大家理论结合实际. 抄手干起来. [注:汪峰的歌有加分]

做出了实验之后, 将结果以视频或者录音提交, 此外还要提交代码, 最好是整个工程打包以利于我们判定也利于他人学习.
之前的活动的用户成功提交的代码我都传到共享中去. 互联网时代, 来点共享精神!

至于奖励嘛, 虽然大家都不是为这个来的, 不过有点奖励还是有点娱乐性. 上两次的活动, 编辑已经多次鄙夷我了, 说过于寒酸. 所以这次活动的奖励一定会比前几次要高. 但是具体是发放奖品, 还是做板子送大家, 还是直接发现金打赏, 这个还在跟编辑商量, 或许三管齐下也说不定.

深更半夜了, 呵呵, 希望大家踊跃参加, 以青春的名义!
[更新,奖品来了]
凡是成功完成活动内容与提交并得到确认的同学, 可以得到如下奖励:

35W单声道功放模块 大功率低功耗TDA8932

PAM8403功放板

PAM8610数字功放板 2x15W双声道 立体声 D类 大功率功放板 微型
不是三选一,是三个全当奖品发给成功参与的同学!
而且可以肯定的是, 下次活动将再次提高奖励级别, 因为还不知道同学们喜不喜欢发板子这种奖励形式.
截止日期暂定为2017-5-24, 还有很长时间, 感兴趣的同学快来吧!

更新:截止日期原定5-24,但是今天正好有点时间看了各位的上传代码,这次活动参与的热情比上两次要高一点. 看代码就看了好一段时间. 很欣慰每次活动参与人数都有所增加. 虽然是小众人群, 人多一点更好玩嘛.
这里先把成功参与的名单公布一下子, 也把贴子回复解锁, 让大家互相参考.
有些同学的贴子说有bug,有瑕疵的, 暂时也不用太在意. 毕竟人生都是不完美的, 重在参与, 重在实践. 如果有需要一起来解决bug,音效的可以在群中发一下子, 也许有人知道解决的办法, 发扬社区精神.
我就不管了, 只要成功提交代码的我都算成功参与了, 这次因为硬件种类多, 我暂时没法一一验证各位的代码.
先把奖品发给你们, 让你们拿了奖品手软, 不好意思不参与下一次活动!
成功参与名单:
@Ketose
@lansebuluo
@lianqiang
@liweibuct
@shanan a
@WAMCNCN
@yangweiping
@荣丰宇
@abc9981
排名不分先后, 另外今天明天如果还有成功参与的我会更新的.
有几个同学通过QQ给我发过代码参与活动, 不知道有没有后来没有在本帖上传代码而漏掉的,如果有漏掉请在这回复上传一下子代码,我会看到的.多谢!
以上同学请发送自己的收货地址到 board@21ic.com 标题为:音频活动第三期领奖
这期奖品是三个功放板子, 对于下期想要什么奖品也可以在下面回贴@zhanzr21表达一下子.

另外有同学提议集思广益做板子的活动想法,这个我回头跟编辑商量一下子看怎么运作, 核心思想是越多人参与越好, 大家都学到知识,享受DIY的乐趣! 所以你们有好的想法也请回复或者私信我或者编辑.再次感谢!
   

相关帖子

沙发
shanan| | 2017-5-6 09:36 | 只看该作者
本帖最后由 shanan 于 2017-5-13 18:53 编辑

终于看到更新了,我赶紧来占个座。
【2017-5-13更新】
@zhanzr21 活动进行到第三期,前面的内容大概就是临阵磨枪了,那这期看样子是要提枪策马了。这次做点有实用性的东西吧。

硬件设置

硬件继续基于这个不知名的清仓STM32F103RCT6开发板,我需要用到它的SD卡座。它并没有使用SDIO方式连接,仅SPI。由于PA5被SPI占用,DAC2不能被使用,于是仅能实现单声道。其他,还需要用到板子的两个LED和四个按钮。
LY-S3A(STM32)原理图.pdf (31.6 KB)

DAC+LPF+AMP



功放使用8002,AB类BTL输出。为了改善音质,尝试在DAC和AMP之间插入LPF。这里做了一个很简单的LPF,实际效果约等于无,可能是截止频率太高了?


PWM直接驱动喇叭
除了DAC+LPF+AMP组合外,我在这里还测试了PWM输出,这里用了一个74HC04做驱动缓冲,驱动电流能力±25mA,而且这东西烧坏也不心疼。PA8,PB13作为TIM1_CH1的PWM互补输出,因此要使用HC04中两路驱动喇叭。


软件
MDK工程做了三个编译配置,分别是:
定时器中断CPU更新DAC,DMA定时更新DAC和DMA更新PWM。
F32_SD_PLAYER_Shanan_20170513B.rar (1.41 MB)


工程目录如下:

E:.
│  F32_SD_PLAYER.uvguix.Administrator
│  F32_SD_PLAYER.uvoptx
│  F32_SD_PLAYER.uvprojx
│  keilkilll.bat
│  
├─BSP
│      dac.c
│      dac.h
│      dma.c
│      dma.h
│      keyscan.c
│      keyscan.h
│      led.c
│      led.h
│      mmc_sd.c
│      mmc_sd.h
│      pwm.c
│      pwm.h
│      spi.c
│      spi.h
│      timer.c
│      timer.h
│      
├─COMMOM
│      delay.c
│      delay.h
│      malloc.c
│      malloc.h
│      sys.c
│      sys.h
│      usart.c
│      usart.h
│      
├─CORE
│      core_cm3.c
│      core_cm3.h
│      startup_stm32f10x_hd.s
│      startup_stm32f10x_md.s
│      
├─DebugConfig
│      POLLING_STM32F103RC.dbgconf
│      Target_1_STM32F103RB.dbgconf
│      Target_1_STM32F103RC.dbgconf
│      USE_DMA_STM32F103RC.dbgconf
│      USE_PWM_STM32F103RC.dbgconf
│      
├─FATFS
│  └─src
│      │  00history.txt
│      │  00readme.txt
│      │  diskio.c
│      │  diskio.h
│      │  ff.c
│      │  ff.h
│      │  ffconf.h
│      │  integer.h
│      │  
│      └─option
│              cc932.c
│              cc936.c
│              cc949.c
│              cc950.c
│              ccsbcs.c
│              syscall.c
│              unicode.c
│              
├─OUTLIB
│      F32_SD_PLAYER_DAC_DMA.hex
│      F32_SD_PLAYER_POLLING.hex
│      F32_SD_PLAYER_PWM.hex
│      
├─STM32F10x_FWLib
│  ├─inc
│  │      misc.h
│  │      stm32f10x_adc.h
│  │      stm32f10x_bkp.h
│  │      stm32f10x_can.h
│  │      stm32f10x_cec.h
│  │      stm32f10x_crc.h
│  │      stm32f10x_dac.h
│  │      stm32f10x_dbgmcu.h
│  │      stm32f10x_dma.h
│  │      stm32f10x_exti.h
│  │      stm32f10x_flash.h
│  │      stm32f10x_fsmc.h
│  │      stm32f10x_gpio.h
│  │      stm32f10x_i2c.h
│  │      stm32f10x_iwdg.h
│  │      stm32f10x_pwr.h
│  │      stm32f10x_rcc.h
│  │      stm32f10x_rtc.h
│  │      stm32f10x_sdio.h
│  │      stm32f10x_spi.h
│  │      stm32f10x_tim.h
│  │      stm32f10x_usart.h
│  │      stm32f10x_wwdg.h
│  │      
│  └─src
│          misc.c
│          stm32f10x_adc.c
│          stm32f10x_bkp.c
│          stm32f10x_can.c
│          stm32f10x_cec.c
│          stm32f10x_crc.c
│          stm32f10x_dac.c
│          stm32f10x_dbgmcu.c
│          stm32f10x_dma.c
│          stm32f10x_exti.c
│          stm32f10x_flash.c
│          stm32f10x_fsmc.c
│          stm32f10x_gpio.c
│          stm32f10x_i2c.c
│          stm32f10x_iwdg.c
│          stm32f10x_pwr.c
│          stm32f10x_rcc.c
│          stm32f10x_rtc.c
│          stm32f10x_sdio.c
│          stm32f10x_spi.c
│          stm32f10x_tim.c
│          stm32f10x_usart.c
│          stm32f10x_wwdg.c
│         
└─USER
        constdef.h
        extern_var.c
        extern_var.h
        main.c
        mytypedef.h
        stm32f10x.h
        stm32f10x_conf.h
        stm32f10x_it.c
        stm32f10x_it.h
        sysconfig.h
        system_stm32f10x.c
        system_stm32f10x.h


PWM方式定时是利用重复计数器:
TIM_TimeBaseStructure.TIM_Period = 255; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =0; //设置用来作为TIMx时钟频率除数的预分频值 72MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 17; //重复计数器 72000/256/18=15.625KHz
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


这个工程使用了FatFS,支持SD卡的文件操作。在SD卡中存放了16KHz 8位单声道的wav文件,我选取了三首歌:许巍-曾经的你,汪峰-生来彷徨,彩虹乐队-Link。请将以下文件全部拷贝到SD卡中。程序运行时,并不会立刻播放音乐,需要按键触发,并且可以切换这三首音乐。
hello.rar (88 Bytes) Link.rar (3.33 MB) 曾经的你.rar (2.25 MB) 生来彷徨.rar (2.61 MB)

实际效果的录音
录音_定时DAC无LPF.rar (1.53 MB)
录音_定时DAC有LPF.rar (1.53 MB)
录音_DMA-DAC有LPF.rar (1.52 MB)
录音_DMA-DAC无LPF.rar (1.52 MB)
录音_DMA-PWM.rar (1.57 MB)
录音_PWM LPF AMP.rar (1.6 MB)

结论
用定时器中断CPU更新DAC的劣势不再提了,由于我的主程序还有其他任务,导致定时的误差增大了。PWM直接驱动喇叭的效果,可以用纯净来形容。自带DAC的音质不如PWM方式,但是DAC可以通过音频AMP放大音量,而PWM方式虽然可以直接驱动喇叭,但是音量较小,或许是HC04的驱动能力不足。用PWM+LPF+AMP的方式相当于DAC+AMP,音质达不到直接驱动的效果,但效果还是比自带DAC要强。显然,最好还是用音频DAC来实现音频播放器了。


One More Thing,我的GD32F105RC+CS4344方案的板子刚焊好了,可以验证I2S方案了,但留待下次活动了,幸苦了好几个星期,先歇歇。













使用特权

评论回复
评论
zhanzr21 2017-5-22 15:24 回复TA
好的, 回头你把电路图传我,我也弄个程序帮你彻底验证一下子你的电路 
zhanzr21 2017-5-13 01:15 回复TA
哇, 信息量好大, 我得明天白天专门来看看! 
zhanzr21 2017-5-6 12:47 回复TA
好的, 欢迎新朋友, 欢迎回头客! 
板凳
荣丰宇| | 2017-5-6 13:34 | 只看该作者
活动搞起来~

使用特权

评论回复
评论
zhanzr21 2017-5-6 23:56 回复TA
:-) 谢谢! 
地板
WAMCNCN| | 2017-5-6 18:53 | 只看该作者
           参与

使用特权

评论回复
评论
zhanzr21 2017-5-6 23:57 回复TA
:-) 谢谢! 
5
WAMCNCN| | 2017-5-7 09:08 | 只看该作者
本帖最后由 WAMCNCN 于 2017-5-19 19:34 编辑

L496ZG_DAC_DMA.rar (4.64 MB)
飞的更高 fly_higher_8K_8bit_RAW.rar (101.39 KB)

今天没事了,L496的FLASH是1M,所以准备了长一点的代码,结果烧好了后,发现音乐播放不完整。对照源码好多遍,找不到问题

使用特权

评论回复
评论
zhanzr21 2017-5-23 22:46 回复TA
这里是我原来例子搞混了,本来放wav的, 后来放raw数据了, 所以这样写是没问题的, 不好意思 
zhanzr21 2017-5-23 14:20 回复TA
初始化指针应该指向PLAY_HEADER的偏移量,当然如果是循环就无所谓,但有点不自然 
zhanzr21 2017-5-23 14:19 回复TA
/* USER CODE BEGIN 1 */ uint32_t PlaybackPosition = PLAY_BUFF_SIZE + PLAY_HEADER; /* USER CODE END 1 */ 
zhanzr21 2017-5-8 22:45 回复TA
这位同学真是太勤奋了! 赞! 代码等会看! 
6
Harvard| | 2017-5-8 12:39 | 只看该作者
坐等可移植代码

使用特权

评论回复
评论
zhanzr21 2017-5-8 22:45 回复TA
兄弟,我那文章中附带了好几个例子, 都很容易理解移植的, 快来参加活动, 别坐等了, 坐等易老啊! 
7
巧克力娃娃| | 2017-5-8 13:53 | 只看该作者
我先给大家磕个头吧。赔礼道歉

使用特权

评论回复
8
cornrn| | 2017-5-9 08:10 | 只看该作者
两点钟不睡觉吗?

使用特权

评论回复
评论
zhanzr21 2017-5-9 10:45 回复TA
白天有别的事, 这种业余爱好的活动只能熬夜搞! 
9
lianqiang| | 2017-5-9 09:39 | 只看该作者
本帖最后由 lianqiang 于 2017-5-9 09:40 编辑

    前一段时间一直在研究STM32播放MP3,也做了一些实验。这个是我基于STM32F413开发板和PCM5102 DAC芯片,通过SDIO读取MP3文件,利用Helix解码MP3做的mp3播放器,同时也支持WAV播放,并且能够在SPI TFT液晶屏上显示频谱变化——利用STM32 DSP库,并且能够使用红外遥控进行歌曲切换。由于家里没有音响,播放时是用耳机放在手机的麦上播放的。[media=x,500,375][/media]
http://v.youku.com/v_show/id_XMjc1MTk4Mzg3Mg==.html?spm=a2h3j.8428770.3416059.1#paction
工程太大了传到百度网盘,有需要可以看看。

链接:http://pan.baidu.com/s/1kVJVMQj 密码:odm0

使用特权

评论回复
评论
zhanzr21 2017-5-9 11:03 回复TA
好的<多谢牛人捧场. 一定要研究一下子, 不过你能否切合本期节目用PWM做个小例子来参加活动 
10
qqqq77722| | 2017-5-9 13:22 | 只看该作者
截止日期呢?

使用特权

评论回复
评论
zhanzr21 2017-5-9 20:15 回复TA
暂时没有想好截止日期, 大概是半个月一个月吧! 其实什么时候参加都可以, 只是越快越好! 
11
shanan| | 2017-5-15 21:29 | 只看该作者
加码再升级,在74HC04输出加一级推挽输出,组成桥式推挽电路,输出功率大大增强!这个电路的输入是TIM1的PWM互补输出。当然,假如没有互补输出,也可以利用74HC04对信号反相,产生第二路信号。
录音效果如下,感觉对于没有DAC的单片机,并且不需要增加BOM物料型号的情况下,这是很好的音频输出方案!
PWM直接驱动喇叭.rar (3.11 MB)






使用特权

评论回复
评论
zhanzr21 2017-5-16 11:45 回复TA
还是讲错了,非门里面也是管子, 只是分立的三极管可能结电容大一点 
zhanzr21 2017-5-16 02:03 回复TA
说错了,不是线性度的问题,因为是PWM来的,是滤波效果更好,因为PN结有电容 
zhanzr21 2017-5-16 01:53 回复TA
好! 对了非门从本质上起到了一个增强电流输出能力的作用, 你试过用三极管直接做一路共E或者共C电路跟非门比起来怎样, 我想三极管更线性一点 
12
shanan| | 2017-5-16 12:35 | 只看该作者
shanan 发表于 2017-5-15 21:29
加码再升级,在74HC04输出加一级推挽输出,组成桥式推挽电路,输出功率大大增强!这个电路的输入是TIM1的PW ...

它其实就是D类放大器的后半部分,而前半部分的模拟输入调制,则是被预处理为PCM格式的音频数据了。D类放大器的一般结构如下,可见功放管输出的仍然为PWM波,要经过LC滤波器才还原为音频信号。对于上图这种无滤波器的,实际上是喇叭充当了滤波器了。相关说明,百毒搜索关键词:D类功放原理(经典!!)。

S8050/8550的特征频率是150MHz,我这里PWM频率不到300KHz,于是三极管结电容的影响,我想在此是微乎其微的。

使用特权

评论回复
13
liweibuct| | 2017-5-19 00:39 | 只看该作者
这个代码主要的思想还是基于楼主第二期dac输出的思想,控制PWM波的占空比,实现不同幅值电压的输出,按照音乐波形进行输出。主控芯片为stm32f103c8t6,用stm32cubemx生成代码库,主函数如下图所示,主要是进行系统,定时器的初始化,此外这里采用定时器中断控制PWM的输出,所以主程序里添加了定时器PWM使能中断函数。

定时器的初始化函数如下图所示,主要是配置TIM3的中断时间间隔为125us,72MHz/(8+1)/(999+1)=8000Hz(音频采样率),以及PWM的输出方式。


改变PWM输出管脚的电压幅值通过改变定时器控制占空比的寄存器值来实现,定时器每125us产生一次中断,在中断内进行定时器相应寄存器值更改,具体程序如下图所示:

本例中的代码占用空间小于8kb,代码起始地址为0x08000000,为此地址0x8002000之后的flash空间均未使用,音频起始地址为0x8002000,本例中的音频为单声道采样率8k数据位宽8bit的RAW格式文件,截取了6s,总大小48kb。音频地址定义如下图所示:

采用之前楼主说的方法下载进开发板,就可以实现PWM播放音乐了。
附上源程序: PWM音频.zip (507.38 KB)

使用特权

评论回复
评论
zhanzr21 2017-5-19 12:37 回复TA
好! 多谢参与! 
14
Ketose| | 2017-5-19 00:51 | 只看该作者
使用Nucleo--F413ZH开发板,PA4,PA5 双通道DMA输出完成。有立体声的感觉了。
源码: F4_Music.rar (62.47 KB)
音频资源: 汪峰 - 飞得更高.rar (187.58 KB)
音频数据烧写位置:0x08060000
8 Bit 16K sample.

使用特权

评论回复
评论
zhanzr21 2017-5-19 12:37 回复TA
好! 多谢参与! 
15
WAMCNCN| | 2017-5-19 22:43 | 只看该作者
自建的工程出错了 F722_DAC_DMA.rar (4.43 MB)

使用特权

评论回复
16
Ketose| | 2017-5-21 12:12 | 只看该作者
本帖最后由 Ketose 于 2017-5-21 12:16 编辑

PWD_DAC,这次实验使用STM32F47ZET6,原子的探索者开发板。实验原理图如下

源码: f407_pwm_dac.rar (580.57 KB)
音频资源: 8bit8K.rar (155.86 KB) 为了加分还是使用 《飞得更高》
烧写位置:0x08010000

视频:

对于如何计算RC的值还不太懂。只知道这个电路对8位,8K的采样效果还可以。用这个电路试过16Bit 16K采样的音频数据,效果简直不能容忍。。。

使用特权

评论回复
评论
zhanzr21 2017-5-21 13:32 回复TA
再用Spice仿真验证的,当然实际跟计算的值还是不能完全匹配,因为寄生参数的影响 
zhanzr21 2017-5-21 13:31 回复TA
https://www.infineon.com/dgdl/Infineon-ApplicationNote_Pseudo_Digital-to-Analog_Converter(DAC)_with_XMC1000.pdf-AN-v01_00-EN.pdf?fileId=5546d462518ffd85015255254e9c1fd3 
zhanzr21 2017-5-21 13:31 回复TA
好的,怎么计算RC我是用这个文档的说明 
17
荣丰宇| | 2017-5-21 19:50 | 只看该作者
实验条件有限,这次也是学习一下DMA+DAC+TIM的使用
主要还是用上了楼主的代码,精简了实验需要的外设,选了汪峰的 怒放的生命,aiff格式,后缀改成bin,烧进了stm32,
我对楼主用到的 制作Keil FLM插件的方法也比较感兴趣的哈~

支持下楼主的活动~
audio_dma.zip (843.67 KB)

使用特权

评论回复
评论
zhanzr21 2017-5-23 14:32 回复TA
好的,多谢,等有时间我专门把写Keil FLM插件, IAR, Jlink, STLink作为主题写一下子, 这几期音频内容积压较多,还顾不上这个 
18
shanan| | 2017-5-21 21:17 | 只看该作者
本帖最后由 shanan 于 2017-5-21 21:19 编辑

实践 I2S DAC
先上图镇楼。这是我设计的GD32F105RC+CS4344的音频播放开发板。关于这个板子缘由,见后文。


硬件配置:
数字核心板:GD32F105RCT6,TF卡座,W25Q64 SPI Flash,MicroUSB座,锂电池充电,RGB LED,光敏电阻等;
音频IO板:CS4344,MAX9812L麦克风放大器(未焊),HT82V735耳机放大器,UART1接口,SW调试接口,4个按键,3.5mm耳机插座,音响用09型双联电位器等;



电路图:
SCH_MainV2.pdf (215.54 KB)
SCH_MixV2.pdf (140.47 KB)
电路有Bug,仅供参考。

工程代码:
ZeroOneF32Player_shanan_20170521.rar (1021.66 KB)
│  keilkilll.bat
│  tree.txt
│  ZeroOneF32PLAYER.uvguix.Administrator
│  ZeroOneF32PLAYER.uvoptx
│  ZeroOneF32PLAYER.uvprojx
│  
├─BSP
│      CS4344.c
│      CS4344.h
│      dma.c
│      dma.h
│      flash.c
│      flash.h
│      iodef.c
│      iodef.h
│      keyscan.c
│      keyscan.h
│      led.c
│      led.h
│      mmc_sd.c
│      mmc_sd.h
│      pwm.c
│      pwm.h
│      spi.c
│      spi.h
│      timer.c
│      timer.h
│      
├─COMMOM
│      delay.c
│      delay.h
│      malloc.c
│      malloc.h
│      sys.c
│      sys.h
│      usart.c
│      usart.h
│      
├─CORE
│      core_cm3.c
│      core_cm3.h
│      startup_stm32f10x_cl.s
│      startup_stm32f10x_hd.s
│      
├─DebugConfig
│      Player_STM32F105RC.dbgconf
│      TestHW_STM32F105RC.dbgconf
│      
├─DOC
├─FATFS
│  └─src
│      │  00history.txt
│      │  00readme.txt
│      │  diskio.c
│      │  diskio.h
│      │  ff.c
│      │  ff.h
│      │  ffconf.h
│      │  integer.h
│      │  
│      └─option
│              cc932.c
│              cc936.c
│              cc949.c
│              cc950.c
│              ccsbcs.c
│              syscall.c
│              unicode.c
│              
├─OUTLIB
│      Player.hex
│      TestHW.hex
│      
├─STM32F10x_FWLib
│  ├─inc
│  │      misc.h
│  │      stm32f10x_adc.h
│  │      stm32f10x_bkp.h
│  │      stm32f10x_can.h
│  │      stm32f10x_cec.h
│  │      stm32f10x_crc.h
│  │      stm32f10x_dac.h
│  │      stm32f10x_dbgmcu.h
│  │      stm32f10x_dma.h
│  │      stm32f10x_exti.h
│  │      stm32f10x_flash.h
│  │      stm32f10x_fsmc.h
│  │      stm32f10x_gpio.h
│  │      stm32f10x_i2c.h
│  │      stm32f10x_iwdg.h
│  │      stm32f10x_pwr.h
│  │      stm32f10x_rcc.h
│  │      stm32f10x_rtc.h
│  │      stm32f10x_sdio.h
│  │      stm32f10x_spi.h
│  │      stm32f10x_tim.h
│  │      stm32f10x_usart.h
│  │      stm32f10x_wwdg.h
│  │      
│  └─src
│          misc.c
│          stm32f10x_adc.c
│          stm32f10x_bkp.c
│          stm32f10x_can.c
│          stm32f10x_cec.c
│          stm32f10x_crc.c
│          stm32f10x_dac.c
│          stm32f10x_dbgmcu.c
│          stm32f10x_dma.c
│          stm32f10x_exti.c
│          stm32f10x_flash.c
│          stm32f10x_fsmc.c
│          stm32f10x_gpio.c
│          stm32f10x_i2c.c
│          stm32f10x_iwdg.c
│          stm32f10x_pwr.c
│          stm32f10x_rcc.c
│          stm32f10x_rtc.c
│          stm32f10x_sdio.c
│          stm32f10x_spi.c
│          stm32f10x_tim.c
│          stm32f10x_usart.c
│          stm32f10x_wwdg.c
│         
└─USER
        constdef.h
        extern_var.c
        extern_var.h
        main.c
        mytypedef.h
        stm32f10x.h
        stm32f10x_conf.h
        stm32f10x_it.c
        stm32f10x_it.h
        sysconfig.h
        system_stm32f10x.c
        system_stm32f10x.h
        TestHW.c

实际效果:
录音_I2S效果.rar (1.81 MB)
同步更新缓冲的噗噗声.rar (167.95 KB)
效果是要优于前面两种:内置DAC和PWM输出,但我这里出了点意外,总有固定间隔出现的噗噗声底噪,间隔频率同缓冲区刷新频率,我只要改变缓冲区大小,噗噗声每次的间隔就会随之改变,目前我还找不到问题,等高人指点。我已经将读SD卡部分改为DMA模式,用System tick timer,SysTick测量FatFS读取数据耗时,串口输出的记录如下。缓冲区大小为32768 Bytes(GD32F105是 96K RAM!),音频文件是8K采样16b立体声,缓冲时间32768/(2*2*8000)=1.024s,因为是双缓冲操作,再减半,即0.512s。如下所示,从SD卡读取到缓冲区的耗时仅为0.009s。到这里,问题还是没找到。我还尝试了不使用文件系统,直接从外置SPI Flash中读取音频数据,然后噗噗声是消失了,但取而代之是电流声……
检测到SD卡正常运行
挂载SD卡成功
hello world!

Escaple time is 0.018422

Escaple time is 0.009113

Escaple time is 0.009111

Escaple time is 0.009103

Escaple time is 0.009139

Escaple time is 0.009581

Escaple time is 0.009146

Escaple time is 0.009095

Escaple time is 0.009098

Escaple time is 0.009493

Escaple time is 0.009108

Escaple time is 0.009086

Escaple time is 0.009099

Escaple time is 0.009079

Escaple time is 0.009128

Escaple time is 0.009126

Escaple time is 0.009148

Escaple time is 0.009114

Escaple time is 0.009145


SD卡内容:
hello.rar (88 Bytes)
生来彷徨8k16bst.rar (3.67 MB)
WAV文件有点大,所以这里只截取了2分钟,程序是支持三首音乐的,但现在只放一首好了。再说一遍,文件是用Audacity编辑,文件头是WAV(Microsoft)编码Signed 16-bit PCM。


======================================================================================================================================
后记
还记得自己的第一台MP3播放器是魅族ME V6,也用过其他MP3,而这些MP3最后结局都是突然丢固件,重新刷机又好一段时间。魅族多年不做MP3了,现在MP3格式快要淘汰了,而我现在却开始做一台MP3。做MP3想法是很早萌生的,从那时起到最近以前,方案也只限于8位机 + VS1003。直到最近,我在21ic遇到这个活动,又重新燃起执念。这次,要用32位单片机+I2S DAC来实现。

使用特权

评论回复
评论
zhanzr21 2017-5-22 15:25 回复TA
看到电路图,我届时也写个测试程序帮你测试一下子电路 
19
yangweiping| | 2017-5-22 20:16 | 只看该作者
本帖最后由 yangweiping 于 2017-5-22 20:18 编辑

使用的开发板是淘宝买一块STM32F103ZET6的,音频是使用活动百度网盘中的一段音频文件 8k8bit_mono_raw_sample.bin,首先将bin文件转换成8k采样8bit HEX数据存储到芯片的ROM内。通过8k频率的PWM输出。PWM输出的占空比为存储的数据data/oxFF。输出的音频和杂,有很多的尖峰脉冲,需要外部滤波。音频是一段《隔世情》。。。工程代码:
PWM音频输出.rar (3.75 MB)
视频:http://v.youku.com/v_show/id_XMjc3OTY4MjgxMg==.html?spm=a2h3j.8428770.3416059.1



使用特权

评论回复
评论
zhanzr21 2017-5-23 14:44 回复TA
另外 count = (u16)(v[i++]*17.57); 你试过调整这个倍数过没有, 调小点是否噪音小一点 
zhanzr21 2017-5-23 14:44 回复TA
好的, 重在参与, PWM输出等我解锁贴子回复了,可以看看本帖shanan坛友的实验,他做的效果不错 
20
lansebuluo| | 2017-5-22 20:39 | 只看该作者
本帖最后由 lansebuluo 于 2017-5-22 21:27 编辑

Piccolo F2806x controlSTICK

新录音 1.rar (142.31 KB)
v130.rar (479.29 KB)
二、Nucleo_F413ZH

新录音 2.rar (207.51 KB)
Nucleo_F413ZH_Prj.rar (2.95 MB)

使用特权

评论回复
评论
zhanzr21 2017-5-23 14:46 回复TA
好,谢谢参与, TIM3->CCR2 = 1814 - Voice[VoiceCnt] * 0.027679443359375; 这个值不知怎么计算的 
zhanzr21 2017-5-22 21:10 回复TA
谢谢参与, 代码明天统一看. 扬声器后面个尾巴是什么,磁铁吗? 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:每天都進步

91

主题

1013

帖子

34

粉丝