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
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.
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
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
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
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
@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
> 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.
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
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
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.
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
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
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
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
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.
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...
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
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.
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 ?
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...
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
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.
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)...
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