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