䞢☿ 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
© Copyright 2026 Paperzz