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