Mit dieser Library kann der Audio-DAC (CS43L22) vom Discovery-Board benutzt werden um MP3-Files aus dem Flash abzuspielen.
(es gibt auch noch eine andere Lib um MP3 vom USB-Stick abzuspielen)
Die MP3-Files müssen mit einer Sampling-Frq von 44,1 kHz vorliegen.
Mit meinem PC-Programm “FileConverter” können beliebige MP3-Files in ein C-Format umgewandelt werden um dieses dann im Projekt hinzufügen zu können.
Mit dem Online-Converter “cut-mp3.com” können MP3-Files online geschnitten werden.
Das MP3 kann entweder nur einmal “single” oder endlos “loop” abgespielt werden. Es gibt noch Funktionen für Pause, Resume, Stop und Volume.
Hinweis : Der I2S-Clock und der notwendige PLL muss nicht im “system_stm32f4xx.c-File” eingestellt werden, das wird von der Library erledigt.
MP3-Decoder :
Als MP3-Decoder habe ich Helix-MP3 benutzt (der Link dazu steht im Quellfile)
Fehlerkorrektur :
Falls beim umwandeln eines Frames ein Fehler erkannt wird, überspringt die Software einfach 1000 Bytes…das funktioniert für mich und ich habe auch im Netz keine einheitliche Lösung gefunden. Falls da jemand was “eleganteres” hat…bitte melden.
Mit der Funktion “UB_CS43L22_GetMP3Err” kann der letzte Fehler ausgelesen werden.
Benutzte Pins :
1 2 3 4 5 6 7 | PB9 = SDA PB6 = SCL PA4 = WS PC7 = MCLK PC10 = SCK PC12 = SD PD4 = Reset |
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : SPI, DMA, MISC Benutzte Librarys : STM32_UB_I2C1 |
Enumerationen :
1 2 3 4 5 6 7 8 9 10 11 | typedef enum { MP3_OK = 0, // kein Fehler MP3_INIT_ERR, // Fehler beim init MP3_MALLOC_ERR, // nicht genug RAM frei MP3_SYNC_ERR, // kein Sync gefunden MP3_FRQ_ERR, // Fehler bei Samplefrq MP3_FRAME_ERR, // sonstiger Frame fehler MP3_IDATA_ERR, // INDATA_UNDERFLOW MP3_MDATA_ERR, // MAINDATA_UNDERFLOW MP3_DECODE_ERR // sonstige Dekoder fehler }MP3_ERR_t; |
Funktionen :
1 2 3 4 5 6 7 8 | ErrorStatus UB_CS43L22_InitMP3(void); // init vom CS43L22 MP3_ERR_t UB_CS43L22_PlayMP3Single(UB_MP3 *mp3, uint8_t Volume); // PLAY (einmal) MP3_ERR_t UB_CS43L22_PlayMP3Loop(UB_MP3 *mp3, uint8_t Volume); // PLAY (Endlos) void UB_CS43L22_PauseMP3(void); // PAUSE void UB_CS43L22_ResumeMP3(void); // WEITER (nach Pause) void UB_CS43L22_StopMP3(void); // STOP void UB_CS43L22_SetVolumeMP3(uint8_t Volume); // zum einstellen der Lautstärke MP3_ERR_t UB_CS43L22_GetMP3Err(void); // zum auslesen der Fehlernummer |
Beispiel :
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | //-------------------------------------------------------------- // File : main.c // Datum : 12.08.2013 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.0 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der MP3-Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_led.h" #include "stm32_ub_cs43l22_mp3.h" int main(void) { ErrorStatus check; SystemInit(); // Quarz Einstellungen aktivieren // init der LEDs UB_Led_Init(); // init vom CS43L22 (als MP3) check=UB_CS43L22_InitMP3(); if(check==SUCCESS) { UB_Led_On(LED_GREEN); // abspielen der MP3 in einer Endlosloop UB_CS43L22_PlayMP3Loop(&skinny_mp3, 70); } else { UB_Led_On(LED_RED); } while(1) { } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
Hier das PC-Programm zum umwandeln von MP3-Files in C-Files zum Download :
Hallo,
habe gerade den Code mal ausprobiert, respektive in mein eigenes Projekt integriert. Eine Hardware zum Testen habe ich zwar noch grade nicht zur Hand, aber es compiliert schon mal (die wenigen Warnungen, die ausgegeben werden, stammen vom Helix selber, das habe ich korrigiert) und ich denke es wird laufen. Danke für den Code!
was mir allerdings auffällt: der gesamte Code basiert auf Fixpoint Arithmetik. Ich frage mich, ob man da noch etwas mehr Performance rausholen könnte, indem man Floating Point verwendet und die FPU des CM4 zum Einsatz bringt? schliesslich ist die doch für solche Berechnungen da Ausserdem könnte man vermutlich viele interne Berechnungen des Helix an den CM4 anpassen, es gibt ja da sehr spezialisierte Instruktionen z.B. für MAC usw.
Hast du da eine Idee dazu?
nein, da hab ich mich noch nicht mit beschäftigt. Aber Helix gibt es auch als “floating point decoder” schau mal bei deren Webseite vorbei.