Уважаемый 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;
Хочется выводить на аудио цап 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;
