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?