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?