Forum: Mikrocontroller und Digitale Elektronik MP3 Anlage STM32


von Moritz M. (avrprogger)


Lesenswert?

Hallo,

ich möchte mal so zum Spaß einen MP3-Player selber bauen. Als Controller 
wollte ich einem STM32F4 nehmen.
Als DAC möchte ich gerne einen externen Audio-DAC nehmen. Welche gibt es 
da so und welche könntet ihr mir empfehlen?
Die Audiodateien(mp3, wav ..) sollen Software mäßig decodiert werden.
Außerdem soll man auch nicht nur Kopfhörer anschließen können sondern 
auch Passiv-Boxen. (Welche Spannungen hat ein Audiosignal für 
Passiv-Boxen? Geht das mit  weniger als 20V?)

Moritz

von Max W. (max96)


Lesenswert?

Einen DAC kann ich nicht empfehlen, aber die Spannung für deinen 
Verstärker hängt von der gewünschten Leistung ab.

von Matthias K. (mkeller)


Lesenswert?

Nimm doch erstmal das STM32F4 Discovery Board, das hat schon einen recht 
guten Audio-DAC drauf.

von holger (Gast)


Lesenswert?

Beitrag "STM32F4 DAC + DMA"

Du kriegst ja nicht mal DMA auf dem DAC zum laufen;)

von holger (Gast)


Lesenswert?


von Moritz M. (avrprogger)


Lesenswert?

Hallo,

>Du kriegst ja nicht mal DMA auf dem DAC zum laufen;)

Mit den Beispielen von ST geht es ja. Wenn ich das genau so programmiere 
wie ST geht es nicht (ST hat bestimmt ein geheimen Trick :))



>Beitrag "STM32F4 Discovery MP3 Player - komplett mit Code"

Ich möchte gerne ohne OS arbeiten (hab ich auch noch nie gemacht).

Aber Vielen Dank trotzdem!

von A. B. (funky)


Lesenswert?

bei der Grösse eines solchen Projektes rentiert sowas durchaus.

Und keine Angst...nach ein wenig Einarbeitung wird man ein OS nicht mehr 
missen wollen. Es vereinfacht das Handling und vor allem die 
Erweiterbarkeit ungemein.

ist nur meine Meinung, die jetzt sicherlich wieder von irgendwelchen 
ich-programmiere-alles-in-ASM-mit-goto Freaks in Grund und Boden gebasht 
wird ;)

von Johnny B. (johnnyb)


Lesenswert?

Moritz M. schrieb:
> nicht nur Kopfhörer anschließen können sondern
> auch Passiv-Boxen

Wenn es nur für kleine Boxen ist, dann kann ich die "Boomer" von Texas 
Instruments (vormals National Semiconductor) sehr empfehlen.
Die sind stromsparend und brauchen nur eine minimale, externe 
Beschaltung.
http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?sectionId=630&tabId=2701&family=analog&uiTemplateId=AUDIO_PRDSRCH_T&familyId=925
z.B. den LM4890 mit 1W:
http://www.ti.com/lit/ds/snas138k/snas138k.pdf

Zum Thema OS oder nicht OS; für so ein Projekt wäre ein einfaches OS 
schon nicht schlecht. Hat man erst mal was lauffähiges, kommen schnell 
mal Wünsche nach mehr. Vielleicht soll mal noch ein farbiges TFT ran und 
das Cover angezeigt werden können. Dann brauchts noch eine Library um 
JPEG's zu decodieren. Wenn schon alles sauber programmiert ist, sollte 
sich das dann einfacher integrieren lassen, als wenn man ein Gebastel 
hat.
Ein OS verleitet eher dazu, sauber zu programmieren.

von Moritz M. (avrprogger)


Lesenswert?

Hallo,

vielen Dank! Also ich wollte erstmal klein anfangen ohne ein OS und 
einfach nur Musik aus dem Speicher über einen DAC ausgeben. Kennt jemand 
vllt. eine Seite wo der Aufbau von MP3-Dateien beschrieben ist?

Moritz

von Sebastian (Gast)


Lesenswert?

NXP hat für ihre ARM7-basierten Controller mal eine Application Note mit 
Beispiel für MP3 in Software vorgestellt. Vielleicht wäre das eine 
Anregung, einen anderen Controller zu benutzen. Wenn jemand die 
Vorarbeit schon gemacht hat, kann das viel Zeit sparen. Ansonsten ist 
MP3 schon eine ganze Menge Arbeit, deswegen gibt es fertige Chips, 
entweder von dieser Firma: http://www.vlsi.fi/ oder solche Klassiker wie 
den STA015 von ST.

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

für den Pic32 gibts auch ne ApNote, mit dem Helix MP3 Decoder, der lauft 
super auf dem F4. Was die "Lib" für den Codec auf dem Discovery angeht. 
Sind dort Fehler in der Takt Einstellung für den I2S. Sieh mal in der 
I2S Init nach. Die Formel dort ist falsch, den Fehler hab ich aber auch 
nicht gefunden, bzw. nicht lange gesucht, dort sind Konstanten für die 
gängigen Sampleraten im Kommentar. Ich hab dann einfach n switch dort 
eingefügt.

MfG

Tec

Edit: Beitrag "Re: MP3 Anlage STM32"
Oder schau einfach hier rein. Oder hier
http://code.google.com/p/thundercyer-the-alarm-clock/source/browse/

von Moritz M. (avrprogger)


Lesenswert?

Hallo,

vielen Dank erstmal. Ich versuche grade den Audio DAC auf dem Discovery 
zum laufen zu bringen.
Beitrag "STM32F4 Discovery Audio DAC CS43L22"
Weiß jemand was genaueres zu dem Fehler der oben genannt wird? Die 
Funktion I2S_Init() hab ich gar nicht gefunden.

Moritz

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

ich hab mal nach gesehen, in der STM32f4_spi.c ist die Funktion I2S_Init
in dieser wird der Takt für den I2S anhand der samplerate eingestellt.
Im RM findest du die richtigen werte oder oben in der File wo 
I2S_AudioFreq_Default gesetzt wirdt.

MfG Tec
1
/**
2
  * @brief  Initializes the SPIx peripheral according to the specified 
3
  *         parameters in the I2S_InitStruct.
4
  * @param  SPIx: where x can be  2 or 3 to select the SPI peripheral (configured in I2S mode).
5
  * @param  I2S_InitStruct: pointer to an I2S_InitTypeDef structure that
6
  *         contains the configuration information for the specified SPI peripheral
7
  *         configured in I2S mode.
8
  *           
9
  * @note   The function calculates the optimal prescaler needed to obtain the most 
10
  *         accurate audio frequency (depending on the I2S clock source, the PLL values 
11
  *         and the product configuration). But in case the prescaler value is greater 
12
  *         than 511, the default value (0x02) will be configured instead.    
13
  * 
14
  * @note   if an external clock is used as source clock for the I2S, then the define
15
  *         I2S_EXTERNAL_CLOCK_VAL in file stm32f4xx_conf.h should be enabled and set
16
  *         to the value of the the source clock frequency (in Hz).
17
  *  
18
  * @retval None
19
  */
20
void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct)
21
{
22
  uint16_t tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1;
23
  uint32_t tmp = 0, i2sclk = 0;
24
#ifndef I2S_EXTERNAL_CLOCK_VAL
25
  uint32_t pllm = 0, plln = 0, pllr = 0;
26
#endif /* I2S_EXTERNAL_CLOCK_VAL */
27
  
28
  /* Check the I2S parameters */
29
  assert_param(IS_SPI_23_PERIPH(SPIx));
30
  assert_param(IS_I2S_MODE(I2S_InitStruct->I2S_Mode));
31
  assert_param(IS_I2S_STANDARD(I2S_InitStruct->I2S_Standard));
32
  assert_param(IS_I2S_DATA_FORMAT(I2S_InitStruct->I2S_DataFormat));
33
  assert_param(IS_I2S_MCLK_OUTPUT(I2S_InitStruct->I2S_MCLKOutput));
34
  assert_param(IS_I2S_AUDIO_FREQ(I2S_InitStruct->I2S_AudioFreq));
35
  assert_param(IS_I2S_CPOL(I2S_InitStruct->I2S_CPOL));  
36
37
/*----------------------- SPIx I2SCFGR & I2SPR Configuration -----------------*/
38
  /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */
39
  SPIx->I2SCFGR &= I2SCFGR_CLEAR_MASK; 
40
  SPIx->I2SPR = 0x0002;
41
  
42
  /* Get the I2SCFGR register value */
43
  tmpreg = SPIx->I2SCFGR;
44
  
45
  /* If the default value has to be written, reinitialize i2sdiv and i2sodd*/
46
  if(I2S_InitStruct->I2S_AudioFreq == I2S_AudioFreq_Default)
47
  {
48
    i2sodd = (uint16_t)1;//0;  //changed due to calc issues
49
    i2sdiv = (uint16_t)53;//2;
50
  }else if(I2S_InitStruct->I2S_AudioFreq == I2S_AudioFreq_48k) {
51
  i2sodd = (uint16_t)1;
52
  i2sdiv = (uint16_t)12;
53
  }
54
  /* If the requested audio frequency is not the default, compute the prescaler */
55
  else

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.