STM32(ARMV7) MP3

䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
෎Ѣ STM32(ARMV7)ⱘ MP3 ᪁ᬒ఼
԰㗙
fire
E-Mail
[email protected]
QQ
313303034
मᅶ
firestm32.blog.chinaunix.net
⹀ӊᑇৄ
䞢☿ STM32 ᓔথᵓ
ᑧ⠜
⠜ᴀ
ST3.0.0
ᅲ偠ᦣ䗄˖ᇚ MicroSD व(ҹ᭛ӊ㋏㒳 FATFS 䆓䯂)䞠䴶ⱘ mp3 ᭛ӊ䗮䖛 VS1003B 㾷
ⷕˈ✊ৢᇚ㾷ⷕৢⱘ᭄᥂䗕ࠄࡳᬒ TDA1308 ৢ䗮䖛㘇ᴎ᪁ᬒߎᴹˈᑊ೼
LCD Ёᰒ⼎᳆Ⳃ੠㡎ᴃᆊˈᬃᣕЁ㣅᭛ᰒ⼎DŽ䖭䚼ߚ䳔㽕 LCD ⱘᬃᣕˈ᳝
݇ LCD ⱘ᪡԰䇋ᶹⳟ LCD ⱘ䙷䚼ߚ pdf ᬭ⿟DŽ
⊼˖䞢☿ stm32 ᓔথᵓЁᵓ䕑ⱘ mp3 䎳䖭䞠ⱘ᥹ষᰃϔḋⱘDŽ
㒃᠟Ꮉᠧ䗴 MP3ˈVS1003 ⹀㾷ⷕˈ໪ࡴゟԧ㘇ᴎࡳᬒ TDA1308ˈ䷇䋼෾↨⬉㛥DŽ
1 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
MP3 Ϣᓔথᵓⱘ᥹㒓
⹀ӊ䖲᥹˖PB13-SPI2_SCK : VS1003B-SCLK
PB14-SPI2_MISO : VS1003B-SO
PB15-SPI2_MOSI : VS1003B-SI
PB12-SPI2_NSS : VS1003B-XCS
PB11
: VS1003B-XRET
PC6
: VS1003B-XDCS
PC7
: VS1003B-DREQ
ᑧ᭛ӊ ˖startup/start_stm32f10x_hd.c
CMSIS/core_cm3.c
CMSIS/system_stm32f10x.c
FWlib/stm32f10x_gpio.c
FWlib/stm32f10x_rcc.c
FWlib/stm32f10x_usart.c
FWlib/stm32f10x_sdio.c
FWlib/stm32f10x_dma.c
FWlib/stm32f10x_spi.c
FWlib/misc.c
FWlib/fsmc.c
2 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
⫼᠋᭛ӊ: USER/main.c
USER/stm32f10x_it.c
USER/sdcard.c
USER/diakio.c
USER/ff.c
USER/usart1.c
USER/vs1003.c
USER/SysTick.c
USER/lcd.c
USER/sd_fs_app.c
USER/sd_bmp.c
USER/mp3play.c
䞢☿ STM32 ᓔথᵓЁ MP3 ⱘ⹀ӊॳ⧚೒˖
3 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
㾷ⷕ䚼ߚ䞛⫼ VS1003-MP3/WMA ䷇乥㾷ⷕ఼ˈ✊ৢᇚ㾷ⷕৢⱘ᭄᥂䗕 TDA1308
ᬒ໻ৢ⬅䷇乥᥹ষ໪᪁ߎᴹDŽ
VS1003+TDA1308 ㅔҟ->
VS1003 ᰃϔϾऩ⠛ MP3/WMA/MIDI ䷇乥㾷ⷕ఼੠ ADPCM 㓪ⷕ఼DŽᅗࣙ৿ϔϾ
催ᗻ㛑ˈ㞾ЏѻᴗⱘԢࡳ㗫 DSP ໘⧚఼Ḍ VS_DSP 4 ,Ꮉ԰᭄᥂ᄬ‫ˈ఼ټ‬Ў⫼᠋ᑨ⫼
ᦤկ 5KB ⱘᣛҸ RAM ੠ 0.5KB ⱘ᭄᥂ RAMDŽІ㸠ⱘ᥻ࠊ੠᭄᥂᥹ষˈ4 Ͼᐌ㾘⫼䗨
ⱘ I/O ষˈϔϾ UARTˈг᳝ϔϾ催ક䋼ৃব䞛ḋ⥛ⱘ ADC ੠ゟԧໄ DACˈ䖬᳝ϔϾ
㘇ᴎᬒ໻఼੠ഄ㒓㓧‫఼ކ‬DŽ
VS1003 䗮䖛ϔϾІ㸠᥹ষᴹ᥹ᬊ䕧ܹⱘ↨⡍⌕ˈᅗৃҹ԰ЎϔϾ㋏㒳ⱘҢᴎDŽ䕧
ܹⱘ↨⡍⌕㹿㾷ⷕˈ✊ৢ䗮䖛ϔϾ᭄ᄫ䷇䞣᥻ࠊ఼ࠄ䖒ϔϾ 18 ԡ䖛䞛ḋ໮ԡ¦-
DACDŽ䗮䖛І㸠ᘏ㒓᥻ࠊ㾷ⷕ఼DŽ䰸њ෎ᴀⱘ㾷ⷕˈ೼⫼᠋ RAM Ёᅗ䖬ৃҹ‫݊خ‬Ҫ⡍
⅞ᑨ⫼ˈ՟བ DSP ䷇ᬜ໘⧚DŽ
VS1003 ॳ⧚Ḛ೒˖
4 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
ᴀᅲ偠Ё៥Ӏা⫼њ㑶㡆೚೜Ёⱘ䙷޴Ͼ᭄᥂ষˈ䖭ѯ᭄᥂ষᰃІ㸠῵ᓣⱘˈ៥
Ӏ⫼ࠄњᓔথᵓЁⱘ SPI2 ᴹ᥻ࠊDŽ݊Ё᭄᥂㒣 SI ᥹ষ䖯এˈ㒣㾷ⷕৢ⬅ LǃR 䖭ϸϾ
Ꮊেໄ䘧ᓩ㛮ߎᴹˈ಴Ў VS1003 ‫ݙ‬䚼䲚៤њϔϾ DAˈ᠔ҹߎᴹⱘ᭄᥂ᰃ῵ᢳⱘˈৃ
Ⳉ᥹偅ࡼ㘇ᴎˈԚ⬅Ѣࡳ⥛໾ᇣˈ䷇ᬜϡՇˈ᠔ҹ៥Ӏᇚֵো䗕ᕔ TDA1308 ᬒ໻ৢ‫ݡ‬
䗮䖛㘇ᴎ໪ᬒߎᴹˈ㒣䖛䖭ḋߎᴹПৢ䷇䋼䎳⬉㛥Ϟⱘ᳝ⱘ↨DŽ⦄೼Ꮦ䴶Ϟⱘ MP3 ῵
ഫ෎Ѣ៤ᴀ㗗㰥䛑≵ࡴ䷇乥ࡳᬒˈ㗠ᰃⳈ᥹偅ࡼ䷇乥㘇ᴎˈᬜᵰৃᛇ㗠ⶹDŽ
TDA1308 ᰃϔℒঠ䗮䘧ⱘゟԧ㘇ᴎ偅ࡼ఼ˈᰃϔℒϧ䮼⫼Ѣໄ䷇偅ࡼⱘࡳᬒDŽ݊
ॳ⧚Ḛ೒བϟ˖
5 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
᳝݇ VS1003B ੠ TDA1308 ⱘ䆺㒚ᑨ⫼ˈ໻ᆊৃখ㗗ᅬᮍⱘ datasheetDŽ
ᴀᅲ偠ᰃ೼ ljMicroSD व+FATFSNJ䖭Ͼᅲ偠෎⸔Ϟ䖯㸠ⱘDŽ ≵‫خ‬䖛䖭Ͼᅲ偠ⱘ
䆱ৃখ㗗ࠡ䴶ⱘᬭ⿟DŽ
-------------------------------------MP3 ⶹ䆚ᠿⳆ----------------------------------------೼䆆㾷ᅲ偠Пࠡˈ‫ܜ‬໻ὖњ㾷ϟ MP3 ⱘⶹ䆚DŽ
z
MP3 ᭛ӊὖ䗄->
MP3 ᭛ӊᰃ⬅ᏻ(frame)ᵘ៤ⱘˈᏻᰃ MP3 ᭛ӊ᳔ᇣⱘ㒘៤ऩԡDŽMP3 ⱘܼ⿄Ў
MPEG1Layer-3 ䷇乥᭛ӊˈMPEG(Moving Pictures Experts Group)೼∝䇁Ё㗏䆥Ў⌏ࡼ
೒‫ڣ‬ϧᆊ㒘ˈ⡍ᣛ⌏ࡼᕅ䷇य़㓽ᷛ‫ˈޚ‬MPEG ䷇乥᭛ӊᰃ MPEG1 ᷛ‫ޚ‬Ёⱘໄ䷇䚼ߚˈ
гি MPEG ䷇乥ሖˈᅗḍ᥂य़㓽䋼䞣੠㓪ⷕ໡ᴖ⿟ᑺߦߚЎϝሖˈे Layer1ǃ
Layer2ǃLayer3ˈϨߚ߿ᇍᑨ MP1ǃMP2ǃMP3 䖭ϝ⾡䷇乥᭛ӊˈᑊḍ᥂ϡৠⱘ⫼
䗨ˈՓ⫼ϡৠሖ⃵ⱘ㓪ⷕDŽMPEG ䷇乥㓪ⷕⱘሖ⃵䍞催ˈ㓪ⷕ఼䍞໡ᴖˈय़㓽⥛г䍞
催ˈMP1 ੠ MP2 ⱘय़㓽⥛ߚ߿Ў 4˖1 ੠ 6˖1-8˖1ˈ㗠 MP3 ⱘय़㓽⥛߭催䖒 10˖112˖1DŽϡ䖛 MP3 ᇍ䷇乥ֵো䞛⫼ⱘᰃ᳝ᤳय़㓽ᮍᓣˈ᳾ᴹ䰡Ԣໄ䷇༅ⳳᑺˈMP3 䞛
⫼њĀᛳᅬ㓪ⷕᡔᴃāˈे㓪ⷕᯊ‫ܜ‬ᇍ䷇乥᭛ӊ䖯㸠乥䈅ߚᵤˈ✊ৢ⫼䖛Ⓒ఼Ⓒᥝా
䷇⬉ᑇˈ᥹ⴔ䗮䖛䞣࣪ⱘᮍᓣᇚ࠽ϟⱘ↣ϔԡᠧᬷᥦ߫ˈгህᰃ Huffman ᮴ᤳय़㓽㓪
6 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
ⷕˈ᳔ৢᔶ៤‫݋‬᳝䕗催य़㓽↨ⱘ MP3 ᭛ӊˈᑊՓय़㓽ৢⱘ᭛ӊ೼ಲᬒᯊ㛑໳䖒ࠄ↨䕗
᥹䖥ॳ䷇ⱘໄᬜDŽ
z
MP3 ᭛ӊ㒘៤->
MP3 ᭛ӊ໻ԧߚЎ 3 䚼ߚ:TAG_V2(ID3V2),Frame,TAG_V1(ID3V1)DŽ㽕⊼ᛣ᳝ѯ
MP3 ᭛ӊሒᰃ≵᳝ ID3V1 tag ⱘˈ᳝ⱘᰃ MP3 ᭛ӊ༈䚼ⱘ ID3V2 tagDŽ ݊Ё ID3V1 ᄬ
ᬒ೼ MP3 ᭛ӊⱘ᳿ሒ ˈ⫼ 16 䖯ࠊⱘ㓪䕥఼ᠧᓔϔϾ MP3 ᭛ӊˈ ᶹⳟ݊᳿ሒⱘ 128
Ͼ乎ᑣᄬᬒᄫ㡖ˈ᭄᥂㒧ᵘᅮНབϟ˖
1.
typedef struct tagID3V1
2.
{
3.
char Header[3];
// ᷛㅒ༈ᖙ乏ᰃ"TAG"ˈ৺߭㹿䅸Ў≵᳝ᷛㅒ༈
4.
char Title[30];
// ᷛ乬
5.
char Artist[30];
// ԰㗙
6.
char Album[30];
// ϧ䕥
7.
char Year[4];
// ߎકᑈҷ
8.
char Comment[28];
// ໛⊼
9.
char reserve;
// ֱ⬭
10.
char track;
// ䷇䔼
11.
char Genre;
// 亢Ḑ
12. }ID3V1, *pID3V1;
⦄೼ᕜ໮ MP3 ᭛ӊ᳝ⱘাᰃ ID3V2ˈ෎ᴀϞ䛑≵᳝њሒ䚼ⱘ ID3V1 њˈ᳝ ID3V1
ⱘᰃ↨䕗㗕ⱘ℠᳆ˈ䞢☿থ⦄‫ ڣ‬beyond ⱘ℠䛑৿᳝ ID3V1 tag ˈԚֵᙃгϡབϞ䴶ⱘ
㒧ᵘԧЁᦣ䗄ᕫ໮ˈϔ㠀᳝ⱘᰃ title ੠ artistDŽ䖭೼᥹ϟᴹⱘҷⷕЁৃⳟࠄ ID3V1 ⱘ
ᑨ⫼DŽ
ID3V1 ⱘ৘乍䛑ᰃ乎ᑣᄬᬒˈ≵᳝ӏԩᷛᖫᇚ݊ߚᓔˈ↨བᷛ乬ֵᙃϡ䎇 30 Ͼᄫ
㡖ˈ߭Փ⫼’\0’㸹䎇ˈ৺߭ᇚ䗴៤ֵᙃ䫭䇃DŽ
1ǃ
↣ᏻⱘ᪁ᬒᯊ䯈˖᮴䆎ᏻ䭓ᰃ໮ᇥˈ↣ᏻⱘ᪁ᬒᯊ䯈ᰃ 26msDŽ
2ǃ
᭄᥂ᏻ໻ᇣⱘ䅵ㅫ˖
3ǃ *1ǃ↣ᏻⱘ᪁ᬒᯊ䯈˖᮴䆎ᏻ䭓ᰃ໮ᇥˈ↣ᏻⱘ᪁ᬒᯊ䯈ᰃ 26msDŽ
4ǃ *2ǃ
FrameSize = ( (( MPEGVersion == MPEG1 ? 144 : 72 ) * Bitrate) / SampleRate
) + PaddingBit
5ǃ */
7 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
‹ ID3V2˖ࣙ৿њ԰㗙ˈ԰᳆ˈϧ䕥ㄝֵᙃˈ䭓ᑺϡ೎ᅮˈᠽሩњ ID3V1 ⱘֵᙃ
䞣DŽ
‹ Frame:ϔ㋏߫ⱘᏻˈϾ᭄⬅᭛ӊ໻ᇣ੠ᏻ䭓‫އ‬ᅮDŽ↣Ͼ frame ⱘᏻ䭓ৃ㛑೎
ᅮˈгৃ㛑ϡ೎ᅮˈ⬅ԡ⥛ bitrate ‫އ‬ᅮDŽ↣ϾᏻজߚЎᏻ༈੠᭄᥂ᅲԧϸ䚼
ߚDŽᏻ༈䆄ᔩњ mp3 ⱘԡ⥛ˈ䞛ḋ⥛ˈ⠜ᴀㄝֵᙃˈ↣ϾᏻП䯈ⳌѦ⣀ゟDŽ
‹ ID3V1˖ࣙ৿њ԰㗙ˈ԰᳆DŽϧ䕥ㄝֵᙃˈ䭓ᑺЎ 128 byteDŽ
↣Ͼ MP3 ᭄᥂ᏻ᳝ϔϾᏻ༈ FRAMHEADERˈ䭓ᑺᰃ 4 Ͼ byte(32bit)ˈᏻ༈ৢ䴶
ৃ㛑᳝ϸϾᄫ㡖ⱘ CRC ᷵偠ⷕˈ䖭ϸϾᄫ㡖ⱘᰃ৺ᄬ೼‫އ‬ᅮѢ FRAMHEADER ⱘ㄀
16bitˈЎ 0 ߭ᏻ༈ৢ䴶≵᷵偠ˈЎ 1 ᳝߭᷵偠ˈ᷵偠ؐ䭓ᑺЎ 2 Ͼᄫ㡖ˈ㋻䎳೼
FRAMHEADER ৢ䴶ˈ᥹ⴔህᰃᏻⱘᅲԧ᭄᥂њˈḐᓣབϟ˖
FRAMHEADER
CRC(free)
MAIN_DATA
4byte
0 or 2 byte
䭓ᑺ⬅ᏻ༈䅵ㅫᕫߎ
݇Ѣ MP3 ⱘⶹ䆚䞢☿‫ܜ‬䆆㾷ࠄ䖭ˈ݊Ҫⱘ⿡ৢ‫ݡ‬䆆㾷ˈϟ䴶៥Ӏᴹ‫݋‬ԧⳟⳟ⑤ⷕ
ⱘᅲ⦄DŽ
---------------------------------------------------------------------------------------------
ᅲ偠䆆㾷->
佪‫ܜ‬䳔㽕ᇚ䳔㽕⫼ࠄⱘᑧ᭛ӊ⏏ࡴ䖯ᴹˈ᳝݇ᑧⱘ䜡㕂ৃখ㗗ࠡ䴶ⱘᬭ⿟ˈ䖭䞠
ϡ‫ݡ‬䆺䗄DŽ೼䜡㕂དᑧⱘ⦃๗Пৢ៥ӀҢ main ߑ᭄ᓔྟߚᵤ˖
1. /*
2.
* ߑ᭄ৡ˖main
3.
* ᦣ䗄 ˖Џߑ᭄
4.
* 䕧ܹ ˖᮴
5.
* 䕧ߎ ˖᮴
6.
*/
7. int main(void)
8. {
9.
/* 䜡㕂㋏㒳ᯊ䩳Ў 72M */
10.
SystemInit();
11.
12.
/* 䜡㕂 SysTick Ў 10us Ёᮁϔ⃵ */
13.
SysTick_Init();
8 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51. }
/* 䜡㕂Іষ 1 115200 8-N-1 */
USART1_Config();
/* LED ߱ྟ࣪ˈ⫼Ѣ䇗䆩 */
LED_GPIO_Config();
/* 2.4TFT ߱ྟ࣪ */
LCD_Init();
/* ᭛ӊ㋏㒳߱ྟ࣪-----∝ᄫᄫᑧֱᄬ೼ sd वЁ */
sd_fs_init();
Set_direction(0);
/* 䆒㕂 LCD ⱘᠿᦣᮍ৥ˈ䖭䞠ЎൖⳈᠿᦣ*/
LCD_CLEAR(0,0,240,320);
//Lcd_show_bmp(0, 0,"/PIC.bmp");
USART1_printf( USART1, " \r\n 䖭ᰃϔϾ MP3 ⌟䆩՟⿟ !\r\n " );
/* MP3 ⹀ӊ I/O ߱ྟ࣪ */
VS1003_SPI_Init();
/* SD व⹀ӊ߱ྟ࣪ˈᑊ߱ྟ࣪ⲬヺЎ 0 */
//disk_initialize( 0 );
/* MP3 ህ㒾ˈ‫ޚ‬໛᪁ᬒˈ೼ vs1003.c ᅲ⦄ */
MP3_Start();
LED1(ON);
/* ᪁ᬒ SD व(FATFS)䞠䴶ⱘ䷇乥᭛ӊ */
MP3_Play();
while (1)
{
}
/* end of main */
ᑧߑ᭄ SystemInit();ᇚ៥Ӏⱘ㋏㒳ᯊ䩳䆒㕂Ў 72MHZˈ೼᠔᳝Ꮉ԰Пࠡ佪‫ܜ‬㽕‫ⱘخ‬
ህᰃ‫ܜ‬䆒㕂㋏㒳ᯊ䩳ˈ䖭ৃगϛ߿ᖬњDŽ೼ ST3.0.0 ⠜ᴀПৢⱘᑧЁˈ䖭䚼ߚᎹ԰䛑
ᬒ೼њਃࡼ᭛ӊЁњˈ⬅∛㓪ᅲ⦄ˈা㽕⫼᠋ҷⷕϔ䖯ܹ main ߑ᭄ህ㸼⼎Ꮖ㒣߱ྟ࣪
ད㋏㒳ᯊ䩳њˈᅠܼϡ⫼⫼᠋㗗㰥ˈ⫼᠋ϡⶹ䘧䖭⚍ⱘ䆱䖬ҹЎϡ䳔㽕߱ྟ࣪㋏㒳ᯊ
䩳ਸ਼DŽԚ៥Ӏ䖭䞠⫼ⱘᑧ⠜ᴀᰃ ST3.0.0ˈ᠔ҹ䖬ᰃ䳔㽕䇗⫼ᑧߑ᭄ SystemInit();ᴹ߱
ྟ࣪៥Ӏⱘ㋏㒳ᯊ䩳DŽ㟇Ѣ ST3.0.0 ੠Пৢ催⠜ᴀⱘᑧ᳝ҔМऎ߿ˈ៥ᛇ䇈ⱘᰃ≵Ҕ
М໻ⱘऎ߿ˈҷⷕⱘⳂᔩ㒧ᵘ෎ᴀ≵᳝ᬍবˈাᰃ೼ҷⷕⱘࡳ㛑๲໮њˈᬃᣕ᳈ᅠ୘
ⱘ໪䆒DŽ
SysTick Ў 10us Ёᮁϔ⃵⫼Ѣ
USART1_Config();
SysTick Ў 10us Ёᮁϔ⃵ˈ⫼Ѣৢ䴶ⱘᓊᯊߑ᭄DŽ
䜡㕂Іষ 1 ⊶⡍⥛Ў 115200 ˈ8 Ͼ᭄᥂ԡˈ1 Ͼ‫ذ‬ℶԡˈ᮴⹀ӊ⌕᥻
ࠊDŽ
LCD_Init();
⫼Ѣ߱ྟ࣪៥Ӏⱘ 2.4TFTˈ៥Ӏᇚ⫼ᅗᴹᰒ⼎៥Ӏⱘ MP3 ℠᳆ⱘֵᙃDŽ
9 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
sd_fs_init();⫼Ѣ߱ྟ࣪
MicroSD वᑩሖ⹀ӊˈᑊᇚⲬヺ߱ྟ࣪Ў 0ˈ䖬䆒㕂њ
MicroSD वⱘЁᮁӬ‫ܜ‬㑻ˈ䖭Ͼߑ᭄䞠䴶䇗⫼њ SDIO_NVIC_Configuration();
disk_initialize( 0 );
੠
䖭ϸϾߑ᭄DŽ䇗⫼ sd_fs_init();ߑ᭄ᰃ䴲ᐌ䞡㽕ⱘˈϡ✊
MicroSD वᰃᎹ԰ϡњⱘˈ᭛ӊ㋏㒳ḍᴀ䎥ϡ䍋ᴹˈMP3 ᭛ӊḍᴀህ䇏ϡߎᴹDŽ
disk_initialize( 0 );
⫼Ѣ߱ྟ࣪ MicroSD वⱘᑩሖ⹀ӊˈᑊᇚवⱘⲬヺ߱ྟ࣪Ў
0ˈⲬヺⱘ㣗ೈЎ 0~9ˈ⫼᠋ৃ䗝ˈ೼䖭䞠៥Ӏ䗝Ў 0DŽ
᥹ϟᴹⱘ޴Ͼߑ᭄໻ӭⳟ⊼䞞৻ˈ↨䕗ㅔऩˈ䞢☿ህϡ‫ݡ‬ୄ஺⌾䌍໻ᆊⱘᯊ䯈଺
^_^DŽ
VS1003_SPI_Init();⫼Ѣ߱ྟ࣪
MP3 㾷ⷕ㢃⠛ VS1003B 䳔㽕⫼ࠄⱘ I/O ষˈࣙᣀ᭄
᥂ষ(SPI2)੠᥻ࠊ I/ODŽVS1003_SPI_Init();⬅⫼᠋೼ vs1003.c Ёᅲ⦄˖
1.
* ߑ᭄ৡ˖VS1003_SPI_Init
2.
* ᦣ䗄 ˖VS1003 ᠔⫼ I/O ߱ྟ࣪
3.
* 䕧ܹ ˖᮴
4.
* 䕧ߎ ˖᮴
5.
* 䇗⫼ ˖໪䚼䇗⫼
6.
*/
7. void VS1003_SPI_Init(void)
8. {
9.
SPI_InitTypeDef SPI_InitStructure;
10.
GPIO_InitTypeDef GPIO_InitStructure;
11.
12.
/* Փ㛑 VS1003B ᠔⫼ I/O ⱘᯊ䩳 */
13.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB
2Periph_GPIOC , ENABLE);
14.
/* Փ㛑 SPI2 ᯊ䩳 */
15.
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 ,ENABLE);
16.
17.
/* 䜡㕂 SPI2 ᓩ㛮: PB13-SCK, PB14-MISO ੠ PB15-MOSI */
18.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
19.
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
20.
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
21.
GPIO_Init(GPIOB, &GPIO_InitStructure);
22.
23.
/* PB12-XCS(⠛䗝) */
24.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
25.
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
26.
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
27.
GPIO_Init(GPIOB, &GPIO_InitStructure);
28.
29.
/* PB11-XRST(໡ԡ) */
30.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
31.
GPIO_Init(GPIOB, &GPIO_InitStructure);
32.
33.
34.
/* PC6-XDCS(᭄᥂ੑҸ䗝ᢽ) */
35.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
36.
GPIO_Init(GPIOC, &GPIO_InitStructure);
37.
38.
/* PC7-DREQ(᭄᥂Ёᮁ) */
39.
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
40.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
41.
GPIO_Init(GPIOC, &GPIO_InitStructure);
42.
43.
/* SPI2 configuration */
44.
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
45.
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
10 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57. }
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
/* Enable SPI2 */
SPI_Cmd(SPI2, ENABLE);
‫؛‬བ៥Ӏ㽕ᇚ᭄᥂ষᤶ៤ SPI1 ៪㗙ᬍব݊Ҫ᥻ࠊ I/Oˈা䳔ᬍব䖭Ͼߑ᭄ेৃˈ
⿏ỡᗻ䴲ᐌᔎDŽ
disk_initialize( 0 );
⫼Ѣ߱ྟ࣪ MicroSD वⱘᑩሖ⹀ӊˈᑊᇚवⱘⲬヺ߱ྟ࣪Ў
0ˈⲬヺⱘ㣗ೈЎ 0~9ˈ⫼᠋ৃ䗝ˈ೼䖭䞠៥Ӏ䗝Ў 0DŽ
MP3_Start();
Փ MP3 䖯ܹህ㒾῵ᓣ(standby)ˈ䱣ᯊ᪁ᬒ䷇ФDŽMP3_Start();೼
vs1003.c Ёᅲ⦄˖
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
/*
* ߑ᭄ৡ˖MP3_Start
* ᦣ䗄 ˖Փ MP3 䖯ܹህ㒾῵ᓣˈ䱣ᯊ‫ޚ‬໛᪁ᬒ䷇ФDŽ
* 䕧ܹ ˖᮴
* 䕧ߎ ˖᮴
* 䇗⫼ ˖໪䚼䇗⫼
*/
void MP3_Start(void)
{
u8 BassEnhanceValue = 0x00;
// Ԣ䷇ؐ‫࣪ྟ߱ܜ‬Ў 0
u8 TrebleEnhanceValue = 0x00;
// 催䷇ؐ‫࣪ྟ߱ܜ‬Ў 0
TRST_SET(0);
Delay_us( 1000 );
// 1000*10us = 10ms
VS1003_WriteByte(0xff);
TXDCS_SET(1);
TCS_SET(1);
TRST_SET(1);
Delay_us( 1000 );
// থ䗕ϔϾᄫ㡖ⱘ᮴ᬜ᭄᥂ˈਃࡼ SPI Ӵ䕧
Mp3WriteRegister( SPI_MODE,0x08,0x00);
// 䖯ܹ VS1003 ⱘ᪁ᬒ῵ᓣ
Mp3WriteRegister(3, 0x98, 0x00);
// 䆒㕂 vs1003 ⱘᯊ䩳,3 ‫ס‬乥
Mp3WriteRegister(5, 0xBB, 0x81);
// 䞛ḋ⥛ 48kˈゟԧໄ
// 䆒㕂䞡Ԣ䷇
Mp3WriteRegister(SPI_BASS, TrebleEnhanceValue, BassEnhanceValue);
Mp3WriteRegister(0x0b,0x00,0x00);
// VS1003 ䷇䞣
Delay_us( 1000 );
// ㄝᕙ DREQ Ў催
while( DREQ == 0 );
㸼⼎㛑໳᥹ফ䷇Ф᭄᥂䕧ܹ
}
ߑ᭄Ё⍝ঞࠄⱘᅣᅮН䛑೼ vs1003.h 䖭Ͼ༈᭛ӊЁᅲ⦄DŽ݇Ѣߑ᭄ЁЎҔМ㽕䖭
ḋ᪡԰ᆘᄬ఼ˈ៪㗙ЎҔМ㽕ᣝ✻䖭Ͼ乎ᑣᴹ᪡԰ᆘᄬ఼ˈ䇋໻ᆊᶹ䯙 vs1003 ⱘ
pdfˈ䞠䴶䆆ᕫᕜ䆺㒚ˈ᳝ e ᭛䎳Ё᭛䌘᭭DŽ
11 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
MP3_Play();
䖭Ͼߑ᭄䗤Ͼᠿᦣ៥Ӏ SD व䞠䴶ⱘ䷇乥᭛ӊˈᑊᇚ䖭ѯ䷇乥᭛ӊ䛑䗮
䖛㘇ᴎ᪁ᬒߎᴹˈ᳔ৢ‫ذ‬ℶˈ᱖ᯊ䖬≵ᅲ⦄ᕾ⦃᪁ᬒⱘࡳ㛑DŽMP3_Play();೼ vs1003.c
Ёᅲ⦄˖
1. /*
2.
* ߑ᭄ৡ˖MP3_Play
3.
* ᦣ䗄 ˖䇏প SD व䞠䴶ⱘ䷇乥᭛ӊˈᑊ䗮䖛㘇ᴎ᪁ᬒߎᴹ
4.
*
ᬃᣕⱘḐᓣ˖mp3,mid,wav,wma
5.
* 䕧ܹ ˖᮴
6.
* 䕧ߎ ˖᮴
7.
* 䇈ᯢ ˖᱖ϡᬃᣕ䭓᭛ӊৡˈϡᬃᣕЁ᭛DŽ
8.
*/
9. void MP3_Play(void)
10. {
11.
FRESULT res;
12.
FILINFO finfo;
13.
DIR dirs;
14.
u16 count = 0;
15.
char j = 0;
16.
char path[50] = {""}; /* MicroSD वḍⳂᔩ */
17.
char *result1, *result2, *result3, *result4;
18.
19.
f_mount(0, &fs);
/* ᣖ䕑᭛ӊ㋏㒳ࠄ 0 ऎ */
20.
21.
if (f_opendir(&dirs, path) == FR_OK)
/* ᠧᓔḍⳂᔩ */
22.
{
23.
while (f_readdir(&dirs, &finfo) == FR_OK)
/* ձ⃵䇏প᭛ӊৡ */
24.
{
25.
if ( finfo.fattrib & AM_ARC )
/* ߸ᮁᰃ৺Ўᄬḷൟ᭛ḷ */
26.
{
27.
if( !finfo.fname[0] )
/* ᭛ӊৡЎぎेࠄ䖒њⳂ
ᔩⱘ᳿ሒˈ䗔ߎ */
28.
break;
29.
USART1_printf( USART1, " \r\n ᭛ӊৡЎ: %s \r\n", finfo.fname );
30.
31.
result1 = strstr( finfo.fname, ".mp3" );
/* ߸ᮁᰃ৺Ў䷇乥᭛
ӊ */
32.
result2 = strstr( finfo.fname, ".mid" );
33.
result3 = strstr( finfo.fname, ".wav" );
34.
result4 = strstr( finfo.fname, ".wma" );
35.
36.
if ( result1!=NULL || result2!=NULL || result3!=NULL || result4
!=NULL )
37.
{
38.
PutChinese_strings22(10, 220, "ᓔྟ᪁ᬒ", 0, 1);
39.
40.
res = f_open( &fsrc, finfo.fname, FA_OPEN_EXISTING | FA_READ ); /*
ҹা䇏ᮍᓣᠧᓔ */
41.
42.
/* 㦋প℠᳆ֵᙃ(ID3V1 tag / ID3V2 tag) */
43.
if ( Read_ID3V1(&fsrc, &id3v1) == TRUE )
44.
{// ID3V1 tag
45.
printf( "\r\n ᳆Ⳃ
˖%s \r\n", id3v1.title );
46.
printf( "\r\n 㡎ᴃ
ᆊ ˖%s \r\n", id3v1.artist );
47.
48.
49.
PutChinese_strings22(10, 200, "᳆Ⳃ", 0, 1);
PutChinese_strings22(80, 200, id3v1.title, 0, 1);
50.
51.
52.
PutChinese_strings22(10, 180, "㡎ᴃᆊ", 0, 1);
PutChinese_strings22(80, 200, id3v1.artist, 0, 1);
53.
54.
}
else
12 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
{// ᳝ѯ MP3 ᭛ӊ≵᳝ ID3V1 tag,া᳝
55.
ID3V2 tag
56.
57.
58.
59.
60.
61.
62.
63.
res = f_lseek(&fsrc, 0);
Read_ID3V2(&fsrc, &id3v2);
printf( "\r\n ᳆Ⳃ
printf( "\r\n 㡎ᴃᆊ
˖%s \r\n", id3v2.title );
˖%s \r\n", id3v2.artist );
PutChinese_strings22(10, 200, "᳆Ⳃ", 0, 1);
PutChinese_strings22(80, 200, id3v2.title, 0, 1);
64.
65.
66.
PutChinese_strings22(10, 180, "㡎ᴃᆊ", 0, 1);
PutChinese_strings22(80, 180, id3v2.artist, 0, 1);
67.
68.
69.
}
/* Փ᭛ӊᣛ䩜 fsrc 䞡ᮄᣛ৥᭛ӊ༈ˈ಴Ў೼䇗⫼
Read_ID3V1/Read_ID3V2 ᯊˈfsrc ⱘԡ㕂ᬍবњ */
70.
res = f_open( &fsrc, finfo.fname, FA_OPEN_EXISTING | FA_REA
D );
71.
//res = f_lseek(&fsrc, 0);
72.
73.
br = 1;
/* br Ўܼሔব䞣 */
74.
TXDCS_SET( 0 );
/* 䗝ᢽ VS1003 ⱘ᭄᥂᥹ষ */
75. /* ------------------- ϔ᳆ᓔྟ --------------------*/
76.
USART1_printf( USART1, " \r\n ᓔྟ᪁ᬒ \r\n" );
77.
for (;;)
78.
{
79.
res = f_read( &fsrc, buffer, sizeof(buffer), &br );
80.
if ( res == 0 )
81.
{
82.
count = 0;
/* 512
ᄫ㡖ᅠ䞡ᮄ䅵᭄ */
83.
Delay_us( 1000 );
/* 10ms ᓊᯊ */
84.
while ( count < 512)
/* SD व䇏পϔϾ
sectorˈϔϾ sector Ў 512 ᄫ㡖 */
85.
{
86.
if ( DREQ != 0 )
/* ㄝᕙ DREQ Ў催ˈ䇋∖᭄᥂䕧
ܹ */
87.
{
88.
for (j=0; j<32; j++ ) /* VS1003 ⱘ FIFO
া᳝ 32 Ͼᄫ㡖ⱘ㓧‫* ކ‬/
89.
{
90.
VS1003_WriteByte( buffer[count] );
91.
92.
93.
94.
95.
96.
count++;
}
}
}
}
if (res || br == 0) break;
/* ߎ䫭៪㗙ࠄњ MP3 ᭛ӊ
ሒ */
97.
}
98.
USART1_printf( USART1, " \r\n ᪁ᬒ㒧ᴳ \r\n" );
99. /* ------------------- ϔ᳆㒧ᴳ --------------------*/
100.
count = 0;
101.
/* ḍ᥂ VS1003 ⱘ㽕∖ˈ೼ϔ᳆㒧ᴳৢ䳔থ䗕 2048 Ͼ 0 ᴹ⹂ֱϟ
ϔ佪ⱘℷᐌ᪁ᬒ */
102.
while ( count < 2048 )
103.
{
104.
if ( DREQ != 0 )
105.
{
106.
for ( j=0; j<32; j++ )
107.
{
108.
VS1003_WriteByte( 0 );
109.
count++;
13 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
}
}
}
count = 0;
TXDCS_SET( 1 );
/* ݇䯁 VS1003 ᭄᥂ッষ */
f_close(&fsrc);
/* ݇䯁ᠧᓔⱘ᭛ӊ */
PutChinese_strings22(10, 220, "᪁ᬒ㒧ᴳ", 0, 1);
}
}
} /* while (f_readdir(&dirs, &finfo) == FR_OK) */
} /* if (f_opendir(&dirs, path) == FR_OK) */
} /* end of MP3_Play */
1.
䖭Ͼߑ᭄ⱘҷⷕ᳝⚍䭓ˈḐᓣҷⷕ᳝⚍хˈ䞢☿᥼㤤໻ᆊ䖬ᰃ䜡ড়⑤ⷕϔ䍋ⳟˈ
⑤ⷕᇍ唤亢Ḑ䴲ᐌད^_^DŽ
⦄೼៥Ӏᴹ໻ὖߚᵤϟ MP3_Play();䖭Ͼߑ᭄ˈ䖭䞠䖍⍝ঞࠄϔѯ᭛ӊ㋏㒳᪡԰ⱘ
ߑ᭄ˈ݇Ѣ䖭䚼ߚߑ᭄ⱘ᪡԰໻ᆊৃখ㗗ࠡ䴶ⱘᬭ⿟៪㗙䯙䇏 FATFS ⱘᅬᮍ᭛ḷˈ݊
ᅲ៥ⱘᬭ⿟гϡᅠܼℷ⹂ˈ䯙䇏ᅬᮍⱘ᭛ḷᠡᰃ᳔ৃ䴴ⱘDŽ
ߑ᭄ f_mount(0, &fs);Ў៥Ӏ೼᭛ӊ㋏㒳Ё⊼‫ݠ‬ϔϾᎹ԰ऎˈᑊ߱ྟ࣪ⲬヺⱘৡЎ
0ˈⲬヺৃҹ߱ྟ࣪Ў 0~9ˈ៥Ӏ䖭䞠߱ྟ࣪Ў 0DŽ
ߑ᭄ f_opendir(&dirs,
path)
⫼ѢᠧᓔवⱘḍⳂᔩˈᑊᇚ䖭ϾḍⳂᔩ݇㘨ࠄ dirs 䖭
Ͼ㒧ᵘᣛ䩜ˈ✊ৢ៥Ӏህৃҹ䗮䖛䖭Ͼ㒧ᵘᣛ䩜ᴹ᪡԰䖭ϾⳂᔩњˈ݊ᅲ䖭Ͼ㒧ᵘᣛ
䩜ህ㉏Ԑ LINUX ϟ㋏㒳㓪⿟Ёⱘ᭛ӊᦣ䗄ヺˈϡ䆎ᰃ᪡԰䖬ᰃⳂᔩ䛑ᕫ䗮䖛᭛ӊᦣ䗄
ヺᠡ㛑᪡԰ˈᄺ䖛 LINUX ㋏㒳㓪⿟ⱘ᳟টᇍ䖭⚍㚃ᅮ䴲ᐌњ㾷DŽ
f_readdir(&dirs, &finfo)
ߑ᭄䗮䖛߮߮ⱘ dirs 㒧ᵘᣛ䩜ᴹ䇏পⳂᔩ䞠䴶ⱘֵᙃˈᑊ
ᇚⳂᔩⱘֵᙃ‫ټ‬ᄬ೼ finfo 䖭Ͼ㒧ᵘԧব䞣ЁDŽ䖭Ͼ㒧ᵘԧ೼ ff.h 䖭Ͼ༈᭛ӊЁໄᯢDŽ
᳝݇‫݋‬ԧ㒧ᵘ៤ਬⱘ԰⫼໻ᆊৃⳈ᥹䯙䇏⊼䞞DŽ
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
/* File object structure */
typedef struct _FIL_ {
FATFS* fs;
/* Pointer to the owner file system object */
WORD
id;
/* Owner file system mount ID */
BYTE
flag;
/* File status flags */
BYTE
csect;
/* Sector address in the cluster */
DWORD
fptr;
/* File R/W pointer */
DWORD
fsize;
/* File size */
DWORD
org_clust; /* File start cluster */
DWORD
curr_clust; /* Current cluster */
DWORD
dsect;
/* Current data sector */
#if !_FS_READONLY
DWORD
dir_sect;
/* Sector containing the directory entry */
BYTE*
dir_ptr;
/* Ponter to the directory entry in the window */
#endif
#if !_FS_TINY
BYTE
buf[_MAX_SS];/* File R/W buffer */
#endif
} FIL;
14 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
㋻᥹ⴔ߸ᮁ᭛ӊⱘሲᗻˈབᵰᰃᄬḷൟ᭛ӊⱘ䆱ህᇚ᭛ӊৡᠧॄߎᴹˈ✊ৢ↨䕗
᭛ӊⱘৢ㓔ৡˈᶹⳟᰃ৺Ў䷇乥᭛ӊˈᬃᣕⱘ䷇乥Ḑᓣ᳝ mp3ǃmidǃwavǃwmaDŽ
བᵰᰃ䷇乥᭛ӊⱘ䆱߭䇗⫼ f_open(
&fsrc, finfo.fname, FA_OPEN_EXISTING |
FA_READ );ᠧᓔ䖭Ͼ䷇乥᭛ӊDŽ
೼ᠧᓔ䷇乥᭛ӊПৢˈ៥Ӏ䇗⫼ߑ᭄ Read_ID3V1()ᴹ㦋প MP3 ᭛ӊሒ䚼ⱘ ID3V1
tagˈབᵰᄬ೼ TAG ᷛㅒⱘ䆱߭೼⬉㛥ⱘ䍙㑻㒜ッ੠ LCD Ϟᰒ⼎ߎ᳆Ⳃ੠㡎ᴃᆊDŽ
Read_ID3V1()೼ mp3play.c Ёᅲ⦄˖
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
/*
* ߑ᭄ৡ˖Read_ID3V1
* ᦣ䗄 ˖Ң MP3 ᭛ӊሒ䇏প ID3V1 ⱘֵᙃˈᑊᇚ䖭ѯֵᙃֱᄬ೼ϔϾܼሔ᭄㒘Ё
* 䕧ܹ ˖- FileObject: file system
*
- info: struct tag_info
* 䕧ߎ ˖᮴
* 䇈ᯢ ˖⦄೼ⱘ mp3 ෎ᴀϞ䛑≵᳝ ID3V1 tag(೼᭛ӊሒ䚼)ˈ᳝ⱘᰃ ID3V2 tag(೼᭛ӊ༈䚼)DŽ
*/
//void Read_ID3V1(FIL *FileObject, struct tag_info *info)
int Read_ID3V1(FIL *FileObject, struct tag_info *info)
{
/* ID3V1 ⱘֵᙃࣙ৿೼᭛ӊ᳿ሒⱘ 128 Ͼ byte Ё */
res = f_lseek(FileObject,FileObject->fsize - 128 );
/* ᇚ ID3V1 Ёⱘ 128 Ͼ byte ⱘֵᙃ䇏ࠄ㓧‫ކ‬ऎ */
res = f_read(FileObject, &readBuf, 128 , &n_Read);
/* ID3V1 ⱘᷛㅒ༈ᖙ乏ᰃ“TAG”ˈ৺߭䅸Ў≵᳝ᷛㅒ */
if (strncmp("TAG", (char *) readBuf, 3) == 0)
{
strncpy(info->title, (char *) readBuf + 3, MIN(30, sizeof(info->title) 1));
/* ᷛ乬 */
strncpy(info->artist,(char *) readBuf + 3 + 30, MIN(30, sizeof(info->artist) - 1));
/* ԰㗙 */
strncpy(info->album,(char *) readBuf + 3 + 30 + 30, MIN(30, sizeof(info->album) 1));
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
/* ϧ䕥 */
strncpy(info->year,(char *) readBuf + 3 + 30 + 30 + 30, MIN(4, sizeof(info->year) 1));
/* ᯊ䯈 */
return TRUE;
}
else
{
return FALSE;
}
}
㽕ᛇᅠܼ䇏ព䖭Ͼߑ᭄ˈᖙ乏‫݋‬໛ϔᅮⱘ MP3 ᭛ӊḐᓣⱘⶹ䆚ˈϡ✊Դⳟњгⱑ
ⳟˈᅠܼϡⶹ᠔ҹ✊^_^DŽ
៥Ӏᇚ䇏পࠄⱘ݇Ѣ MP3 ⱘֵᙃᄬ‫ټ‬೼ id3v1 䖭Ͼ㒧ᵘԧЁˈ㒧ᵘԧॳൟ೼
mp3play.h 䖭Ͼ༈᭛ӊЁໄᯢ˖
1.
typedef struct tagID3V1
2.
{
15 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
3.
char Header[3];
// ᷛㅒ༈ᖙ乏ᰃ"TAG"ˈ৺߭㹿䅸Ў≵᳝ᷛㅒ༈
4.
char Title[30];
// ᷛ乬
5.
char Artist[30];
// ԰㗙
6.
char Album[30];
// ϧ䕥
7.
char Year[4];
// ߎકᑈҷ
8.
char Comment[28];
// ໛⊼
9.
char reserve;
// ֱ⬭
10.
char track;
// ䷇䔼
11.
char Genre;
// 亢Ḑ
12. }ID3V1, *pID3V1;
ᔧ៥Ӏⳟњ䖭Ͼ㒧ᵘԧⱘॳൟПৢˈ៪䆌ҷⷕজ໮ⳟពњϔѯ^_^DŽ
བᵰ MP3 ሒ䚼≵᳝ TAG ᷛㅒⱘ䆱߭Ң MP3 ⱘ༈䚼㦋প MP3 ⱘֵᙃˈे ID3V2
tagˈ䖭䞠៥Ӏ㽕ⶹ䘧া㽕ᅗᰃ MP3 ᭛ӊህϔᅮ᳝ ID3V2 tagDŽ᠔ҹ៥Ӏ೼ else Ё䇗
⫼ߑ᭄ Read_ID3V2();ߑ᭄ Read_ID3V2()ৠḋ೼ mp3play.c Ёᅲ⦄˖
1. /*
2.
* ߑ᭄ৡ˖Read_ID3V2
3.
* ᦣ䗄 ˖Ң MP3 ᭛ӊ༈䚼䇏প ID3V2 ⱘֵᙃˈᑊᇚ䖭ѯֵᙃֱᄬ೼ϔϾܼሔ᭄㒘Ё
4.
* 䕧ܹ ˖- FileObject: file system
5.
*
- info: struct tag_info
6.
* 䕧ߎ ˖᮴
7.
* 䇈ᯢ ˖MP3 ᭛ӊ䛑᳝ ID3V2ˈࣙ৿њ԰㗙ˈ᳆Ⳃˈϧ䕥ㄝֵᙃˈ䭓ᑺϡ೎ᅮˈᠽሩњ ID3V1 ⱘֵᙃ䞣DŽ
8.
*/
9. void Read_ID3V2(FIL *FileObject, struct tag_info *info)
10. {
11.
uint32_t p = 0;
12.
13.
res = f_lseek(FileObject,0); /* ᅮԡࠄ᭛ӊⱘ༈䚼 */
14.
res = f_read(FileObject, &readBuf, READBUF_SIZE , &n_Read); /* Ң᭛ӊ༈䚼ᓔྟ䇏প
READBUF_SIZE Ͼᄫ㡖 */
15.
16.
if (strncmp("ID3", (char *) readBuf, 3) == 0)
/* ID3V3 ⱘ༈䚼ᷛㅒᖙ乏Ў“ID3” */
17.
{
18.
uint32_t tag_size, frame_size, i;
19.
uint8_t version_major;
20.
int frame_header_size;
21.
22.
/* ᷛㅒ໻ᇣˈࣙᣀᷛㅒ༈ⱘ 10 Ͼᄫ㡖੠᠔᳝ᷛㅒᏻⱘ໻ᇣ */
23.
tag_size = ((uint32_t) readBuf[6] << 21) | ((uint32_t) readBuf[7] << 14) | ((uint1
6_t) readBuf[8] << 7) | readBuf[9];
24.
25.
info->data_start = tag_size;
26.
version_major = readBuf[3];
/* ⠜ᴀোЎ ID3V2.3 ᯊህ䆄ᔩЎ 3 */
27.
28.
if (version_major >= 3)
29.
{
30.
frame_header_size = 10;
/* ID3V2.3 ⱘᷛㅒ༈Ў 10 Ͼᄫ㡖 */
31.
}
32.
else
33.
{
34.
frame_header_size = 6;
35.
}
36.
i = p = 10;
37.
38.
/* iterate through frames */
39.
while (p < tag_size)
/* Ңᷛㅒ༈ৢᓔྟ໘⧚ */
40.
{
41.
if (version_major >= 3)
42.
{
16 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
frame_size = ((uint32_t) readBuf[i + 4] << 24) | ((uint32_t) readBuf[i + 5
] << 16) | ((uint16_t) readBuf[i + 6] << 8) | readBuf[i + 7];
}
else
{
frame_size = ((uint32_t) readBuf[i + 3] << 14) | ((uint16_t) readBuf[i + 4
] << 7) | readBuf[i + 5];
}
if (i + frame_size + frame_header_size + frame_header_size >= sizeof(readBuf))
{
if (frame_size + frame_header_size > sizeof(readBuf))
{
res = f_lseek(FileObject,FileObject>fptr + p + frame_size + frame_header_size);
54.
res = f_read(FileObject, &readBuf, READBUF_SIZE , &n_Read);
55.
p += frame_size + frame_header_size;
56.
i = 0;
57.
continue;
58.
}
59.
else
60.
{
61.
int r = sizeof(readBuf) - i;
62.
memmove(readBuf, readBuf + i, r);
63.
res = f_read(FileObject, (char *) readBuf + r, i , &n_Read);
64.
i = 0;
65.
}
66.
}
67.
68.
/* ᏻᷛ䆚"TT2"/"TIT2"㸼⼎‫ݙ‬ᆍЎ䖭佪℠ⱘ ᷛ乬 */
69.
if (strncmp("TT2", (char *) readBuf + i, 3) == 0 || strncmp("TIT2", (char *) r
eadBuf + i, 4) == 0)
70.
{
71.
strncpy(info>title, (char *) readBuf + i + frame_header_size + 1, MIN(frame_size - 1, sizeof(info>title) - 1));
72.
if( ( info->title[0] == 0xFE && info->title[1] == 0xFF ) || ( info>title[0] == 0xFF && info->title[1] == 0xFE ) )
73.
{
74.
/* unicode Ḑᓣ*/
75.
memset(info->title,0,sizeof(info->title));
76.
printf( "-- MP3 title no support unicode \r\n");
77.
}
78.
}
79.
80.
/* ᏻᷛ䆚"TP1"/"TPE1"㸼⼎‫ݙ‬ᆍЎ䖭佪℠ⱘ ԰㗙 */
81.
else if (strncmp("TP1", (char *) readBuf + i, 3) == 0 || strncmp("TPE1", (char
*) readBuf + i, 4) == 0)
82.
{
83.
strncpy(info>artist, (char *) readBuf + i + frame_header_size + 1, MIN(frame_size - 1, sizeof(info>artist) - 1));
84.
85.
if( ( info->artist[0] == 0xFE && info->artist[1] == 0xFF ) || ( info>artist[0] == 0xFF && info->artist[1] == 0xFE ) )
86.
{
87.
/* unicode Ḑᓣ*/
88.
memset(info->artist,0,sizeof(info->artist));
89.
printf( "-- MP3 artist no support unicode \r\n");
90.
}
91.
}
92.
93.
p += frame_size + frame_header_size;
94.
i += frame_size + frame_header_size;
95.
}
96.
}
97. }
-----------------------------------------------------------------------------------------------㽕ᛇ䇏ព䖭Ͼߑ᭄ˈ៥Ӏজ㽕ᴹϔ⃵ MP3 ⶹ䆚ⱘᠿⳆњ^_^ĂĂ
ID3V2 ࠄ⦄೼ϔ᳝݅ 4 Ͼ⠜ᴀˈԚ⌕㸠ⱘ᪁ᬒ䕃ӊϔ㠀াᬃᣕ㄀ϝ⠜ᴀˈे
ID3V2.3DŽ⬅Ѣ ID3V1 䆄ᔩ೼᭛ӊሒ䚼њˈᬙ ID3V2 ህা㛑䆄ᔩ೼༈䚼њˈгℷᰃ䖭
Ͼॳ಴ˈᇍ ID3V2 ⱘ᪡԰㽕↨ ID3V1 ᜶ˈ䖭гᰃ៥Ӏ೼⿟ᑣЁ‫ܜ‬Ẕ⌟ ID3V1 ⱘॳ಴ˈ
17 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
া㽕៥ӀẔ⌟ࠄ ID3V1 ህϡ⫼এẔ⌟ ID3V2 њˈ‫މ‬ϨẔ⌟ ID3V2 ⱘҷⷕᅲ⦄㽕໡ᴖᕫ
໮DŽ㗠Ϩ ID3V2 㒧ᵘ↨ ID3V1 㒧ᵘ㽕໡ᴖᕜ໮ˈԚ↨ ID3V1 ܼ䴶ϨৃҹԌ㓽੠ᠽሩDŽ
↣Ͼ ID3V2.3 ⱘᷛㅒ䛑᳝ϔϾᷛㅒ༈੠㢹ᑆϾᷛㅒᏻ៪ϔϾᠽሩᷛㅒ༈㒘៤DŽ݇
Ѣ᳆Ⳃⱘֵᙃབᷛ乬ǃ԰㗙ㄝֵᙃ䛑ᄬᬒ೼ϡৠⱘᷛㅒᏻЁˈᠽሩᷛㅒ༈੠ᷛㅒᏻᑊ
ϡᰃᖙ㽕ⱘˈԚ↣Ͼᷛㅒ㟇ᇥ᳝ϔϾᷛㅒᏻDŽᷛㅒ༈੠ᷛㅒᏻϔ䍋ᄬᬒ೼ MP3 ᭛ӊⱘ
佪䚼DŽ
z ᷛㅒ༈
೼᭛ӊⱘ佪䚼乎ᑣ䆄ᔩ 10 Ͼᄫ㡖ⱘ ID3V2.3 ⱘ༈䚼ˈ᭄᥂㒧ᵘབϟ˖
1.
2.
3.
4.
5.
cha Header[3];
char Ver
char Revision
char Flag
char Size[4]
// ᖙ乏Ў“ID3”ˈ৺߭䅸Ўᷛㅒϡᄬ೼
// ⠜ᴀোЎ ID3V2.3 ህ䆄ᔩЎ 3
// ࡃ⠜ᴀোℸ⠜ᴀ䆄ᔩЎ 0
// ᄬᬒᷛᖫⱘᄫ㡖ˈ䖭Ͼ⠜ᴀাᅮНњϝԡ
// ᷛㅒ໻ᇣˈࣙᣀᷛㅒ༈ⱘ 1 Ͼᄫ㡖੠᠔᳝ⱘᷛㅒᏻⱘ໻ᇣ
ᷛㅒ໻ᇣⱘ䅵ㅫ˖
ϔ݅ಯϾᄫ㡖ˈԚ↣Ͼᄫ㡖া⫼ 7 ԡˈ᳔催ԡᘦЎ 0ˈḐᓣབϟ˖
0xxxxxxx, 0xxxxxxx, 0xxxxxxx, 0xxxxxxx
䅵ㅫⱘᯊ‫׭‬㽕ᇚ 0 এᥝˈᕫࠄϔϾ 28 ԡⱘѠ䖯ࠊ᭄ˈህᰃᷛㅒ໻ᇣˈ
䅵ㅫ݀ᓣབϟ˖
1.
2.
3.
4.
5.
int total_size;
total_size = (Size[0]&0x7f) << 21
+(Size[1]&0x7f) << 14
+(Size[3]&0x7f) << 7
+(Size[4]&0x7f);
ⳟࠄ䖭ᇍҷⷕⱘᅲ⦄ᰃϡᰃ᳝⚍ᛳ㾝њਔˈ߿ᗹˈϟ䴶៥Ӏ㒻㓁ᴹᢼᓔ䙷ሖሖ䗋
䳒^_^ĂĂ
z ᏻᷛ䆚
⫼ಯϾᄫヺᷛ䆚ϔϾᏻˈ䇈ᯢϔϾᏻⱘ‫ݙ‬ᆍ৿Нˈᐌ⫼ⱘᇍ✻བϟ˖
TIT2˖ᷛ乬ˈ㸼⼎‫ݙ‬ᆍЎ䖭佪℠ⱘᷛ乬
TPE1˖԰㗙
TALB˖ϧ䕥
18 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
TRCK˖䷇䔼(Ḑᓣ˖N/Mˈ݊Ё N Ўϧ䕥Ёⱘ㄀ N 佪ˈM Ўϧ䕥Ё݅ M 佪ˈN ੠
M Ў ASCII ⷕ㸼⼎ⱘ᭄ᄫ)
TYPE˖ᑈҷ
ᰃ ASCII ⷕ㸼⼎ⱘ᭄ᄫ
TCON˖㉏ൟ Ⳉ᥹⫼ᄫヺІ㸼⼎
COMM˖໛⊼ Ḑᓣ˖Āeng\0 ໛⊼‫ݙ‬ᆍāˈ݊Ё eng 㸼⼎໛⊼᠔Փ⫼ⱘ㞾✊䇁㿔
Ԛ㽕⊼ᛣˈ䖭䞠䴶᳝ѯᏻᷛ䆚 ID3V2 䞠䴶ᰃ≵᳝ⱘˈԚᷛ乬੠԰㗙ϔ㠀䛑Ӯ᳝DŽ
㽕ᛇⶹ䘧 ID3V2 ᰃ৺ࣙ৿᳝䖭ѯֵᙃˈ៥Ӏৃҹ⫼ 16 䖯ࠊⱘ㓪䕥఼ᴹᶹⳟ MP3 ᭛
ӊˈID3V2 ೼༈䚼ˈID3V1 ೼ሒ䚼DŽ㗗㰥ࠄ໻ᆊৃ㛑≵᳝⫼䖛 16 䖯ࠊⱘ㓪䕥఼ˈ᠔ҹ
䞢☿೼‫Ⲭܝ‬䌘᭭ljᐌ⫼ҷⷕ㓪䕥䕃ӊNJ䖭Ͼ᭛ӊ།ϟᦤկњ Uedit32 䖭Ͼ 16 䖯ࠊ㓪䕥
఼ˈ䖭Ͼ㓪䕥఼䖬ৃҹ䯙䇏 c/c++ҷⷕˈࡳ㛑䴲ᐌᔎ໻DŽ
z ᏻ໻ᇣⱘ䅵ㅫ
䖭Ͼৃ≵᳝ᷛㅒ༈ⱘㅫ⊩䙷М咏⚺ˈ↣Ͼᄫ㡖ⱘ 8 ԡܼ⫼ˈḐᓣབϟ˖
xxxxxxxx, xxxxxxxx, xxxxxxxx, xxxxxxxx
ҷⷕབϟ˖
1.
2.
3.
4.
5.
int FSize;
FSize = Size[0] * 0x100000000
+Size[1] * 0x10000
+Size[2] * 0x100
+Size[3];
-----------------------------------------------------------------------------------------------䆆ࠄ䖭䞠ˈRead_ID3V2()ߑ᭄䞠䴶ⱘҷⷕ໻ӭгᑨ䆹⧚㾷ⱘᏂϡ໮њ^_^DŽϟ䴶៥
Ӏ‫ݡ᥹ݡ‬ढ़ˈ䍕ⴔ࢓༈ᡞৢ䴶ⱘҷⷕгϔষ⇨䇏ᅠ৻DŽ
TXDCS_SET( 0 );
⫼Ѣ䗝ᢽ vs1003 ⱘ᭄᥂ッষˈ‫ޚ‬໛ᕔ vs1003 Ё䕧᭄ܹ᥂DŽ݊Ё
TXDCS_SET( 0 );ᰃ೼
1.
#define XDCS
vs1003.h Ёᅲ⦄ⱘϔϾᅣ˖
(1<<6)
// PC6-XDCS
2.
3.
#define TXDCS_SET(x)
GPIOC->ODR=(GPIOC->ODR&~XDCS)|(x ? XDCS:0)
19 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
㋻᥹ⴔ䖯ܹϔϾ໻ᕾ⦃Ё᪁ᬒ៥Ӏⱘ mp3 ᭛ӊDŽ
ߑ᭄ f_read(
&fsrc, buffer, sizeof(buffer), &br );Ң᭛ӊЁ䇏প
512 Ͼᄫ㡖ⱘ᭄
᥂ࠄ㓧‫ކ‬ऎЁˈ㟇ѢЎҔМᰃ 512 Ͼᄫ㡖ˈ㗠ϡᰃ 1024 ៪㗙᳈໮ˈ䖭ᰃ಴Ўवⱘϔ
Ͼ sector ᰃ 512 Ͼᄫ㡖ˈϔ⃵া㛑䇏পϔϾ sectorDŽ
ߑ᭄ VS1003_WriteByte(
buffer[count] );ᇚ㓧‫ކ‬ऎЁⱘ᭄᥂‫ܹݭ‬
vs1003 ⱘ᭄᥂㓧‫ކ‬
ऎDŽ⊼ᛣˈ䖭䞠ϔ⃵া㛑‫ ܹݭ‬32 Ͼᄫ㡖ˈ䖭ᰃ಴Ў vs1003 ⱘ FIFO ⱘ໻ᇣЎ 32 Ͼᄫ
㡖ˈ‫ݭ‬໮њ᮴ᬜDŽ
ᔧ᭛ӊߎ䫭៪㗙ϔ᳆᪁ᬒᅠ↩ᯊህ䏇ߎ for ᕾ⦃ˈᑊᠧॄߎĀ᪁ᬒ㒧ᴳāⱘ䇗䆩
ֵᙃDŽ
ḍ᥂ VS1003 ⱘ㽕∖ˈ೼ϔ᳆㒧ᴳৢ䳔থ䗕 2048 Ͼ 0 ᴹ⹂ֱϟϔ佪ⱘℷᐌ᪁ᬒDŽ
ϔ᳆᪁ᬒᅠ↩៥Ӏ݇䯁 vs1003 ⱘ᭄᥂ッˈ݇䯁ᠧᓔⱘ᭛ӊˈㄝᕙϟϔ᳆ⱘ᪁ᬒˈ
ⳈࠄⳂᔩϟⱘ䷇乥᭛ӊ᪁ᬒᅠЎℶDŽ䖬᱖ϡᬃᣕᕾ⦃᪁ᬒⱘࡳ㛑DŽ
䖭䞠䴶⍝ঞࠄњ vs1003 ᪡԰ⱘϔѯ⡍ᗻˈ䳔໻ᆊখ㗗 vs1003 ⱘ datasheet ᴹᐂ
ࡽ⧚㾷ˈ䞢☿ᓎ䆂໻ᆊҨҨ㒚㒚ഄ䯙䇏ˈϡ㽕಴Ў䲒ᑺ៪㗙ᰃ㐕⧤㗠䗔㓽ˈ㽕ⶹ䘧԰
ЎϔϾጠܹᓣ䕃ӊᓔথᎹ⿟Ꮬˈ䯙䇏 ic datasheet˄Ё᭛/㣅᭛˅ᰃϔ⾡ᖙ໛ⱘᡔ㛑DŽ
ᅲ偠⦄䈵->
ᇚ䞢☿ STM32 ᓔথᵓկ⬉(DC5V)ˈᦦϞ JLINKˈᦦϞІষ㒓(ϸ༈䛑ᰃ↡ⱘѸঝ
㒓)ˈᦦϞ MicroSD व( ៥⫼ⱘᰃ 1G )ˈ೼वⱘḍⳂᔩϟ㽕᳝ mp3 ᭛ӊˈ᭛ӊৡ㽕ᰃ㣅
᭛ˈ᱖ϡᬃᣕЁ᭛੠䭓᭛ӊৡˈᠧᓔ䍙㑻㒜ッˈ䜡㕂䍙㑻㒜ッЎ 115200 8-N-1ˈᇚ㓪
䆥དⱘ⿟ᑣϟ䕑ࠄᓔথᵓˈेৃⳟࠄ䍙㑻㒜ッᠧॄߎབϟֵᙃ˄೼ LCD 䞠䴶ⱘᬜᵰ೒
䖭䞠ህ≵᳝ᢡ✻њˈ໻ᆊ㾕䇙^_^˅˖
20 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
21 / 22
䞢☿ stm32 ᓔথᵓ⎬ᅱᅬᮍϧप˖http://firestm32.taobao.com
䖭ϸᓴᰃ LCD 䞠䴶ᰒ⼎ⱘֵᙃˈϡ䖛೼⌟䆩ᯊ䞢☿ᤶњ佪℠᳆^_^DŽ
៥ⱘवⱘḍⳂᔩϟᬒњ 3 Ͼ mp3 ᭛ӊˈ䛑ᰃ Eason ⱘ℠(಴ЎϾҎ䴲ᐌ୰⃶䰜༩
䖙ⱘ℠^_^)ˈߚ߿ᰃ䘹䖰ⱘཌྷ(yydt.mp3)ǃϔϱϡᣖ(ysbg.mp3)ǃ乘ᛳ
(yugan.mp3)DŽᦦϞ㘇ᴎˈ䷇䋼෾↨⬉㛥ˈ䷇䞣ৃ䗮䖛㘇ᴎᴹ䇗ˈࠡᦤᰃԴⱘ㘇ᴎ㽕㛑
䇗㡖䷇䞣ᠡ㸠DŽ
ᅲ偠䆆㾷ᅠ↩ˈ䞢☿⼱໻ᆊᄺдᛝᖿ^_^DŽ
22 / 22