53-CS43L22_MP3-Library (STM32F4)

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 :

ub_stm32f4_cs43l22_mp3_v101

Hier der komplette CooCox-Projektordner zum Download :

Demo_53_MP3

Hier das PC-Programm zum umwandeln von MP3-Files in C-Files zum Download :

FileConverter_UB_v103

2 Antworten auf 53-CS43L22_MP3-Library (STM32F4)

  1. Tobias sagt:

    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?

    • admin_ub sagt:

      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.


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert