Gast
#3678480
Hallo,
ich habe folgendes Problem mit einem STM32F407:
Es soll ein Teil eines Wave-Files per DAC und DMA für ca. 2 Sekunden
ausgegeben werden. Der Teil des Files hat aktuell ca. 40kByte und steht
für Testzwecke in der File1_Table im Programmcode.
Am DAC Pin ist vor dem Lautsprecher noch ein Verstärker vom Typ TPA3123
angeschlossen.
Die Ausgabe des Sinus in Sine12bit funktioniert einwandfrei. Wenn aber
die File1_Table verwendet wird (BufferSize und Timer Period wurden
selbstverständlich angepasst), gibt der Controller ein Rauschen aus. Im
Hintergrund hört man aber etwas von der Melodie.
Da ich bereits einiges ohne nennenswerten Erfolg ausprobiert habe, bin
ich jetzt eher ratlos woran es liegen könnte.
Hat von euch jemand eine Idee?
Nachfolgend der Programmcode. DAC_Setup, DAC_AudioOut und DAC_Off werden
in der main aufgerufen.
#include "stm32f4xx.h"
#include "gDef.h"
#include "gVar.h"
/* Includes
------------------------------------------------------------------*/
#define DAC_DHR12R2_ADDRESS 0x40007414
#define DAC_DHR8R1_ADDRESS 0x40007410
#define DAC_DHR12R1_ADDRESS 0x40007408
const uint16_t Sine12bit[32] =
{ 2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056, 3939,
3750, 3495,
3185, 2831, 2447, 2047, 1647, 1263, 909, 599, 344, 155, 38, 0,
38, 155,
344, 599, 909, 1263, 1647 };
uint16_t File1_Table[] = {
0x49,0x53,0x46,0x54,0x22,0x00,0x00,0x00,0x4C,0x61,0x76,0x66,0x35,0x35,0x
2E,0x31,
0x39,0x2E,0x31,0x30,0x34,0x20,0x28,0x6C,0x69,0x62,0x73,0x6E,0x64,0x66,0x
69,0x6C,
0x65,0x2D,0x31,0x2E,0x30,0x2E,0x32,0x34,0x29,0x00,0x64,0x61,0x74,0x61,0x
96,0xD8,
0x00,0x00,0x97,0xFE,0x5C,0x01,0x5F,0x01,0x1E,0x00,0x4F,0x01,0x94,0x00,0x
E6,0x00,
0xAE,0x00,0x4C,0x00,0xEF,0xFE,0x82,0x01,0xE4,0x02,0x4C,0x00,0x6C,0xFF,0x
CE,0xFE,
0x73,0x01,0x51,0x00,0x0F,0xFF,0x10,0x00,0xF8,0xFE,0xD5,0x00,0x53,0x00,0x
45,0xFF,
0xD1,0xFF,0x6C,0x00,0xC9,0xFF,0xDB,0xFF,0xD0,0x01,0xF0,0x00,0x78,0x00,0x
5F,0xFF,
0xCF,0xFE,0xDD,0xFF,0xCA,0xFE,0xE4,0xFE,0xBE,0xFF,0x50,0xFF,0x56,0x00,0x
60,0xFF,
//...
};
void DAC_Setup(void) {
/* Preconfiguration before using
DAC----------------------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;
/* DMA1 clock clock enable (to be used with DAC) */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
/* DAC Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
/* DAC channel 1 (DAC_OUT = PA.4) configuration */
GPIO_InitStructure.GPIO_Pin = DAC_RTDS_UC_SIGNAL;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Pins für externen Verstärker
GPIO_InitStructure.GPIO_Pin = AMPLIFIER_GAIN0 | AMPLIFIER_SHUTDOWN
| AMPLIFIER_GAIN1 | AMPLIFIER_MUTE;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* TIM6 Configuration
------------------------------------------------------*/
TIM6_Config();
/* Wave generator -----------------------------------------------*/
DAC_Ch1_WaveConfig();
}
/**
* @brief TIM6 Configuration
* @param None
* @retval None
*/
void TIM6_Config(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* TIM6 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
/* Time base configuration */
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 0x290;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
/* TIM6 TRGO selection */
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
}
/**
* @brief DAC Channel1 Wave Configuration
* @param None
* @retval None
*/
void DAC_Ch1_WaveConfig(void) {
DMA_InitTypeDef DMA_InitStructure;
/* DAC channel1 Configuration */
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_Init(DAC_Channel_1, (DAC_InitTypeDef*) &DAC_InitStructure);
/* DMA1_Stream5 channel7 configuration
**************************************/
DMA_DeInit(DMA1_Stream5);
DMA_InitStructure.DMA_Channel = DMA_Channel_7;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)
DAC_DHR12R1_ADDRESS;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) &File1_Table;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_BufferSize = 40000;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize =
DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA1_Stream5, &DMA_InitStructure);
}
void DAC_AudioOut(void) {
// TIM6 enable counter
TIM_Cmd(TIM6, ENABLE);
// Enable DMA1_Stream5
DMA_Cmd(DMA1_Stream5, ENABLE);
// Enable DAC Channel1
DAC_Cmd(DAC_Channel_1, ENABLE);
// Enable DMA for DAC Channel1
DAC_DMACmd(DAC_Channel_1, ENABLE);
//Für externen Verstärker:
//Shutdown disabled (Pin 1)
GPIO_SetBits(GPIOC, GPIO_Pin_1);
//MUTE OFF (Pin 3), GAIN0 = 0 (Pin 0), GAIN1 = 0 (Pin 2)
GPIO_ResetBits(GPIOC, GPIO_Pin_3 | GPIO_Pin_0 | GPIO_Pin_2);
}
void DAC_Off(void) {
//Externer Verstärker:
//MUTE ON
GPIO_SetBits(GPIOC, AMPLIFIER_MUTE);
//GAIN0 = 0 (Pin 0), GAIN1 = 0 (Pin 2)
GPIO_ResetBits(GPIOC,
AMPLIFIER_SHUTDOWN | AMPLIFIER_GAIN0 | AMPLIFIER_GAIN1);
DAC_Cmd(DAC_Channel_1, DISABLE);
DAC_DMACmd(DAC_Channel_1, DISABLE);
DMA_Cmd(DMA1_Stream5, DISABLE);
TIM_Cmd(TIM6, DISABLE);
}