Forum: Mikrocontroller und Digitale Elektronik STM32F4 Discovery MP3 Player - komplett mit Code


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Marco W. (watz)


Angehängte Dateien:

Lesenswert?

Mahlzeit,

ich hab mein STM32F4 Discovery Board zum Abspielen von MP3s ertüchtigt. 
Unterstützung für ein Display ist noch nicht dabei. Ich denke der Code 
ist aber schon als Basis für den ein oder anderen geeignet, der 
ähnliches mit seinem Discovery Board vor hat. Ein bischen Code fürs 
auslesen von ID3v2 hab ich mit reingebastelt.

Der DAC wird über I2S und einen circular DMA buffer bedient.

Es muß lediglich eine SD Karte angeschlossen werden. Optional können 
Ausgaben schon über den UART an PA2 auf dem PC angeschaut werden. 
Details siehe Kommentar in main.c ganz oben. Die Karte muß beim 
Einschalten bereits stecken. Es werden dann alle MP3s so abgespielt wie 
sie in der FAT liegen. Mit dem blauen User Button kann der Titel 
übersprungen werden.

Die Klangqualität ist subjektiv beeindruckend gut.

Zum Bauen verwende ich Code Sourcery Lite + Eclipse Indigo + CDT/GNU ARM 
plugins sowohl auf Windows als auch auf Linux. Ich hab das entsprechende 
Projekt samt Sourcen angehangen.

Gruß,
Watz

P.S.: Die UART Ausgaben sehen so aus:
1
SD: Connected to card
2
SD: File system mounted
3
Mp3PlayAllFiles: Playing all files in "/"
4
Mp3PlayAllFiles: FILE "/10-THE~1.MP3"
5
Mp3Decode: Start decoding "/10-THE~1.MP3"
6
Mp3Decode: Skipping 2266 bytes of ID3v2 tag
7
Mp3Decode: Now playing (ID3v2): Within Temptation - The Truth Beneath The Rose
8
Mp3Decode: 44100 Hz 16 Bit 2 Channels
9
Mp3Decode: frame 0, bitrate=128000
10
Mp3Decode: frame 100, bitrate=160000
11
Mp3Decode: frame 200, bitrate=160000
12
Mp3Decode: frame 300, bitrate=160000
13
Mp3Decode: frame 400, bitrate=192000
14
Mp3Decode: frame 500, bitrate=192000
15
Mp3Decode: frame 600, bitrate=192000
16
Mp3Decode: frame 700, bitrate=224000
17
Mp3Decode: frame 800, bitrate=224000
18
Mp3Decode: frame 900, bitrate=192000
19
Mp3Decode: Stop requested
20
Mp3Decode: Finished decoding
21
Mp3PlayAllFiles: FILE "/11-FOR~1.MP3"
22
Mp3Decode: Start decoding "/11-FOR~1.MP3"
23
Mp3Decode: Skipping 2248 bytes of ID3v2 tag
24
Mp3Decode: Now playing (ID3v2): Within Temptation - Forgiven
25
Mp3Decode: 44100 Hz 16 Bit 2 Channels
26
Mp3Decode: frame 0, bitrate=128000
27
Mp3Decode: frame 100, bitrate=160000
28
Mp3Decode: frame 200, bitrate=160000
29
Mp3Decode: frame 300, bitrate=160000
30
Mp3Decode: frame 400, bitrate=192000
31
Mp3Decode: frame 500, bitrate=256000
32
Mp3Decode: frame 600, bitrate=160000
33
Mp3Decode: frame 700, bitrate=160000
34
Mp3Decode: frame 800, bitrate=128000
35
Mp3Decode: frame 900, bitrate=128000

von temp (Gast)


Lesenswert?

Interessant. Ich habe mal kurz reingeschaut. Die Dsp-Möglichkeiten des 
F4 nutzt scheinbar noch keiner. Leider.

http://www.stm32circle.com/projects/project.php?id=82

Hier gibts ein Projekt, da sind wenigstens die polyphase-Geschichten vom 
Helix-Decoder nativ in thumb2-Assembler. Das könnte bei dir eventuell 
auch noch was bringen.

von Marco W. (watz)


Lesenswert?

Ja den Code aus dem Projekt hatte ich auch schon hier. Eigentlich wollte 
ich die thumb2 optimierten Funktionen dann übernehmen wenn der Rest 
erstmal funktioniert. Mach ich vielleicht noch wenn ich die MCU Power 
mal brauche. Es scheint im Moment noch mehr als genug davon da zu sein.

Ich hab mal versehentlich die I2S Clock mit der Bitrate (256000) statt 
der Samplerate (44100) erzeugt, was dann die MP3s im "Turbomodus" 
abgespielt hat. Kling so ähnlich wie wenn jemand im Fernsehen einen 
Anrufbeantworter vorspult :-) Selbst in dem Fall hat er jeden Song 
stotterfrei durchgespielt.

Jetzt kommt erstmal ein altes S60 Display dran. Ich hoffe, tatsächlich 
die JPGs aus dem ID3 Tag umrechnen und anzeigen zu können. Flash ist 
noch genug da....nichtmal 20% voll.

Gruß,
Watz

von Thomas H. (Firma: SuE) (tomy)


Lesenswert?

Hallo Marco,

habe mal das MP3 als Projekt in Indigo importiert und mit Sourcery G++ 
Lite übersetzt.
Dabei entstehen 96 „could not be resolved“ Fehler in main.c obwohl alle 
12 Includes da sind.
Das System hat im ersten Lauf die Ausgabe Files  erzeugt.

Gibt’s dafür ne Erklärung. Z.B. „Field ‚palClearPad(GPIOD, 12)’ could 
not be solved…..

Tomy

von Uli (Gast)


Lesenswert?

NETT !

a) wieviel "Wumms" hat eigentlich der AMP?
Reicht das als "Küchenradio" mit einem richtigen Lautsprecher dran?


b) kann das Board nicht auch USB-Host ?
Ein Stick wäre noch deutlich eleganter ...

ciao

von Marco W. (watz)


Lesenswert?

Also diese Fehlermeldungen kommen von irgendeinem statischen Analysetool 
welches im Indigo standardmäßig aktiv und offensichtlich noch nicht so 
ausgereift ist.

Über den verfügbaren USB OTG Port sollte auch Host gehen. Implementier 
mal USB Host mit Zugriff auf Mass Storage :-) Der MMCSPI Code vom 
ChibiOS schafft bei einigen meiner SD Karten schon > 2 MByte/s. Ich muß 
erstmal das Display zum Laufen bringen. Danach schau ich mal für was 
noch Resourcen da sind.

Angeblich kann der DAC 2 * 1W @ 8R bringen: 
http://www.cirrus.com/en/products/cs43l22.html

Das sollte eigentlich mehr als genug für ein Küchenradio sein....

Gruß,
Watz

von Christian B. (christian_b)


Lesenswert?

@tomy: Hast Du mal versucht den Index neu aufzubauen ? Also im Project 
Explorer rechtsklick auf das Projekt und dann Index > Rebuild.
Ich hab da auch schon öfters nach Fehlern gesucht die in Wirklichkeit 
keine waren.

Grüße

von Uli (Gast)


Lesenswert?

> Implementier mal USB Host mit Zugriff auf Mass Storage :-)

hihi, ja genau. Das ist mir schon bekannt, dass das nicht ganz trivial 
ist. Vielleicht kann man da ja auch irgendwann arbeitsteilig vorgehen.

Meiner Idealvorstellung eines Einchip-Blaiers kommt das Ding schon sehr 
nahe. Schade, dass die eingebaute D/A nur 12 Bit ist, aber eigentlich 
sollte das doch auch für "Küchenradio" reichen.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Uli schrieb:
> Einchip-Blaiers

ist das sächsisch?

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

ich nehme zwar FreeRTOS, aber USB Host habe ich mit dem F4 mit den Libs 
von ST amlaufen. Ich weiß bei den Chibi vertretern nich unbedingt ger 
gesehen aber bisher hat das Lib auch noch keiner in die HAL portiert.

du musst quasi nur die USB_Init einmal ausführen, dann im IDLE oder 
einem anderen niederen Task die USB Process.

In der USB_usr.c sind dann Callbacks die der Kernel aufruft. Wenn du 
dann Fatfs nutzt soltest du dir von der USR_Application mit einer 
Semaphore zusichern lassen das USB bereit ist. Wenn du dann mit 
Abspielen fertig bist gibbste die Sem zurück und USB_Process kan weiter 
laufen. Die ist nicht zeit kritisch aber ab und an musst die sem mal 
zurück geben.

Was ich aber gern wüsste ist hast du bei 100% Volume auch etwas 
schnarren auf dem Ton? Bei mir merkt an es nicht doll aber es stört mich 
noch.
Vllt hast du ja n Tip für mich.

MfG

Tec

von Micha (Gast)


Lesenswert?

Tec Nologic schrieb:
> ich nehme zwar FreeRTOS, aber USB Host habe ich mit dem F4 mit den Libs
> von ST amlaufen.
Kann man den Code irgendwo einsehen?

von Alex E. (tecnologic) Benutzerseite


Lesenswert?


von Marco W. (watz)


Lesenswert?

Den I2S Code hab ich doch auch aus dem ST Sample für den WAV Player 
rausgerissen und alles für meinen Zweck nutzlose bzw. nicht unbedingt 
nötige entfernt. An sich sollte das dann auch dem USB Host Code daraus 
funktionieren so wie Du sagst.

100% Volume hab ich noch nicht probiert; es war mir bis jetzt laut genug 
auf dem Kopfhöhrer :-) Das Kratzen kommt bestimmt vom Clipping. Leider 
hat ST auf dem Discovery Board die VP Pins vom DAC nur an 3V gehängt 
statt an 5V. Laut Datenblatt gehen da dann auch nur ~2x500mW@8R. Man 
kann allerdings wohl einen gebrückten Mono Betrieb konfigurieren.

Gruß,
Watz

von Marco W. (watz)


Lesenswert?


von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Ja ist ein ganzschöner Kraken mittlerweile. Ohne das das Programm viel 
macht. Weißt du ob ich das Clipping irgend wie weglassen kann oder muss 
ich doch Libmad nehmen. Denn der DAC kann ja auch 24 und 32Bit PCM 
ausgeben.

von Marco W. (watz)


Lesenswert?

Nein ich denke das die Endstufe ins Clipping kommt. Womöglich wäre das 
mit 5V an den VP Pins vom DAC besser (zumindest deutlich lauter bis er 
clipped).

Bis 95% ists bei mir sauber. Bei 100% ists so brutal laut, dass da auch 
der Kopfhöhrer keine gute Figur mehr macht. LS hab ich noch nicht 
versucht.

Hast Du mal mit den Output Devices gespielt ?
#define OUTPUT_DEVICE_SPEAKER         1
#define OUTPUT_DEVICE_HEADPHONE       2
#define OUTPUT_DEVICE_BOTH            3
#define OUTPUT_DEVICE_AUTO            4

Gruß,
Watz

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Ja damit habe ich gespielt.

Auto         geht so wie beschrieben. (Ich habe aber das Gefühl der 
erkennt meine Lautsprecher als Kopfhörer.)
Speaker      geht an meinen Lautsprecher gar nicht, da werden die 3V 
nicht ausrechend sein.
HeadPhone    hab ich noch nicht probiert werde ich am WE mal machen.
Dann werd ich auch mal Kopfhöhrer gegen Lautsprecher testen.
Ich bin gespannt.

Aber wenn das ein HW Problem zusein scheint bin ich erst mal zufrieden 
mit dem MP3 Decodeing also kann ich mich der eigendlichen Umsetzung 
meines Projektes widmen. Ich muss den DAC ja nicht auf 100% haben ich 
kann ja an den Lautsprechern den Ton einstellen.

Falls du noch fragen wegen dem USB Host hast immer her damit :)

MfG

Tec

von Marco W. (watz)


Lesenswert?

In Deinem Code kann ich ja sehen wie es gemacht wird :)

Prio hat für mich das Display. Ich will die Album Art parsen und auf dem 
Display so groß wie möglich darstellen (d.h. das "cover" Image im 
ID3v2). Die sind meist 600x600, d.h. eine Herausforderung. Mit 
"picojpeg" sollte das mit ein paar K RAM gehen, allerdings weiß ich noch 
nicht wie schnell.

Ziel sind erstmal zwei MP3 Player für die Kids in Holzkisten. Da sie 
noch nicht Lesen können, sollen Sie über die Bilder und zwei einfache 
Taster auswählen :-)

Die USB Host Sache könnte ichs fürs Auto brauchen. Mein alter Vectra hat 
Lenkrad Fernbedienung und Display mit passendem Radio. Die möchte ich 
nicht missen. MP3s kennt das nicht. Man kann aber wohl per UART oder I2C 
einen Wechsler simulieren, sodass man am Radio den Wechsler als Quelle 
wählen und steuern kann und dann dessen Audio Eingänge nutzen kann. Das 
STM32F4 könnte sowohl das als auch den Abspieler übernehmen, quasi 
wieder eine all-in-one Lösung für 16€ :-)

Gruß,
Watz

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Was das angeht ist dieses Board echt geil. Ich hatte auch keine Lust für 
mein Wecker die Audio Entstufe auf zu bauen. Den einzigen nachteil den 
ich habe ist das SDIO mit dem I2S von dem DAC kollidiert. SD-Karte geht 
also nur über SPI wie du das mit dem Chibi Treiber gemacht hast. Da kamm 
dann die Idee mit dem USB. Und dann habe ich im Debugger den 
Programmablauf des Stacks analysiert um mich da rein zuhängen. Deine ID3 
tag Geschichte werde ich glaube ich übernehmen. Zumindest die Texte ich 
hab nur n GrafikDisplay.
Erst mal mache ich aber die spiel einen Order sachen. damit das Ding 
nicht immer das gleiche spielt.

MfG

Tec

von Uli (Gast)


Lesenswert?

> Einchip-Blaiers
ist das sächsisch?

Keine Ahnung - war noch nie in Sachen ;)

von Marco W. (watz)


Lesenswert?

Also ID3v2 < .3 support werde ich wohl noch reinhacken...ich hab 
tatsächlich noch MP3s gefunden, welche das nutzen. SDIO hat mich erst 
auch gereizt (gibt auch Treiber im ChibiOS), aber ich habs dann wegen 
des I2S sein gelassen. USB schien mir erstmal mehr Aufwand zu sein als 
einen SD Slot dranzustecken.

Das Board ist wirklich klasse für die paar Kröten. Mein 97er AMD K5 mit 
133Mhz hat nur mit dem damals brandneuen Winamp MP3s stotterfrei 
abgespielt....bei fast 100% CPU Auslastung.

Was die subjektive Klangqualität angeht, ist das glaube ich der beste 
MP3 player den ich bisher hatte. Der Sound ist glasklar und sehr 
dynamisch.

von Marco W. (watz)


Lesenswert?

Wie wärs denn noch hiermit ?

http://wiki.xiph.org/Tremor

Die low-mem Variante soll auch mit ~60k code und < 30k RAM auskommen.

von Matthias K. (matthiask)


Lesenswert?

Marco W. schrieb:
> Zum Bauen verwende ich Code Sourcery Lite + Eclipse Indigo + CDT/GNU ARM

Kannst Du genauer spezifizieren, welche Versionen man genau benötigt 
(Windows)? Vielleicht sogar mit einen genauen Link. Wäre schön...

von Marco W. (watz)


Lesenswert?

Ich hab Sourcery G++ Lite 2010q1-188 (für ARM GNU/Linux) von 
http://www.mentor.com/embedded-software/codesourcery gezogen und 
installiert.

Danach hab ich das aktuelle Eclipse Indigo für C/C++ Entwicklung gezogen 
und dann noch das GNU ARM plugin und das GDB Hardware Debugging plugin 
über Eclipse nachinstalliert. Eine Java JRE hast Du vermutlich schon 
drauf.

Hier steht wie es geht (mit Links): 
http://gnuarmeclipse.sourceforge.net/wiki/Plug-in_installation

Ich glaube da sollte schon reichen. Für das Discovery Board macht 
natürlich auch das ST-Link Package von ST Sinn: 
http://www.st.com/internet/com/SOFTWARE_RESOURCES/TOOL/DEVICE_PROGRAMMER/stm32_st-link_utility.zip

Gruß,
Watz

Die genauen Versionen sind:
1
Sourcery G++ Lite 2010q1-188
2
3
C/C++ Development Tools  8.0.2.201202111925  org.eclipse.cdt.feature.group  Eclipse CDT
4
  C/C++ Development Platform  8.0.2.201202111925  org.eclipse.cdt.platform.feature.group  Eclipse CDT
5
  C/C++ DSF GDB Debugger Integration  4.0.1.201202111925  org.eclipse.cdt.gnu.dsf.feature.group  Eclipse CDT
6
  C/C++ GNU Toolchain Build Support  8.0.2.201202111925  org.eclipse.cdt.gnu.build.feature.group  Eclipse CDT
7
  C/C++ GNU Toolchain Debug Support  7.1.1.201202111925  org.eclipse.cdt.gnu.debug.feature.group  Eclipse CDT
8
  CDT Common GDB Support  7.0.0.201202111925  org.eclipse.cdt.gdb.feature.group  Eclipse CDT
9
C/C++ GCC Cross Compiler Support  1.0.2.201202111925  org.eclipse.cdt.build.crossgcc.feature.group  Eclipse CDT
10
C/C++ GDB Hardware Debugging  7.0.0.201202111925  org.eclipse.cdt.debug.gdbjtag.feature.group  Eclipse CDT
11
Eclipse IDE for C/C++ Developers  1.4.2.20120213-0813  epp.package.cpp  null
12
  Eclipse Platform  3.7.2.M20120208-0800  org.eclipse.platform.ide  null
13
  EPP CPP Feature  1.4.2.20120213-0813  org.eclipse.epp.package.cpp.feature.feature.group  Eclipse Packaging Project
14
GNU ARM C/C++ Development Support  0.5.4.201202210114  org.eclipse.cdt.cross.arm.gnu.feature.group  SourceForge Project

von Thomas H. (Firma: SuE) (tomy)


Lesenswert?

Christian B. schrieb:
> @tomy: Hast Du mal versucht den Index neu aufzubauen ? Also im ProjectExplorer 
rechtsklick auf das Projekt und dann Index > Rebuild.Ich hab da auch schon öfters 
nach Fehlern gesucht die in Wirklichkeitkeine waren.Grüße

Habe ich heute probiert, bringt aber nix. Auch das MP3-USB geht durch 
und zeigt danach nen Haufen Fehler. Das nervt für Anfänger. Gibts 
irgendwo einen Schalter wo das ausgeknipst werden kann?
Habe Version: Indigo Service Release 2   Build id: 20120216-1857

Dann verliert Indigo oft den Umgebungs-PATH. Also noch echt buggy das 
Ding.

Tomy

von temp (Gast)


Lesenswert?

Es könnte alles so einfach sein, wenn man ein einfaches makefile hätte 
in dem nur der Pfad des Compilers noch ne Rolle spielt. Dann könnte man 
in eine beliebige Eclipse-Umgebung das ganze als Makefile-Projekt 
importieren. Alles andere ist nur Krampf. Ich frage mich immer wer sich 
die ganzen verschrobenen Dialoge in Eclipse ausdenkt.

von Uli (Gast)


Lesenswert?

Hallo alle zusammen,

also ich will ja hier niemandem zu nahe treten, aber mir scheint, da 
wird Schritt 2 klar vor Schritt eins gemacht.
Und es finden eine Menge IDE- und Umgebungs-K(r)ämpfe statt, wo man 
erstmal die Grundfunktionalität für alle zugänglich machen sollte.

Mein Ansatz wäre hier immer zuallererst mal ein klar minimalistischer.

man nehme ein paar Stücke MP3 unterschiedlicher Bitraten/VBR und binde 
diese direkt (wohl nacheinander wg Platz) in den Code ein und versuche 
zuallererst mal, die Basics sicher gängig zu bekommen. - und das auch 
auf verschiedenen IDES

Ich zB hab Keil und bin vorerst rein gar nicht an einem Display 
interessiert, daher tangieren mich die Anzeige-Dinge eher wenig.

Daher also mein Vorschlag, zuerst ein Basisprojekt zu machen, das MP3 
(aus dem internen Flash) ohne weitere Hardware sicher wiedergibt.
Klar ist da der Nutzen mit ein paar Sekunden eher klein, aber es geht ja 
erstmal nur ums Prinzip.
Alles drumherum könnte man zunächst weglassen, auch das ChanFS ..
Wenn also jemand für die Umgebung x sowas bereit stellt, will ich gerne 
versuchen, das in Keil zum Laufen zu bekommen.

Entsprechende MP3 Testdateien zum direkten Einbinden (const U8[] = {...} 
) kann ich gerne erzeugen, ich würde hier 64 kbit mono, 200 VBR und 320 
CBR für sinnvoll halten.

Dann könnte man auch mal eine belastbare Performance-Abschätzung machen 
und ggfs. das Clipping untersuchen.

Wie steht es mit den Befehlssatz-Erweiterungen der F4 CPU?
Kann/darf man die denn nun benutzen/ sind die offengelegt ?
Das müsste doch eine erhebliche Durchsatz-Verbesserung des Decoders 
ergeben.... wer kennt sich IM Helix aus ?

Hintenraus gibt es dann ja genügend Erweiterungen, ganz nach Belieben, 
angefangen von Display, FS, SD-Karte, RC5 Empfänger oder eben auch USB 
Horst....

"Tremor" kann doch nur OGG oder ? das würde mich dann eher nerven, alles 
umzukodieren ...

-> Marco
PS: Within Temptation war mir übrigens, trotz jahrzehntelangem, breit 
angelegtem Musikhören (von AAx bis ZZx)  noch kein Begriff.
Grade läuft Forgiven und das ist definitiv interessant :)
Und was soll denn das genau werden für die Kiddies ?

von hp-freund (Gast)


Angehängte Dateien:

Lesenswert?

Hab mal ein Makefile für gcc in Linux gebastelt. Ist aber noch nicht an 
der Hardware getestet.

Makefile in das Debug Verzeichnis kopieren und alles andere daraus 
löschen.

Im Debug Verzeichnis:

make

bzw.

make clean

ausführen...

von Uli (Gast)


Lesenswert?

Das original ST-Beispiel "Audioplayer von USB-Stick" spielt übrigens um 
einiges zu langsam ab.
ich hab das mal nachgemessen, aus 1000 Hz werden rund 948 Hz
Liegt also schon um einiges daneben.
Das ist also wohl ST selber über die Taktgenerierung gestolpert ;))

Wer eine Idee hat -> DANKE

von Uli (Gast)


Lesenswert?

Ach ja - und Marco:

Was soll das denn nun genau werden für Deine Kiddies ?

Uli

von pito (Gast)


Lesenswert?

Hi, I've tried the above Makefile, it compiles, but the hex is ~280kB 
large (orig is 183kB) and it does not play. Did somebody find the issue 
there? Thanks. Pito.

von Марко Кралјевић (Gast)


Lesenswert?

I've tried above makefile with arm gcc toolchain from 
(https://launchpad.net/gcc-arm-embedded).

hex is 306kB, bin is 109kB, so I guess it will fit the flash? I haven't 
wired SD card yet, so I can't see if it will work.

Also not sure if st-link program for linux supports new discovery board 
- maybe I will have to use serial programmer (also, not sure if this 
program works either)...

von Henning M. (henning_m)


Lesenswert?

Hallo,

ich spiele auch gerade mit dem Board und dem Audio-Krams rum.

Kurz rum Lautsprecherausgang: Die Pins des Chips für den 
Lautsprecherverstärker sind auf dem Board nicht kontaktiert, es geht als 
nur der Kopfhöhrerausgang.Wenn man ein Magier am Lötkolben ist, kann man 
da evtl. nachträglich dünne Kabel anlöten, das wird aber sehr fummelig.

Gruß Henning

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.