Pregunta sobre STM32F4 DMA

2

He estado haciendo algunos experimentos con el STM32F405 y el audio y descubrí un problema interesante y me pregunto si alguien más ha encontrado lo siguiente.

Tengo un códec CS4344 estéreo que funciona a 96k usando la interfaz 12S y un código similar al de los ejemplos de audio de STM32F4Discovery.

También estoy usando ADC2 con DMA2 stream2 para muestrear voltajes de control de potenciómetros, etc. Tengo un promedio de ejecución en los datos de ADC dentro de la IRQ generada por la transferencia de la transmisión completa IRQ y empecé a ver fallos en mi audio (sonido emergente) al cambiar de 48k a 96k.

El código de generación de señal de audio es muy corto (solo una onda sinusoidal con LUT), por lo que no hay problema con los gastos generales.

Luego experimenté moviendo los cálculos de promedios de ADC fuera de la IRQ de ADC y simplemente estableciendo una marca y desaparecieron los errores técnicos.

El quid de esto es que parece que solo se habilita la IRQ para la transmisión como esta:

            NVIC_EnableIRQ(DMA2_Stream2_IRQn);

solo no establece una prioridad para la interrupción que permita que se anide. Lo que parece estar sucediendo es que cuando se está revisando el ADC IRQ, el audio I2S HT y TC IRQ no pueden interrumpir el IRC ADC. La configuración de la interrupción de ADC con prioridad de la manera más convencional parece arreglarla.

    NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

La prioridad DMA de Alta, Media, Baja que se establece como parte de la configuración de DMA por sí sola no parece ser suficiente para permitir interrupciones anidadas si se usa solo la interrupción de flujo.

Mi pregunta es ¿cómo interactúan las prioridades de la DMA tal como se establece en la estructura DMA_InitStructure con la prioridad de prioridad de prioridad del canal IRQ? ¿Cuál es el significado de la prioridad DMA de Alta, Media, Baja?

    
pregunta Bruce Duncan

2 respuestas

3

Confunde las prioridades de DMA con las prioridades de IRQ. Las prioridades que configura con DMA_InitStructure solo tratan con la configuración de las prioridades dentro del controlador DMA, es decir, a cuál de las dos (o más) solicitudes de DMA simultáneas (!) Se atiende primero. Esto es completamente independiente de las interrupciones que se activan en el medio y / o al final de una transferencia DMA, que son priorizadas por el NVIC (junto con las otras fuentes de interrupción). Como dijo, debe establecer prioridades IRQ más altas (es decir, más bajas) para las interrupciones de DMA que para las interrupciones de ADC para asegurarse de que las interrupciones de DMA relacionadas con I2S se revisen de inmediato.

    
respondido por el fm_andreas
3

Problema resuelto. Estaba usando el código de configuración de la red y tenía una interrupción configurada para el mismo puerto SPI que el I2S que parecía estar en conflicto con la interrupción de flujo DMA. Así que la lección que aprendí es que si I2S está habilitado en SPI, solo se necesita la interrupción DMA.

    
respondido por el Bruce Duncan

Lea otras preguntas en las etiquetas