distorsión de imagen que genera una señal VGA en STM32 f4 utilizando DMA

2

Estoy tratando de construir un generador de video usando el STM32f4 (168MHz, usando la placa de descubrimiento) + DAC de escalera R a la señal VGA.

La idea no es basarse en un framebuffer (esto limitaría la resolución y la profundidad del color porque la placa tiene 128k RAM direccionable externamente, lo que permite 320x200 doble búfer @ 8bpp), sino componer una línea de búfer por CPU mientras que la otra El DMA envía el búfer de línea al DAC.

La interrupción de sincronización H (a una velocidad de 30 a algo KHz para señales vga) haría lo siguiente:

  • generación de señal de sincronización de disparo,
  • cambiar los linebuffers entre el búfer mostrado y el de fondo
  • inicie el DMA en el linebuffer "mostrado"
  • luego complete / haga la composición del "backbuffer" con datos

Esta idea funciona bastante bien por ahora, excepto Veo MUCHAS vibraciones horizontales (hasta 1/4 de la pantalla), lo que hace que las líneas verticales se mantengan estables en el tiempo pero varíen mucho horizontalmente (es decir, no ser vertical en absoluto y dar una mala distorsión de la imagen).

Sospecho que hay contención en el bus de memoria, pero le di DMA e interrumpe la prioridad más alta. (tiene que haber transferencias de memoria porque la línea de datos se modifica en cada h-sync).

(el framebuffer estático de la misma resolución -320x200 se repite horizontalmente / verticalmente) funciona bastante bien y no tiene este corte, a veces por un solo píxel)

Incluiré una captura de pantalla tan pronto como pueda.

¿Hay algún medio para mejorar esto o estoy maldito por las frecuentes transferencias de memoria entre la CPU y la RAM? ¿Debo cambiar cada N líneas? (es decir, ¿tienen buffers más grandes, reduciendo el número de conmutadores pero no la cantidad transferida?)

¿Debo separar los buffers más para que no se solicite el mismo "banco de memoria" / línea (si tal cosa existe)? ¿Usar varias interrupciones? ¿Debo poner la CPU en reposo antes de que el temporizador interrumpa? ¿Alguna idea?

    
pregunta makapuf

1 respuesta

1

Bien, respondiendo a mi propia pregunta porque finalmente la entendí: la función FIFO del DMA no estaba habilitada, por lo que cualquier interrupción o transferencia de memoria estaba retrasando el acceso al bus de memoria del DMA.

Habilitarlo es mucho mejor ahora. Esto se ha hecho con esto:

// Enable FIFO (see p190 of ref manual)
DMA2_Stream1->FCR=DMA_SxFCR_DMDIS; // disable direct mode
    
respondido por el makapuf

Lea otras preguntas en las etiquetas