以前说过要写个带歌词显示的mp3,但是一直没有时间。前一阵子抽4个晚上写出来了,后来又陆续做了改进,现在正式出炉了! 4 D5 o& I- r- d, _) o6 w5 x7 `6 l2 ?8 v* w- M$ n) S, j% ]9 C
硬件环境: 9 a0 x5 B3 t+ a C4 x9 x' o7 R
是网站的mp3板,还是去年卖的缺陷板,当时是这个板第一次做板,但是有点小错误。当时我仔细看了看问题不大就购了一块。虽然贴了个标签说不可以用作mp3用途,但是我还是做了。 ! r) ?. \( T# t' [ D+ ^6 p 这个板的问题就是ch375的接线搞成5v版本的了,还有ch375的晶振离芯片太远,并且离数据线太近,这会导致ch375工作不稳 定。后来我通过改变晶振端的电容来稳定起工作。还有就是AVCC没有接VCC,还有个小毛病是232的RXD中少串了个电阻,直接接会导致无法isp下 载。 ! Z9 i3 Z, J3 T1 J0 o! L! O , A5 f6 }/ J6 C9 v1 u% s# T 板子回来东西也是过了很久一个一个焊上去的,3310是从ppa2001那转让来的(在此表示感谢,他顺便还送了我很多PCB板)。最近从armok这里弄了些零件才算弄完整了。 + _! ~7 c; d5 P
- { C( k- L% v2 ]/ m
软件平台: 7 z, }8 w1 I( B+ D" ~
AVRSTudio4.13 + WinAVR20070525 4 _9 H! \; ?3 g 4 K0 q) F l' m9 x 到了公司用起了source insight才觉得AVRSTudio的编辑器太滥了,所以我是用source insight编辑代码,直接命令行敲命令make,用avrdude + jtagice下载代码 8 e9 O9 a; g3 L9 E1 s( |" p1 }, {5 D) L
. B: O& F4 l7 | X" S k3 X
功能描述: 2 E$ Y: M. w6 f( Q9 A 程序包含两部分bootloader+application . w2 [8 V6 ~' { 7 r* z d+ C; M) Q bootloader是前一阵子在坛子里搜到的stk500的bootloader,我对它作了修改,以和我的程序匹配。 ' J( G; f, v+ m: {: {5 |2 R
9 {- c. @2 E2 J, \% W/ T6 a. c9 m
bootloader需要配置成2Kbytes的,可以复位按住start/puse,或者在主程序中按VOL+建,另外复位后10秒如果没有操作则自动进入bootloader * q8 B' ?$ `2 l" W, }; N
% s5 ^: r" w. u( a 3 m" N @1 \( W4 x9 a5 L) u8 | application部分完成的就是mp3的播放功能: , L7 J4 Y$ n* a4 \9 V4 q
+ g9 _* x4 T6 @; o: Z& c& j 5个按键,功能上我只对start/pause作了修改,这个按键是用作模式选择的,可以选择单曲重复,全曲重复,随几播放(shuffle) ( }! f. ?+ K: d: E7 q. b mp3文件可以存放在任意目录,但是总的文件夹数目受到限制(目前代码限制136个)。也可以采用以前的惯用方法,把文件放在特定目录下,这个需要修改程序fat.h文件中的一个宏定义FIX_DIRECTORY。 8 J# I+ Q8 L" w) a L! {5 y9 M4 L
歌词文件可以存放在歌曲所在的目录和一个默认目录下,代码中是\\lrc 即根目录下的lrc文件夹下。 . f+ }' Q; H3 H; U" |5 |; b; ^) @ P2 t0 \- s' o( c/ n3 B1 S
程序对歌词提供了完整的支持,支持标准的lrc文件规范。[XX:XX]&[XX:XX.XXX],可以多个时间tag共用一句歌词。 ; U% A0 ~4 h6 \7 x {
程序处理歌词的方法是,根据mp3文件的文件名(短/或长文件名)去寻找lrc后缀的文件。注意:文件名采用前段匹配的方式,即只要歌词文件前面 的和音乐文件匹配即可。如:细说往事.mp3 和 细说往事-南方二重唱.lrc是可以对应起来的。另外对于文件名中的大小写是区分的,如 may it be.mp3 和May it be.lrc是对应不起来的。 ' _" h( t- F$ ?% X; B - [ t N! g* D 找到歌词文件后程序会对其解析,然后对所有数据进行排序。将结果存到ram或eeprom中。程序中使用静态单向链表来描述各个时间 tag,真正的歌词数据则放到一个数组里。目前这数组在内部ram中试640字节,eeprom中有1500字节。程序优先使用ram如果ram放步下则 会存到eeprom中。eeprom剩下的空间用于存放文件夹的信息,用于支持文件的任意存放。 , I, [ v- C. v1 m4 ~7 u4 E
" @" K. L- x$ Y! j+ z; d' g2 o# a 由于部分歌词会存放到eeprom中,eeprom的操作很慢,所以歌词推荐那种使用多个tag公用一个歌词的形式,[xx:xx][yy:yy]XXXX 。当然不是这种也支持了。像这种歌词: # k Z8 `7 \) C( `7 ]- ^# m/ |
/ ~4 D G0 w8 e3 L0 N2 k/ [3 L[ti: Bohemian Rhapsody (Mercury)] 5 d5 x1 ^ H+ W7 B8 S/ S) {
[arueen] 0 s4 {6 o K' b! M7 F) v
[al:A Night At The Opera (c)1975] 8 A; I3 `' R1 r+ C
! Q3 i, ^4 E8 C
[00:01]Is this the real life 1 R! ^$ `4 @7 ]7 b1 U7 U
[00:04]Is this just fantasy * ^. }& ~; Y3 e) j; d. h% v
[00:07]Caught in a landslide / g0 N/ p; X0 b' y2 o, r[00:10]No escape from reality 2 V+ R4 j: t: y: O0 r
[00:15]Open your eyes 1 G' p/ _0 N) U/ ~1 v0 a[00:18]Look up to the skies and see / B! G+ l" m# N/ k/ A/ R# A6 v
[00:25]I'm just a poor boy, I need no sympathy " q) h( o2 H- c[00:31]Because I'm easy come, easy go, , B5 K1 V+ s+ s) m+ S, a
[00:35]little high, little low, 2 ^8 `6 T" @ h2 I[00:38]Anyway the wind blows, doesn't really matter to me, " p) s, v. ~2 `: @0 j[00:48]- to me -, 6 J$ L5 C+ E* h* f8 p; B: P6 K0 g( I * Q& {6 m/ D, ^6 M[00:55]Mama, just killed a man, 0 i& x0 Z$ N3 M& H
[01:01]Put a gun against his head, ) X; _/ H4 J- f2 c* G[01:05]Pulled my trigger, now he's dead, F! z* G+ x( J- Y# L1 o$ M[01:09]Mama, life had just begun, / o& y) Z% b& O/ c8 p[01:15]But now I've gone and thrown it all away 7 s K& H9 D, N1 i& K' ?[01:22]Mama, ooo, % t v2 G, a3 a5 R/ h+ y, \6 k5 N1 m6 U; x[01:29]Didn't mean to make you cry , N! v; F3 T* n0 f5 n8 ~3 d
[01:32]If I'm not back again this time tomorrow ! l# _0 H, X7 U8 u# g- j, E[01:37]Carry on, carry on, as if nothing really matters 0 P1 B+ s9 [6 f8 R0 c
6 r0 Z* Z) H, ^/ c[01:54]Too late, my time has come, ! q( q, Q( Y( y4 s; x- ^[02:01]Sends shivers down my spine, ?4 \* q* n3 k7 {3 X5 O
[02:04]Body's aching all the time, ; S5 q4 O6 i! E; _8 Y. n# S5 N
[02:08]Goodbye everybody - I've got to go 8 z; x, [: H( D( j[02:14]Gotta leave you all behind and face the truth * X! j# B) g3 o& {# }
[02:21]Mama, ooo ; J2 G+ t* \$ ]% x$ ?* ^: f0 m2 |[02:28]I don't want to die, 1 g8 M( l4 K! l% U+ {
[02:31]I sometimes wish I'd never been born at all 6 `0 I3 R T$ F9 Q) W& R
. u6 i* h7 ]& R/ G' B' P
[03:05]I see a little silhouetto of a man, * }% ]( C! Y L9 }- n }4 Q8 C[03:08]Scaramouche, scaramouche will you do the Fandango 6 X4 C9 j) B. Y @[03:11]Thunderbolt and lightning - very very frightening me # J* P5 ^& P6 h* t$ F[03:16]Galileo, Galileo, " v) H" b) T9 d- e
[03:17]Galileo, Galileo 3 @$ D! x9 P0 ]$ r" P ~
[03:19]Galileo figaro - Magnifico . o- s8 ^0 C) |4 k. h9 T( i2 r7 K
[03:22]I'm just a poor boy and nobody loves me , L* S6 _2 l4 O- z" \) v[03:25]He's just a poor boy from a poor family + z( T+ w% \ O8 |( K[03:29]Spare him his life from this monstrosity , ?0 I: B# H0 A7 h' Z[03:33]Easy come easy go -, will you let me go : O4 r* Y3 q+ ` V7 K
[03:36]Bismillah! No -, we will not let you go - let him go 5 v& s5 o2 q+ M- S, k[03:40]Bismillah! We will not let you go - let him go ! R, r2 X, e. {; S2 k+ L[03:43]Bismillah! We will not let you go - let me go 3 G W4 W- N. |" R% M[03:46]Will not let you go - let me go $ H7 S* t& O3 K[03:48]Will not let you go - let me go " k4 {1 d9 H& ?4 F* ?5 [8 k5 K* z- u[03:50]No, no, no, no, no, no, no ( J6 W; @! E* C0 U5 B[03:53]Mama mia, mama mia, mama mia let me go * n; t8 z# _+ D9 H7 y, }/ {[03:56]Beelzebub has a devil put aside for me, for me $ r/ i Y: @1 Z( J' D$ [
[04:03]for me - 7 J& ]( F( y5 Z+ ?4 e8 c# u/ \+ [9 N w: }2 K! D4 g+ n5 `+ ~2 q. e% m
[04:14]So you think you can stone me and spit in my eye ) p6 g4 z/ w& f9 ^# P9 z2 q[04:20]So you think you can love me and leave me to die 5 r G K: @1 g
[04:25]Oh Baby - Can't do this to me baby - 1 W8 a2 g. n P5 y7 D& L; |( \8 I
[04:32]Just gotta get out - just gotta get right outta here 4 }- K) V" C( r9 C% n% a
5 m% ]! {& N1 }3 Q[05:10]Nothing really matters, ' _! |4 { C/ c9 s& ^1 r
[05:14]Anyone can see, & H. h& o `' C0 H( y J3 l
[05:18]Nothing really matters -, nothing really matters to me 8 T$ Z" p& I e4 v2 \) C( _6 g% e3 F0 g- s6 [# k& X
[05:40]Any way the wind blows... 6 b/ q7 e5 E6 v2 r& D# S4 g/ a" {
+ ~! M% q7 Q, K- z: J$ N这样程序至少要花10秒钟才能把多余的数据存到eeprom中 " y9 H+ ?' \+ u( k+ n9 J. n' F / A5 E) T3 m6 ?% R! m. n2 s& q7 u像这种: 0 \) l4 u( P; p8 F8 E' m[ti:细说往事] W5 X3 m3 Q9 L/ v9 [+ q* T; m[ar:南方二重唱] / s# c: _6 ]! O! s) h" G2 e) j[al:细说往事] 8 B6 I- O- a1 z+ b/ Q
[by:炫网资讯 Liuxuan.com] / b8 Q& r# k) V
[00:00.00]细说往事 - 南方二重唱 " D) [9 r1 o0 h% K1 V; E[00:09.56]词/曲:李子恒 5 W' O: m9 F" M7 X$ H- t* b& e' l) J[00:12.24] ; w0 o. D) T; l7 ~. V6 [1 f! y( F[02:55.60][00:14.89]蓝蓝的天 # R; {9 A1 n& t8 U1 \, K% q[02:58.17][00:17.31]往事一缕轻烟飘过你的眼廉 8 D9 D3 |. |; L( w, ?( L! G% K[03:05.12][00:23.89]沉默的眼 0 ?0 @/ r( I5 w[03:07.19][00:25.75]请回答我还爱不爱我的从前 , {; @0 [ C7 u; @2 e3 G) N[03:13.56][00:32.82]我的从前 ! K# s0 G+ j) V[03:16.06][00:35.03]有你陪伴的梦和一张疼爱的脸 " c2 \- x! D9 | A
[03:22.80][00:41.49]如今细说往事 3 x5 L' _- p& N/ D2 L5 ?, m[03:25.05][00:43.95]往事如烟 & [! L+ Y. s2 t3 O F[03:26.61][00:45.65]我是否还算是你的誓言 * z3 b( o; A/ o" [% y& P
[03:30.60][00:49.97] ( h5 q" E R+ }. O! b1 G[04:09.91][02:04.40][00:50.93]白云翩翩 0 X4 n! g i" f) C8 z! E) d3 m[04:11.78][02:06.32][00:52.83]心事一面银幕飘过你的窗前 5 ]: x4 j; y/ x o2 Q[04:18.63][02:13.12][00:59.79]寂寞的窗 & w2 ^( y% c. p R
[04:20.53][02:15.07][01:01.45]请开启我被岁月紧锁的思念 7 ?. o; K+ f( V7 ?2 `' L[04:27.54][02:22.02][01:08.45]我的思念 # d0 e W' ?; x+ X
[04:29.58][02:24.00][01:10.63]有你牵挂的心和一首叫做誓言 8 T3 t: \6 F c {& N6 d0 C1 s
[04:36.30][02:30.59][01:16.91]如今细说往事 / I; E* a- S H$ e5 `2 O. a[04:38.48][02:32.97][01:19.50]往事如烟 , z0 z" I0 A6 @# B/ ~) U
[04:40.13][02:34.51][01:21.09]我是否还算是你的从前 % O; L4 N7 q) [[04:46.16][02:39.20][01:26.58] 1 o" W- K* U2 c' `& @
[03:34.05][01:28.01]往事从头 ' }6 q# E) v$ E4 j9 N W
[03:35.59][01:30.17]轻轻细说梦的演变 1 `4 k8 o! ]8 I+ `0 q
[03:42.30][01:36.95]多年以后 * B6 O; |. t% ]4 \[03:44.56][01:39.04]是否还有爱的容颜 . l" f) ~ t4 k R
[03:51.42][01:45.93]往事从头 ! d& m R6 b5 H, r[03:53.52][01:47.97]轻轻细说沧海桑田 ( {: t8 B1 C# a( y5 R( ^6 D. ][04:00.20][01:54.65]是否能够 ! x3 ?3 z& f% z- C
[04:02.40][01:56.87]回到从前再走一遍 / ]/ X5 J# A+ M) X' R% Z g: \4 y
[04:08.67][02:02.68] % q5 G8 Z) o6 ^ n' W
, u# H$ v5 L5 @ o
就比较好了,用不着eeprom了。 " Y9 l+ T: N2 F1 @ L
程序不仅在LCD上显示信息在串口也会show一些, ; n8 r4 K# u9 N6 b: K 9 `' Z, h9 k* ~
+ X/ d" ?! Y: m% C# P8 R
说说字库文件: n% N2 S) c$ n+ D. ? 总共有四个文件:st12.sys,st16.sys,gbk2uni.sys,uni2gbk。其中st12/16是12*12 和16*16点阵字库。其余两个为gbk和unicode互转的文件。 3 @4 B+ }% o0 ?- G; u0 z( D其中st16和gbk2uin.sys没有用到,但是我程序中没有去掉,如果想去调请在程序中改,在LCD_GBK.c文件的初始化中改。 - M/ D" T7 G1 f v5 M
字库是GBK字库,不是GB2312,所以支持很多汉字,总共两万多个,所以再生僻的都可以正常显示,如下面的繁体: 4 ?9 q6 P+ _# ] ` X 5 H9 `5 P: }5 U/ N: C; \- I) g[ti:失恋阵线联盟] ; {! d1 O3 f5 v* v5 f4 G
[ar:草蜢] @! n" g$ D# s4 J$ ]% v7 Y
[al:] + N6 u. R- I8 n& w6 Q[by:ZJM] 0 k5 N+ s3 Z0 S2 ?4 J n, `. q1 ?
[00:00]失戀陣線聯盟 ' W/ \/ L7 A% A$ i[00:10]演唱:草蜢 ; L7 q/ X: V- l" H$ f; k* n
; G, \6 f- Y4 b5 i
[00:14] 4 e/ g/ T* h( {4 q
[01:43][00:16]她總是只留下電話號碼 + R5 U& q3 q2 k7 x& ~
[01:47][00:19]從不肯讓我送她回家 2 {8 Y6 `) S2 x8 B: p% g
[01:50][00:23]聽說你也曾經愛上過她 ) ~; x* }% q3 s* L2 E" i[01:54][00:26]曾經也同樣無法自拔 ) ^8 m7 l- ?, H, ?' D
[01:57][00:30]你說你學不會假裝瀟洒 # c8 G7 Y/ o6 F& r, Z0 w) j: A[02:01][00:34]卻教我別太早放棄她 8 y/ D' ~, w: g% F9 ]5 K( P( p[02:05][00:37]把過去全說成一段神話 $ l1 \7 H, i/ P' o
[02:08][00:41]然後笑彼此一樣的傻 - ~0 f; V* j W* E) n[02:12][00:45]我們這麼在乎她卻被她全不抹煞 1 [- z/ M' d- T5 o0 M3 F% l
[02:16][00:48]越疼她越傷心永遠得不到回答 # n1 `3 h) r% L$ w& K1 L2 c[02:19][00:52]到底她怎麼想應該繼續猜測嗎 q3 ]9 C U8 }0 j5 ?0 `[02:23][00:56]還是說好全忘了吧 9 g3 Z( _3 e' e. O[02:27][00:59]找一個承認失戀的方法 : V. C$ S( i7 D% c
[02:30][01:03]讓心情好好的放個假 4 y$ U4 A6 m6 x[02:34][01:06]當你我不小心又想起她 + ^; `# M+ W ]- l0 a) H
[02:45][02:41][02:37][01:10]就在記憶裡畫一個"X" ' Q7 |9 s! X. g# {
[01:14](Music) $ {. n$ _' N4 F$ g, E) ?7 ^
8 M4 l9 w' ~, M% L
5 U/ K' N6 ?# j6 b( q! \6 b ; F" _$ f/ U+ l% F' b$ y
6 O5 q0 v" [& f8 y9 _, V
, P, V; R2 X; z1 a+ D
( L8 B3 B: ^8 O( G6 ~
1 Z* f' x( _+ Y; m/ q: r" z
回复:DIY STM32之MP3素材整理
回复:DIY STM32之MP3素材整理
于成功了!经过两个多月的业余时间的努力,我自己制作的MP3 ( y9 H( D7 H g& ?
随身听终于完成了。a方案是tmega8+vs1011,典型的单片机+解码芯片
由于自己有一个256MB的SD卡,所以我的 3 K W% u' K$ | i+ i* T
4 Q. O O$ j& r! `
MP3是插SD卡的,这样省了不少成本,反正我的数码相机又不
是经常使用,闲着也是闲着。大概成本算下来,自己做这样一个M
P3大概才要120左右,不过最大的乐趣还是来自DIY的乐趣^-^ # U9 w5 }3 l/ N t
8 }9 J9 ]' y2 C5 C& N
采用的方案是单片机+DSP解码芯片,音质非常好,绝对比普通的MP3 ( Y, G3 |" D, k3 g
要好。
mega8 mp3 player
vs1003手册上说可以解码吗mp3 wma和midi格式的音乐。 " h$ j! u; b" O3 R) T
试验发现播放wma音乐可以像播放mp3那样播放,只要把wma文件数据送给vs1003就可直接播放。 ! |1 G4 o3 {: V' @' O0 v$ F
刚开始在从正在播放的wma音乐转入下一首音乐会出现不能播放的问题。 8 ^) T1 R5 p/ S# I$ y7 W- c
wma格式不像mp3格式那样容易播放,因此不能播放的原因是其不能正确结束当前播放的数据帧。
后来查datasheet发现可以通过设置SCI_MODE的SM_OUTOFWAV位来结束wma的播放。
! n. c4 m: `/ a& O" e& n
由于我的程序没有判断当前播放的音乐是什么类型音乐的程序。所以我有找了个变通的方法,
就是复位。
我用的是软件复位,通过设置SCI_MODE的SM_RESET位来实现。 - L, X, u2 l; }" g- Z
即在播放每一首歌前复位一下vs1003就可解决wma歌曲的切换。
按手册上的要求复位前最好向VS1003填充2048个0 且这些数据要根据DREQ引脚的请求送给芯片。 9 S# N {: {& q% r
另外复位后还要延时约1.35ms芯片才能恢复到先前的工作频率。 + T: z( y2 P; \5 X
接下来就可以发送你的mp3或wma数据了。 $ u& M: O3 A( e# x# w
9 n2 c5 l# R5 D1 J4 l
不过这种方法只能整首的播放wma音乐,不能快进。如要快进VLSI网站上有示例代码。 % E7 _6 h3 w2 _3 l- M) p5 d1 C
现在我的mp3可以播放mp3和wma两种格式的音乐了,至于midi有空再研究。 , F5 D7 K- g3 _: g+ Y( A
& G& D$ \" [* w( }* {+ ^( x1 ^
不知阿永第三版的mp3板是否支持wma,如果没有可以考虑把它加上去,不复杂的,只要按我上面的方法就可。 ) o, l5 i. R- Y
今天早上我又把vs1003的midi功能做出来了。 4 ]% s$ ^+ Z" `7 U
7 d, Y0 S" W6 ~0 e O
不过在播放midi之前要把SMF1格式的midi转成SMF0格式的midi文件。
在应用手册上的网址http://www.gnmidi.com/下载转换程序GN1:0转换。
将转换后的文件拷到sd卡中按播放mp3及wma的方式播放即可。 5 X5 O6 I1 i, x: x% N" V
但要注意在从正在播放的midi曲子跳出来,在复位前就不要填充2048个零了 ; H: s* q: A: c
如果填充了将会花很长时间才能进入下一首歌的播放,因为midi需要的数据量很小。
同样如果按暂停键,你也会等一段时间让vs1003把内部已有的数据处理完。
播放出来的音乐没有在电脑上播放的效果好,类似于手机上的midi音乐。
我做的播放器的图片(在通用板上手工焊的)
另外一个问题:
当midi正常播放至结束时,不能按照判断数据是否送完为标准来判断歌曲是否放完。 + v6 N& T& N( r% ~
在播放mp3和wma格式时用这种方法,由于损失的时间很短所以听不出来。
而在放midi时,虽然你的数据送完了,但是由于vs1003内还有2048字节的数据还没解码完。 0 a6 ^, d4 s6 c1 }1 J) H$ n3 `
所以这时跳到下一首歌必然引起一段音乐无法播放完。 * l2 ]% D$ ?8 |" b0 c
因此在送完所有数据后还要填充2048个数据,我用的是2048个零,才能恰好使midi音乐播放完,其实在播放mp3和wma时也要做同样的处理才对。 ) h3 b) a5 |. ?( @+ E
上传一下我写的程序
里面包含了SD卡的驱动,完整的FAT16操作程序,及VS1003的程序。 9 f7 F5 x" N' G8 ?1 S% {
整个程序花了我半个月时间。 $ T6 s4 _$ y8 M
其中SD卡驱动只包含了初始化,读一扇区,写一扇区的功能。 / g [' @4 @+ k$ a8 W
FAT16部分 ( F9 n) s( R9 E) T3 C1 C5 c
本来是针对我的毕业设计做的,现在顺便做了个mp3,所以其中有好多函数是不须要的。
但是有需要做文件系统的可以参考一下。 6 a7 c' A% X( Q( h$ o
这部分含有,创建文件,删除文件,创建目录,删除目录,重命名,打开文件,写文件,显示目录内容等。另外为了配合mp3的操作多添加了几个函数。
但是写文件部分做的不完善。不支持长文件名的创建。 4 ^% H! f+ s7 G, g6 C
3 Z# m1 Y3 |9 W% ~1 z1 P
在主程序中放置了播放mp3的操作,同时注释掉了一些关于文件系统的函数。 + f- H" ]! y/ z, Z4 Q. s& `
如果把mp3的播放函数去掉,把原来的文件系统函数加上,可以直接使用。
5 _% d2 H: Q' u1 y) A8 O3 h: G8 _
显示用串口调试工具显示,播放mp3时会显示文件名的短文件名项,初始化的时候会显示初始化信息。 - `1 i; Q- _8 d) P( U e1 j) {
在用作fat16操作时可以像普通dos 操作一样。
比如显示根目录内容可以输入dir \ : X7 e! {6 S1 A0 A
具体信息可通过输入help查看帮助。
! B' m+ s5 @9 }1 S% R
关于这个mp3的原理图我就不画了 3 G9 M9 ~5 O! s; O: G! J
总共几个脚我用文字描述一下。
SD卡的cs接m32的SS引脚
其它的MISO MOSI SCK就不用说了 % U) E* O5 j1 o8 o# z& H; b
% J% d4 v8 o9 J; I9 c
VS1003的
XCS接 PB0
XRESET接 PB1
DREQ接 PB2 2 e# c. r; ~0 h# C
XDCS接 PB3 9 p9 s& g6 f. ]$ S
其它几根SPI数据线按标准接
7 s+ X8 [9 I% [3 [
PLAY/STOP键接 PD5 3 z/ A$ d Z" ^+ z
PREV键接 PD4 * i0 ^1 I$ d8 ^0 u5 [
NEXT键接 PD3
V- 接 PD2 \- n" E; O* n4 o, K6 X$ `9 t8 e
V+ 接 PD6
如须更改可在程序中修改 : ?. W: J) N7 _0 Z2 O% X9 T
VS1003的电源是这样接的,3.3V接IO电源,模拟电源用3.3串接一个1N4007,核电源在1N4007后接一个快恢复管1N5819。其它的按VS1003手册给的接法就行了。
4 o3 v$ S% @- [* S, h
如果要手工在通用板上焊VS1003的话,建议先给VS1003各个脚上好锡,然后焊好四周的8个脚用作固定,可以用电阻引脚之类的东西。然后用 细的漆包线,可以从小变压器上拆,把头上的漆用刀子刮掉上上锡。接着用普通的烙铁,记住烙铁不能沾锡,仔细焊上然后把线引到附近固定后接到你要的地方就行 了。 5 e! w8 D) w3 [) {/ T1 U, ?# R
VS1003有很多电源脚内部是连在一起的,如果想偷懒的话可以只焊一根,或者只焊重要的脚就可以了,我上面做的mp3就是这样做的,工作没问题。不然48个脚要我焊焊上一天呢。
' s- }7 ~8 K$ o
发布一个带完整歌词显示的mp3(基于本站的mp3板)_个人业余玩AVR暂告一段落
7 `6 l2 ?8 v* w- M$ n) S, j% ]9 C
硬件环境: 9 a0 x5 B3 t+ a C4 x9 x' o7 R
是网站的mp3板,还是去年卖的缺陷板,当时是这个板第一次做板,但是有点小错误。当时我仔细看了看问题不大就购了一块。虽然贴了个标签说不可以用作mp3用途,但是我还是做了。
这个板的问题就是ch375的接线搞成5v版本的了,还有ch375的晶振离芯片太远,并且离数据线太近,这会导致ch375工作不稳 定。后来我通过改变晶振端的电容来稳定起工作。还有就是AVCC没有接VCC,还有个小毛病是232的RXD中少串了个电阻,直接接会导致无法isp下 载。
板子回来东西也是过了很久一个一个焊上去的,3310是从ppa2001那转让来的(在此表示感谢,他顺便还送了我很多PCB板)。最近从armok这里弄了些零件才算弄完整了。 + _! ~7 c; d5 P
- { C( k- L% v2 ]/ m
软件平台: 7 z, }8 w1 I( B+ D" ~
AVRSTudio4.13 + WinAVR20070525
到了公司用起了source insight才觉得AVRSTudio的编辑器太滥了,所以我是用source insight编辑代码,直接命令行敲命令make,用avrdude + jtagice下载代码
1 s( |" p1 }, {5 D) L
. B: O& F4 l7 | X" S k3 X
功能描述:
程序包含两部分bootloader+application
bootloader是前一阵子在坛子里搜到的stk500的bootloader,我对它作了修改,以和我的程序匹配。 ' J( G; f, v+ m: {: {5 |2 R
9 {- c. @2 E2 J, \% W/ T6 a. c9 m
bootloader需要配置成2Kbytes的,可以复位按住start/puse,或者在主程序中按VOL+建,另外复位后10秒如果没有操作则自动进入bootloader * q8 B' ?$ `2 l" W, }; N
application部分完成的就是mp3的播放功能: , L7 J4 Y$ n* a4 \9 V4 q
5个按键,功能上我只对start/pause作了修改,这个按键是用作模式选择的,可以选择单曲重复,全曲重复,随几播放(shuffle)
mp3文件可以存放在任意目录,但是总的文件夹数目受到限制(目前代码限制136个)。也可以采用以前的惯用方法,把文件放在特定目录下,这个需要修改程序fat.h文件中的一个宏定义FIX_DIRECTORY。 8 J# I+ Q8 L" w) a L! {5 y9 M4 L
歌词文件可以存放在歌曲所在的目录和一个默认目录下,代码中是\\lrc 即根目录下的lrc文件夹下。
P2 t0 \- s' o( c/ n3 B1 S
程序对歌词提供了完整的支持,支持标准的lrc文件规范。[XX:XX]&[XX:XX.XXX],可以多个时间tag共用一句歌词。 ; U% A0 ~4 h6 \7 x {
程序处理歌词的方法是,根据mp3文件的文件名(短/或长文件名)去寻找lrc后缀的文件。注意:文件名采用前段匹配的方式,即只要歌词文件前面 的和音乐文件匹配即可。如:细说往事.mp3 和 细说往事-南方二重唱.lrc是可以对应起来的。另外对于文件名中的大小写是区分的,如 may it be.mp3 和May it be.lrc是对应不起来的。
找到歌词文件后程序会对其解析,然后对所有数据进行排序。将结果存到ram或eeprom中。程序中使用静态单向链表来描述各个时间 tag,真正的歌词数据则放到一个数组里。目前这数组在内部ram中试640字节,eeprom中有1500字节。程序优先使用ram如果ram放步下则 会存到eeprom中。eeprom剩下的空间用于存放文件夹的信息,用于支持文件的任意存放。 , I, [ v- C. v1 m4 ~7 u4 E
由于部分歌词会存放到eeprom中,eeprom的操作很慢,所以歌词推荐那种使用多个tag公用一个歌词的形式,[xx:xx][yy:yy]XXXX 。当然不是这种也支持了。像这种歌词: # k Z8 `7 \) C( `7 ]- ^# m/ |
[ti: Bohemian Rhapsody (Mercury)] 5 d5 x1 ^ H+ W7 B8 S/ S) {
[ar
[al:A Night At The Opera (c)1975] 8 A; I3 `' R1 r+ C
! Q3 i, ^4 E8 C
[00:01]Is this the real life 1 R! ^$ `4 @7 ]7 b1 U7 U
[00:04]Is this just fantasy * ^. }& ~; Y3 e) j; d. h% v
[00:07]Caught in a landslide
[00:10]No escape from reality 2 V+ R4 j: t: y: O0 r
[00:15]Open your eyes
[00:18]Look up to the skies and see / B! G+ l" m# N/ k/ A/ R# A6 v
[00:25]I'm just a poor boy, I need no sympathy
[00:31]Because I'm easy come, easy go, , B5 K1 V+ s+ s) m+ S, a
[00:35]little high, little low,
[00:38]Anyway the wind blows, doesn't really matter to me,
[00:48]- to me -,
[00:55]Mama, just killed a man, 0 i& x0 Z$ N3 M& H
[01:01]Put a gun against his head,
[01:05]Pulled my trigger, now he's dead,
[01:09]Mama, life had just begun,
[01:15]But now I've gone and thrown it all away
[01:22]Mama, ooo,
[01:29]Didn't mean to make you cry , N! v; F3 T* n0 f5 n8 ~3 d
[01:32]If I'm not back again this time tomorrow
[01:37]Carry on, carry on, as if nothing really matters 0 P1 B+ s9 [6 f8 R0 c
[01:54]Too late, my time has come,
[02:01]Sends shivers down my spine, ?4 \* q* n3 k7 {3 X5 O
[02:04]Body's aching all the time, ; S5 q4 O6 i! E; _8 Y. n# S5 N
[02:08]Goodbye everybody - I've got to go
[02:14]Gotta leave you all behind and face the truth * X! j# B) g3 o& {# }
[02:21]Mama, ooo
[02:28]I don't want to die, 1 g8 M( l4 K! l% U+ {
[02:31]I sometimes wish I'd never been born at all 6 `0 I3 R T$ F9 Q) W& R
. u6 i* h7 ]& R/ G' B' P
[03:05]I see a little silhouetto of a man,
[03:08]Scaramouche, scaramouche will you do the Fandango
[03:11]Thunderbolt and lightning - very very frightening me
[03:16]Galileo, Galileo, " v) H" b) T9 d- e
[03:17]Galileo, Galileo 3 @$ D! x9 P0 ]$ r" P ~
[03:19]Galileo figaro - Magnifico . o- s8 ^0 C) |4 k. h9 T( i2 r7 K
[03:22]I'm just a poor boy and nobody loves me
[03:25]He's just a poor boy from a poor family
[03:29]Spare him his life from this monstrosity
[03:33]Easy come easy go -, will you let me go : O4 r* Y3 q+ ` V7 K
[03:36]Bismillah! No -, we will not let you go - let him go
[03:40]Bismillah! We will not let you go - let him go
[03:43]Bismillah! We will not let you go - let me go
[03:46]Will not let you go - let me go
[03:48]Will not let you go - let me go
[03:50]No, no, no, no, no, no, no
[03:53]Mama mia, mama mia, mama mia let me go
[03:56]Beelzebub has a devil put aside for me, for me $ r/ i Y: @1 Z( J' D$ [
[04:03]for me -
9 N w: }2 K! D4 g+ n5 `+ ~2 q. e% m
[04:14]So you think you can stone me and spit in my eye
[04:20]So you think you can love me and leave me to die 5 r G K: @1 g
[04:25]Oh Baby - Can't do this to me baby - 1 W8 a2 g. n P5 y7 D& L; |( \8 I
[04:32]Just gotta get out - just gotta get right outta here 4 }- K) V" C( r9 C% n% a
[05:10]Nothing really matters, ' _! |4 { C/ c9 s& ^1 r
[05:14]Anyone can see, & H. h& o `' C0 H( y J3 l
[05:18]Nothing really matters -, nothing really matters to me
6 g% e3 F0 g- s6 [# k& X
[05:40]Any way the wind blows... 6 b/ q7 e5 E6 v2 r& D# S4 g/ a" {
这样程序至少要花10秒钟才能把多余的数据存到eeprom中
像这种:
[ti:细说往事]
[ar:南方二重唱]
[al:细说往事] 8 B6 I- O- a1 z+ b/ Q
[by:炫网资讯 Liuxuan.com] / b8 Q& r# k) V
[00:00.00]细说往事 - 南方二重唱
[00:09.56]词/曲:李子恒
[00:12.24]
[02:55.60][00:14.89]蓝蓝的天
[02:58.17][00:17.31]往事一缕轻烟飘过你的眼廉
[03:05.12][00:23.89]沉默的眼
[03:07.19][00:25.75]请回答我还爱不爱我的从前
[03:13.56][00:32.82]我的从前
[03:16.06][00:35.03]有你陪伴的梦和一张疼爱的脸 " c2 \- x! D9 | A
[03:22.80][00:41.49]如今细说往事
[03:25.05][00:43.95]往事如烟
[03:26.61][00:45.65]我是否还算是你的誓言 * z3 b( o; A/ o" [% y& P
[03:30.60][00:49.97]
[04:09.91][02:04.40][00:50.93]白云翩翩
[04:11.78][02:06.32][00:52.83]心事一面银幕飘过你的窗前
[04:18.63][02:13.12][00:59.79]寂寞的窗 & w2 ^( y% c. p R
[04:20.53][02:15.07][01:01.45]请开启我被岁月紧锁的思念
[04:27.54][02:22.02][01:08.45]我的思念 # d0 e W' ?; x+ X
[04:29.58][02:24.00][01:10.63]有你牵挂的心和一首叫做誓言 8 T3 t: \6 F c {& N6 d0 C1 s
[04:36.30][02:30.59][01:16.91]如今细说往事
[04:38.48][02:32.97][01:19.50]往事如烟 , z0 z" I0 A6 @# B/ ~) U
[04:40.13][02:34.51][01:21.09]我是否还算是你的从前
[04:46.16][02:39.20][01:26.58] 1 o" W- K* U2 c' `& @
[03:34.05][01:28.01]往事从头 ' }6 q# E) v$ E4 j9 N W
[03:35.59][01:30.17]轻轻细说梦的演变 1 `4 k8 o! ]8 I+ `0 q
[03:42.30][01:36.95]多年以后
[03:44.56][01:39.04]是否还有爱的容颜 . l" f) ~ t4 k R
[03:51.42][01:45.93]往事从头
[03:53.52][01:47.97]轻轻细说沧海桑田
[04:00.20][01:54.65]是否能够 ! x3 ?3 z& f% z- C
[04:02.40][01:56.87]回到从前再走一遍 / ]/ X5 J# A+ M) X' R% Z g: \4 y
[04:08.67][02:02.68] % q5 G8 Z) o6 ^ n' W
, u# H$ v5 L5 @ o
就比较好了,用不着eeprom了。 " Y9 l+ T: N2 F1 @ L
程序不仅在LCD上显示信息在串口也会show一些,
说说字库文件:
总共有四个文件:st12.sys,st16.sys,gbk2uni.sys,uni2gbk。其中st12/16是12*12 和16*16点阵字库。其余两个为gbk和unicode互转的文件。
其中st16和gbk2uin.sys没有用到,但是我程序中没有去掉,如果想去调请在程序中改,在LCD_GBK.c文件的初始化中改。 - M/ D" T7 G1 f v5 M
字库是GBK字库,不是GB2312,所以支持很多汉字,总共两万多个,所以再生僻的都可以正常显示,如下面的繁体:
[ti:失恋阵线联盟] ; {! d1 O3 f5 v* v5 f4 G
[ar:草蜢] @! n" g$ D# s4 J$ ]% v7 Y
[al:]
[by:ZJM] 0 k5 N+ s3 Z0 S2 ?4 J n, `. q1 ?
[00:00]失戀陣線聯盟
[00:10]演唱:草蜢 ; L7 q/ X: V- l" H$ f; k* n
; G, \6 f- Y4 b5 i
[00:14] 4 e/ g/ T* h( {4 q
[01:43][00:16]她總是只留下電話號碼 + R5 U& q3 q2 k7 x& ~
[01:47][00:19]從不肯讓我送她回家 2 {8 Y6 `) S2 x8 B: p% g
[01:50][00:23]聽說你也曾經愛上過她
[01:54][00:26]曾經也同樣無法自拔 ) ^8 m7 l- ?, H, ?' D
[01:57][00:30]你說你學不會假裝瀟洒
[02:01][00:34]卻教我別太早放棄她
[02:05][00:37]把過去全說成一段神話 $ l1 \7 H, i/ P' o
[02:08][00:41]然後笑彼此一樣的傻
[02:12][00:45]我們這麼在乎她卻被她全不抹煞 1 [- z/ M' d- T5 o0 M3 F% l
[02:16][00:48]越疼她越傷心永遠得不到回答
[02:19][00:52]到底她怎麼想應該繼續猜測嗎
[02:23][00:56]還是說好全忘了吧
[02:27][00:59]找一個承認失戀的方法 : V. C$ S( i7 D% c
[02:30][01:03]讓心情好好的放個假
[02:34][01:06]當你我不小心又想起她 + ^; `# M+ W ]- l0 a) H
[02:45][02:41][02:37][01:10]就在記憶裡畫一個"X" ' Q7 |9 s! X. g# {
[01:14](Music) $ {. n$ _' N4 F$ g, E) ?7 ^
RE:DIY STM32之MP3素材整理
想问一下,字库是存在哪里?eeprom中还是SD Card中?那几个字库得有多大?
回复:DIY STM32之MP3素材整理
RE:DIY STM32之MP3素材整理
RE:DIY STM32之MP3素材整理
支持! Z6 [8 l) ?- g/ t# R' B4 ]
要是用STM32做的话建议加上USB读写SD卡功能
呵呵
回复:DIY STM32之MP3素材整理
RE:DIY STM32之MP3素材整理
回复:DIY STM32之MP3素材整理
既然有素材,那DIY MP3的实质性工作什么时候开始?
回复:DIY STM32之MP3素材整理
RE:DIY STM32之MP3素材整理
回复:DIY STM32之MP3素材整理