Tengo algunas preguntas sobre el uso del DMA de la placa stm32f7 (nucleo F722ZE).
1) Para comenzar, explicaré lo que estoy haciendo:
Necesito leer datos de 2 pines GPIO (ADC) y se enviará una señal de reloj al stm32f7 desde el dispositivo que suministra los datos. Planeo dejar que la señal del reloj active un temporizador de interrupción y siempre que se active el temporizador quiero que el DMA haga una transferencia de memoria a periférico. La memoria será de 2 bits en el puerto GPIO y el periférico será una línea SPI acoplada a una tarjeta SD.
2) Accediendo a los datos:
Me referí al manual de arm Cortex 7 y encontré lo siguiente:
El puerto GPIOC se asigna a 0x40020800 - 0x40020BFF y los registros de datos de entrada se configuran en un desplazamiento de 0x14 .
¿Entonces tomo el registro base mapeado en memoria (0x40020800 y le agrego 0x14) Por lo tanto, la dirección de origen que proporcioné al DMA será 0x40020814?
3) Si el DMA cambia estos datos.
Este podría ser el problema más grande. Una vez que tenga los datos en los pines GPIO, esencialmente los recibiré bit a bit y los datos en realidad tienen una longitud de 24 bits, por pin. Entonces, en total, cada pin de gpio recibirá paquetes de datos de 24 bits. Aunque cuando la señal externa active el temporizador, solo tendré un bit en cada uno de los GPIO.
¿Hay alguna manera de que el DMA pueda extraer los datos bit a bit de manera selectiva, hasta que tenga los 24 bits y luego enviarlos a través del SPI? ¿Utilizando algún tipo de búfer y ráfaga de transferencia? De lo contrario, parece que el DMA puede hacer un mínimo de transferencia de un byte, lo que requerirá que envíe cantidades masivas de bits de basura por cada bit que transfiero.
Finalmente: En resumen, no estoy seguro de la ubicación de los datos GPIO, ¿es correcta la dirección y no estoy seguro de cómo hacer que el DMA transfiera estos datos?
Cualquier ayuda será apreciada!