STM32F4 - DMA con pasos más grandes

0

Estoy programando una placa de descubrimiento STM32F4 para insertar una secuencia de valores de 12 bits en el registro de datos DAC. Esto funciona bien usando interrupciones de temporizador: dentro de mi controlador de IRQ, tengo un código que parece:

phase += phaseIncrement;
DAC_SetChannel1Data(DAC_Align_12b_R, function[phase]);

y la salida del DAC parece que creo que debería. Tenga en cuenta que phaseIncrement no tiene que ser 1 ; si quiero una salida de alta frecuencia, puedo omitir puntos en function[] , sacrificando la precisión de la señal por un poco de velocidad adicional.

Ahora, estoy leyendo sobre DMA. Parece que el STM32F4 solo puede incrementarse en una de las tres cantidades: 1 byte, 2 bytes y 4 bytes, dependiendo del tamaño de la variable que se transfiere. ¿Es esto correcto? ¿Existe alguna solución que me permita omitir algunas de estas direcciones de memoria para poder emular mi salida actual sin menos uso de la CPU?

    
pregunta Greg d'Eon

1 respuesta

2

Por lo que sé, el controlador DMA del STM32F4 no puede hacer lo que quiere. DMA puede alimentar el DAC mucho más rápido que el software de interrupción (hasta 10.5 Msps), por lo que es posible que no tenga que omitir las muestras de todos modos.

Si DMA no es lo suficientemente rápido, la solución clásica es hacer múltiples copias de su forma de onda, cada una con la mitad de muestras que la anterior. Esto utilizará un máximo de dos veces la memoria de muestra (1 + 1/2 + 1/4 + 1/8, etc.). Si tiene varias formas de onda que ocupan mucho espacio, es posible que no tenga suficiente memoria para almacenar todas las octavas superiores. Sin embargo, si solo necesita reproducir una forma de onda a la vez, es posible que aún tenga suficiente RAM para calcular y almacenar la (s) octava (s) requerida (s) solo para la forma de onda actual.

    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas