Воспроизведение звука через DMA

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
stalker_radiokot
Нашел транзистор. Понюхал.
Сообщения: 152
Зарегистрирован: Пт сен 18, 2009 08:38:57

Воспроизведение звука через DMA

Сообщение stalker_radiokot »

Добрый день!

Пытаюсь воспроизвести звук через DMA на плате STM32VLDiscovery (проц STM32F100RB), 8МГц
Заготовка проекта сделана с помощью Cube. Вроде бы все получается как надо, файл читаю с флешки, но воспроизводится какой-то скрежет :( Подскажите, где мог ошибиться при инициализации DAC/DMA (кину ключевые места)

WAV файл, который пытаюсь воспроизвести - 8 бит, 1 канал, 8000 KHz

#define DMA_BUFFER_SIZE 512
uint8_t dma_buffer[DMA_BUFFER_SIZE]; // буфер звука для DMA. Пробовал разный делать, от 8 бит до 32-х.

Запуск ЦАП по DMA

HAL_TIM_Base_Start(&htim6);
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*) dma_buffer, DMA_BUFFER_SIZE, DAC_ALIGN_12B_L); // выравнивание тоже разное пробовал

инициализация DAC
sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}

инициализация таймера 6
htim6.Instance = TIM6;
htim6.Init.Prescaler = 499;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 1;
if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
{
Error_Handler();
}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}

инициализация DMA
__HAL_RCC_DMA1_CLK_ENABLE();

/* DMA interrupt init */
/* DMA1_Channel3_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Воспроизведение звука через DMA

Сообщение uk8amk »

Происходит ли корректное воспороизведение звука без DMA? Скажем через прерывание таймера.
Правильно ли организовано заполнение полубуферов у DMA?
Аватара пользователя
stalker_radiokot
Нашел транзистор. Понюхал.
Сообщения: 152
Зарегистрирован: Пт сен 18, 2009 08:38:57

Re: Воспроизведение звука через DMA

Сообщение stalker_radiokot »

Через прерывания тоже не хочет работать :( Сделал такой обработчик прерывания (из расчета того, что файл для проигрывания 16-ти битный)

void TIM7_IRQHandler(void)
{
/* USER CODE BEGIN TIM7_IRQn 0 */

/* USER CODE END TIM7_IRQn 0 */
HAL_TIM_IRQHandler(&htim7);
/* USER CODE BEGIN TIM7_IRQn 1 */

HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, *(uint16_t *) & dma_buffer[dma_addr]);

dma_addr=dma_addr+2;
if (dma_addr==DMA_BUFFER_SIZE/2)
dma_need_data=1;

if (dma_addr==DMA_BUFFER_SIZE)
dma_need_data=2;

if (dma_addr==DMA_BUFFER_SIZE)
dma_addr=0;

/* USER CODE END TIM7_IRQn 1 */
}

и такие настройки таймера
static void MX_TIM7_Init(void)
{

TIM_MasterConfigTypeDef sMasterConfig;

htim7.Instance = TIM7;
htim7.Init.Prescaler = 499;
htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
htim7.Init.Period = 1;
if (HAL_TIM_Base_Init(&htim7) != HAL_OK)
{
Error_Handler();
}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}

}

и опять наблюдаю треск в динамике. начал разбираться, получаю что на скорости проца в 8мгц при воспроизведении файла с частотой 8кгц у меня не успевает читать половинки буфера по 256 байт. Снизил частоту таймера в два раза - вроде начинает успевать дочитывать (в отладчике количество чтений половинок совпадает с запросами на чтение), но вместо замедленного звука слышу все тот же треск. Динамик прицепил тупо между ножкой ЦАПа и землей - мож из за этого?
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Воспроизведение звука через DMA

Сообщение Vov123 »

Когда разберётесь в своей проблеме и насладитесь чистотой звука своего девайса, рекомендую обратить внимание на:
http://ru.aliexpress.com/item/Mini-MP3- ... 5cc243c7a8

http://www.dfrobot.com/image/data/DFR02 ... 0Manul.pdf

Всё очень просто, надёжно и недорого.

Там есть возможность напрямую подключить динамик, правда качество отвратное; а можно через стерео усилитель. Хотя для информатора сойдёт просто динамик.
Ответить

Вернуться в «ARM»