I2S и DMA изменение частоты вывода на ЦАП.

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Родился
Аватара пользователя
Сообщения: 10
Зарегистрирован: Ср сен 19, 2012 21:12:31
Откуда: Россия

Сообщение прагматик »

Уважаемый ALL,
Хочется выводить на аудио цап stm32f4discovery при помощи I2S и ДМА семпл музыкального инструмента, и изменяя скорость работы ДМА , получать на выходе разные по частоте ноты. В ручную сделать это можно, но на stm32F4 есть ДМА, хочется использовать эту замечательную фичу, дабы разгрузить проц для вычислений затуханий, и фронтов.

Не подскажите, можно ли заставить дма изменять скорость вывода на I2S? Я изменял с помощью делителей (PLLI2SN, PLLI2SR) скорость I2S, но это слишком радикально, так как дискретность изменения частоты получается слишком большая. Так же вероятно настройка работы ДМА на конкретную частоту, может пригодиться для вывода сигнала на монитор или ТВ.
Т.Е можно ли подружить DMA помимо I2S, ещё и с таймером?
Спасибо.

вот моя настройка на ДМА

DMA1_Stream7->CR = 0 ; //DMA стоп
while(DMA1_Stream7->CR & DMA_SxCR_EN);//подождем когда dma остановится
DMA1_Stream7->CR =
DMA_SxCR_PL | // Приоритет
DMA_SxCR_PSIZE_0| // PSIZE = 16 bit инкремент указателя на два байта
DMA_SxCR_MSIZE_0| // MSIZE = 16 bit
DMA_SxCR_MINC | // Адрес памяти инкрементировать т.е. увеличивать
DMA_SxCR_DIR_0 | // направление Память -> Периферия
DMA_SxCR_TCIE ; // Прерывание по завершению передачи

DMA1_Stream7->PAR = (uint32_t)&SPI3->DR;// Куда записываем в периферию (её название)
DMA1_Stream7->FCR = 0; // Direct mode запрещен
DMA1_Stream7->M0AR = (uint32_t)0 ; // Адрес передаваемых данных, должен быть кратным 2
DMA1_Stream7->NDTR = (uint32_t)0xFFFE;// Количество Half-Word-ов, размер пересылаемых данных.



NVIC_InitStructure.NVIC_IRQChannel = AUDIO_MAL_DMA_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EVAL_AUDIO_IRQ_PREPRIO;//=0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = EVAL_AUDIO_IRQ_SUBRIO;//=0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);




SPI3->CR2 |= SPI_I2S_DMAReq_Tx;
Реклама
Встал на лапы
Сообщения: 85
Зарегистрирован: Сб мар 13, 2010 13:52:10

Сообщение MisterDi »

Не подскажите, можно ли заставить дма изменять скорость вывода на I2S?
Даже если изменить скорость передачи можно, но обычно на приемной стороне стоит свой тактовый генератор и выход ЦАП не зависит от тактовой частоты на входе. Кроме этого при изменении тактовой слетают настройки выходного фильтра ЦАП, что приведетк загрязнению выходного сигнала.
misterdi<@>i.ua
Реклама
Ответить

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