stm32f103 wav player?

Gast #4689568
Lesenswert?

Eigentlich sollte die MCU dafür geeignet sein, WAV files mittels PWM 
abzuspielen.

Am besten wäre die DMA direkt mit der PWM zu verknüpfen. Hier hat das 
scheinbar schon mal jemand gemacht:
https://www.youtube.com/watch?v=-L-ZGksh9n8

Von STM gibt es ein Paper, wie man die Auflösung der PWM erhöhen kann:
http://www.st.com/content/ccc/resource/technical/document/application_note/7e/17/df/9e/5d/04/4b/72/DM00119042.pdf/files/DM00119042.pdf/jcr:content/translations/en.DM00119042.pdf

Leider gibt es in beiden Fällen keine Sourcen. Hat jemand schon mal so 
etwas gemacht oder kennt ein Code-Beispiel?
Gast #4690115
Lesenswert?

Markus schrieb:

> Eigentlich sollte die MCU dafür geeignet sein, WAV files mittels PWM
> abzuspielen.

Woher zum Teufel willst du das wissen? Du hast doch ganz offensichtlich 
rein überhaupt keine Ahnung vom Format von WAV Files. Die bieten nämlich 
als Containerformat eine schier unerschöpfliche Vielzahl möglicher 
Inhaltsformate an, u.a. sind natürlich welche zumindest denkbar, die die 
Fähigkeiten deiner MCU weit überfliegen.

> Am besten wäre die DMA direkt mit der PWM zu verknüpfen.

Das kann klappen. Aber nur bei den allerprimitivsten WAV-Files. Nämlich 
PCM-WAV, welches unkomprimierte Daten enthalten. Das ist vermutlich auch 
das, was du EIGENTLICH meintest, aber wegen intellektueller 
Beschränkungen nicht korrekt zum Ausdruck bringen konntest.

Der Trick ist dann ganz simpel: mache zwei Buffer (deren nötige Größe 
man dem WAV-Header entnehmen kann) und fülle sie abwechselnd mit den 
Daten aus den WAV-Chunks. Gebe den gerade gefüllten Buffer aus, sobald 
der zuvor gefüllte fertig ausgegeben ist. Fülle wiederum den gerade 
ausgegebenen Buffer mit dem Inhalt des nächsten Chunks. Trivialste 
Urschleimscheisse...

Funktioniert so einfach aber eben nur, wenn das WAV-File eben nur 
PCM-WAV enthält und das Bitformat der Samples obendrein dem benötigten 
Ausgabeformat entspricht. Wenn nicht, wird es schon etwas komplizierter. 
Und wenn es kein PCM-WAV ist, dann ist's nix mehr mit primitivem 
DMA-Bytegeschubse. Dann musst du den Scheiss erstmal dekodieren bevor du 
ihn ausgeben kannst. Dann brauchst du einen passenden Decoder. Welchen? 
Kannst du wiederum dem WAV-Header entnehmen.

> Leider gibt es in beiden Fällen keine Sourcen. Hat jemand schon mal so
> etwas gemacht oder kennt ein Code-Beispiel?

Lern' programmieren. Das ist was anderes, als fremden, unverstandenen 
Code stumpf zusammenzunageln. Das Minimum, was für eine kompetente 
Benutzung des fremden Codes erforderlich ist, ist in diesem Fall eine 
zumindest grundlegende Kenntnis über das WAV-Fileformat, seinen 
Charakter als Containerformat und die sich daraus ergebenden 
Konsequenzen...
Gast #4690153
Lesenswert?

oder man liest die AppNote von ST
en.CD00259245.pdf : AN3126 Audio and waveform generation using the DAC 
in
 STM32
und such dann einen passenden uC aus (siehe Bild).
In den Beispielprojekten gibt es dann Beispiele:
X:\..\STM32Cube\Repository\STM32Cube_FW_F1_V1.4.0\Projects\STM3210C_EVAL 
\Examples\DAC\DAC_SignalsGeneration

Durch die Kopplung von Timer als Trigger für DMA und DAC ohne große CPU 
Last zu implementieren.

Und wer ein STM32F4-Disco hat kann mit dem Beispielcode das Onboard 
Mikrofon und den Kopfhörerausgang als Audio Schnittstelle nutzen und ein 
USB-Stick ist der Datenspeicher. Funktioniert gut.

Gruß,

dasrotemopped.
Angehängte Dateien:
Gast #4690404
Lesenswert?

Nop schrieb:
> Wieso eigentlich über PWM, wenn der Chip schon einen DAC hat, der
> ebenfalls mit DMA funktioniert? Gibt's da einen Vorteil für PWM?

Leider haben nicht alle STM32F103 eine DAC.

1
Digital-to-analog converter (DAC)
2

3
Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx
4
microcontrollers where the Flash memory density ranges between 16 and 32 Kbytes.
5

6
Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx
7
microcontrollers where the Flash memory density ranges between 64 and 128 Kbytes.
8

9
High-density devices are STM32F101xx and STM32F103xx microcontrollers where the Flash memory density ranges between 256 and 512 Kbytes.
10

11
XL-density devices are STM32F101xx and STM32F103xx microcontrollers where the Flash memory density ranges between 768 Kbytes and 1 Mbyte.
12

13
This section applies to connectivity line, high-density and XL-density STM32F101xx and STM32F103xx devices only.
Gast #4690460
Lesenswert?

>Wieso eigentlich über PWM, wenn der Chip schon einen DAC hat, der
>ebenfalls mit DMA funktioniert? Gibt's da einen Vorteil für PWM?

Es dieses Board, also ohne DAC. Deshalb PWM.
Mein Ziel sind Audioanwendungen wie WAV-Player und Synthesizer. Ich habe 
einiges dazu mit den AVRs entwickelt ( from scratch ).
Jetzt will ich einiges mit den kleinen STM machen ( Kosten, viele 
verteilte Klangerzeuger ), da diese wesentlich komplexere Synthesizer 
und Filter ermöglichen.
Die DMA im STM hat den Vorteil, dass keine Rechenlast durch die DAC 
Ausgabe entsteht. Beim AVR war das immer eine Interruptroutine welche 
die PWM nachladen musste, da geht Einiges beim ohnehin für 
Synthesizeranwendungen etwas knapp bemessenen AVR verloren.
Angehängte Dateien:
Gast #4691708
Lesenswert?

>Mein Ziel sind Audioanwendungen wie WAV-Player und Synthesizer.
Macht bestimmt Spaß.
>Jetzt will ich einiges mit den kleinen STM machen ( Kosten, viele >verteilte 
Klangerzeuger ), da diese wesentlich komplexere Synthesizer
>und Filter ermöglichen.
Das ist richtig im Vergleich zu AVR.

Aber warum dann einen STM32F103 ohne DAC / I2S ?
Warum nicht das Nucleo-STM32F446RE mit Rechenpower, DAC, I2S ?
Oder das STM32F4-Discovery mit Audio Ausgang ?
Sportlicher Ergeiz mit wenig Hardware alles möglich zu machen ? Oder nur 
Geiz, das billigste Board zu finden ?

Gruß,

dasrotemopped.
#4692314
Lesenswert?

>welches Board?
STM32F4-Disco
Der Audio Ausgang wird über I2C (Konfiguration) und I2S (Audio 
Datenstrom) implementiert, siehe Bild.

Neben "Jupiter&Beyond" gibt es noch "peridiummmm" auf der selben 
Hardware vom selben Progrmmierer.

Wenn man die Grafik weglässt bleibt viel Power für Audio Synthese übrig. 
Der F4 hat ja den DSP Befehlssatz, der dir bei der Synthesizer Anwendung 
sicher nützlich ist. Und über die USB Buchse ist auch genug Platz für 
WAV Dateien auf nem Memory Stick.
Die richtige Hardware für die Aufgabe, aber geschenkt wird einem da nix, 
da ist Arbeit zu Hauf zu erledigen.

Gruß,

dasrotemopped.
Angehängte Dateien:
Gast #4692371
Lesenswert?

Ja, aber ich habe dieses Board:
http://www.mikrocontroller.net/attachment/preview/302883.jpg

Einen AudiDAC kann man überall dran basteln. Es geht hier darum, das 
Maximum aus dem Minimum heraus zu holen.

Hier kannst Du mal hören, was man aus einem LPC810 ganz ohne Hardware 
Peripherie nur mit Bit-Banging heraus holen kann:

https://www.indiegogo.com/projects/the-dsp-g1-analog-modeling-synthesizer#/
#4692451
Lesenswert?

>Es geht hier darum, das Maximum aus dem Minimum heraus zu holen.
Dann ist der STM32F103 überdimensioniert:
http://www.linusakesson.net/scene/craft/
Geht auch mit nem Atmega88.

Ich bin nicht so leidensfähig. In Zeiten von Multicore CPU/GPU PCs ist 
embedded schon Beschränkung genug. Dann muss es nicht auch noch ein uC 
ohne die Hardwarefunktionen sein, die ich in meiner Anwendung benötige.

Gruß,

dasrotemopped.
Gast #4692459
Lesenswert?

Den Link kenne ich schon seit gefühlten 10 Jahren.
>Ich bin nicht so leidensfähig.
Wenn man so argumentiert, kann man gleich einer RasPi mit Soundkarte 
nehmen.
Irgendwo muss die Herausforderung ja bleiben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren