STM32 DMA: transferencia continua de periféricos a memoria (matriz)

3

Estoy tratando de usar un DMA en modo circular para transferir datos de un ADC a una matriz que contendrá los datos. Necesito usar simultáneamente los datos entrantes (en este caso, estoy usando los comandos AT para enviar los datos a través de Wi-Fi con el módulo esp8266)

Me pregunto cómo se vería el flujo de software.

Aquí hay algunas preguntas:

  • ¿Cómo sabrá el DMAC cuándo cerrarse cuando llegue al final de la matriz? - es decir, ¿cómo puedo asegurarme de que el DMA no transfiera datos más allá del último índice de matriz? (¿Este límite de tamaño está definido por DMA_BufferSize?)

  • Debido a que quiero usar simultáneamente los datos recopilados, estoy pensando en usar 3 matrices para almacenar los datos. Yo leería & borre los datos de una matriz mientras los otros están siendo rellenados por el DMA, y los ciclos se realizarán. ¿Es inteligente y / o posible cambiar el destino DMA constantemente de esta manera?

Gracias.

    
pregunta Ace Mango

2 respuestas

5
  

¿Cómo sabrá el DMAC cuándo envolver cuando llegue al final de   la matriz? - Es decir, ¿cómo puedo asegurarme de que el DMA no transfiera datos?   pasado el último índice de matriz? (¿Está este límite de tamaño definido por el   DMA_BufferSize?)

Sí, se detendrá en el límite establecido, o si habilita modo circular , volverá a comenzar y sobrescribirá los datos al inicio de la matriz. Nunca pasará el límite.

  

Leería & borrar los datos de una matriz mientras que los otros están   siendo llenado por el DMA, y sería circular alrededor. ¿Es inteligente y / o   ¿Es posible cambiar el destino DMA constantemente de esta manera?

En el STM32, puede asignar una gran matriz y usar las dos mitades como doble búfer. Hay una interrupción de media transferencia (cuando está habilitada) que le indica que la primera mitad está llena y lista para su procesamiento, y la segunda mitad se está modificando. Luego, obtendrá una interrupción de transferencia completa cuando la segunda mitad esté lista y (en modo circular) continuará actualizando la primera mitad.

Por lo tanto, no es necesario cambiar el destino de DMA (no puede hacerlo de todos modos mientras DMA se está ejecutando), pero siempre podrá saber qué mitad está lista al examinar los bits de estado de DMA.

En los controladores de extremo superior (STM32F4, STM32F7), en realidad hay dos direcciones de memoria para cada canal DMA, las mitades de los búferes no necesitan ser contiguas, e incluso puede cambiar la dirección del búfer inactivo sobre la marcha.

    
respondido por el berendi
2

Parece que el DMA STM32 admite la operación de doble búfer (no soy STM32 pro, por lo que no puedo decirle cuáles son las llamadas a la API relacionadas). Esto es lo que realmente estás buscando. Así es como lo manejas:

  1. Configura el tamaño y la ubicación de la memoria para dos búferes. Generalmente esos dos son de igual tamaño
  2. Comienzas la transferencia DMA
  3. Una vez que se haya llenado el primer búfer, el controlador DMA comenzará a almacenarse automáticamente en el segundo búfer sin datos perdidos
  4. Al mismo tiempo (cuando el DMA cambia el búfer) recibirá una interrupción, indicando que el búfer estaba lleno, ahora es el momento de actuar sobre los datos en el búfer 1 mientras el búfer 2 se está llenando
  5. Una vez que se haya llenado el búfer 2, el controlador DMA comenzará a sobrescribir los datos en la primera ubicación del búfer, sin necesidad de eliminar ningún dato ni nada. Nuevamente, recibirá una interrupción y ahora puede trabajar con los datos almacenados en el búfer 2.
  6. Repetir desde el principio

Básicamente, la idea es que el DMA llena un búfer mientras trabajas en el otro, el controlador DMA maneja el cambio entre los dos y no perderás ningún dato debido al tiempo requerido para cambiar. entre buffers si lo hiciste en software.

Los datos que se transfieren de una sola vez son, como usted dijo, típicamente programados en uno de los registros DMA, BufferSize suena como el camino a seguir (aunque no puedo confirmar esto para el STM32 ya que no conozco esa plataforma tan bien).

    
respondido por el Tom L.

Lea otras preguntas en las etiquetas