Módulo DMA en Microcontroladores de la serie STM32F4.

Introducción.

La mayoría de las aplicaciones embebidas necesita intercambiar datos con el mundo exterior mediante la gestión de periféricos. Por ejemplo, nuestro microcontrolador puede intercambiar con otros módulos, mensajes almacenados en memoria SRAM usando un puerto UART, o puede almacenar datos en una SD externa usando una de las interfaces SPI disponibles. Esto implica una transferencia de datos y requiere un cierto número de ciclos de CPU para realizar dicha acción, por lo tanto el CPU se mantendrá ocupado hasta terminar la transferencia y no podrá atender otras tareas mientas tanto.

Imagen 1. Transferencia de datos desde SRAM al puerto UART  sin DMA.

Para eliminar la necesidad de ocupar el CPU en este tipo de tareas, los ingenieros idearon un sistema de gestión de trasferencia de datos especial, llamado: Acceso de Memoria Directo o DMA (Direct Memory Access). El DMA es un Módulo de Bus Avanzado de Alto Rendimiento o AHB (Advanced High-performance Bus) que cuenta con tres puertos: un puerto esclavo para programación DMA y dos puertos maestros (puertos periféricos y de memoria) que permiten al DMA iniciar transferencias de datos entre diferentes módulos esclavos.

El DMA permite que las transferencias de datos tengan lugar en segundo plano, sin la intervención del procesador Cortex-M. Durante esta operación, el procesador puede ejecutar otras tareas y sólo se interrumpe cuando está disponible un bloque de datos completo para su procesamiento. Por lo tanto, se pueden transferir grandes cantidades de datos sin tener un impacto en el rendimiento del procesador.

Imagen 2. Transferencia de datos desde la RAM hacia el DAC utilizando DMA.

DMA en los microcontroladores STM32.

Los microcontroladores de STM pueden contener desde uno hasta varios DMA. Cada DMA implementa ocho canales diferentes. Cada canal está dedicado a gestionar solicitudes de acceso a memoria desde uno o más periféricos. Cada canal puede tener hasta ocho solicitudes en total (pero tenga en cuenta que sólo un solicitud por canal puede estar activo al mismo tiempo), y tiene un árbitro para manejar la prioridad entre las solicitudes de DMA. Además, cada canal puede proporcionar opcionalmente un buffer FIFO de memoria de 32bits. El FIFO se utiliza para almacenar temporalmente los datos procedentes de la fuente antes de transmitirla al destino. Cada canal puede ser también activado por “software”.

Imagen 3. Arquitectura del módulo DMA en los controladores STM32F4.

Selección de canales de canales de transferencia DMA.

Los dispositivos STM32F4 incorporan dos controladores DMA (DMA1 y DAM2), ofreciendo hasta 16 canales de transferencia en total (ocho por controlador), cada uno dedicado a gestionar solicitudes de acceso a memoria de uno o más periféricos. Cada DMA tiene hasta ocho canales seleccionables en total, esta selección es configurable por software y permite que varios periféricos realicen solicitudes de transferencia.

Cada solicitud de transferencia está asociado con una canal DMA, se puede seleccionar entre ocho solicitudes de canal posibles. La imagen 4 describe la selección de uno de los canales DMA para una solicitud de transferencia.

Imagen 4- Multiplexor para la selección de una petición de transferencia para un canal DMA.

Las ocho peticiones de los periféricos (TIM, ADC, SPI, I2C, etc.) están conectadas independientemente a cada canal y su conexión está asignada como se observa en las tablas 1 y 2. Las tablas dan la configuración disponible de las solicitudes de transferencia disponibles para cada periférico y los canales DMA.

La asignación de solicitudes de DMA está diseñada de tal manera que la aplicación de software tiene más flexibilidad para asignar cada solicitud DMA para la solicitud periférica asociada y que la mayoría de las aplicaciones de casos de uso están cubiertas por multiplexión de selección.

Tabla 1. Mapeo de los canales con los periféricos (Solicitudes del  DMA1).

Tabla 2 . Mapeo de los canales con los periféricos (Solicitudes del  DMA2).

Modos de transferencia de los DMA.

Cada una de las ocho solicitudes de transferencia disponibles por el controlador DMA, proporciona un enlace de transferencia unidireccional entre una fuente y un destino. Cada solicitud se puede configurar para realizar transferencias de memoria a periféricos, transferencias de periféricos a memoria o memoria a memoria en los siguientes modos:

Modo circular.

Está disponible para manejar buffers circulares y flujos de datos continuos. Cuando se activa el modo circular, se vuelve a cargar automáticamente el número de elementos de datos a transferir con el valor inicial programado durante la fase de configuración de flujo y las solicitudes de DMA siguen siendo atendidas.

Modo Normal.

Al contrario que el modo circular, una vez que el último dato es trasmitido,  el flujo es desactivado hasta que se indique una nueva trasferencia de modo manual.

Modo Doble Buffer.

Las transferencias de búfer doble usan dos punteros de memoria, de este modo, el controlador DMA cambia de un destino de memoria a otro en cada extremo de la transacción, mientras un DMA está leyendo o escribiendo de un búfer, la aplicación puede escribir o leer en el otro.

La cantidad de datos a transferir (hasta 65535) es programable y está relacionada con el ancho de fuente del periférico que solicita la transferencia DMA conectada al puerto AHB periférico. El registro que contiene la cantidad de elementos de datos a transferir, se decrementa después de cada transacción.

Tipo de transferencia DMA.

El controlador DMA realiza la transferencia directa de memoria como un maestro AHB y puede tomar el control de la matriz del bus AHB para iniciar transacciones AHB. EL DMA puede realizar los siguientes modos de trasferencia.

Periférico a Memoria.

Cuando este modo está habilitado, cada vez que se produce una petición periférica (un periférico inicia una petición), el DMA inicia una transferencia desde la fuente (periférico) a la memoria intermedia FIFO del sistema. Cuando se alcanza el nivel de umbral de la memoria FIFO (es decir cuando se llena con una cierta cantidad de información) el contenido de la FIFO se drena y se almacena en la localidad de memoria destino. Ver la imagen 5. La transferencia de datos se puede detener cuando:

  • Ya se enviaron todos los datos.
  • El periférico solicita el fin de la transferencia.
  • Es solicitado por software.

Imagen 5. Transferencia desde el periférico a la memoria.

Memoria a Periférico.

Cuando este modo está habilitado, el DMA inicia inmediatamente transferencias desde el origen (localidad de memoria fuente) hacia la memoria FIFO. En este tipo de transferencia, el contenido de la FIFO se drena cada vez que se produce una petición periférica y su contenido es transferido en el periférico destino. Cuando la cantidad de datos almacenados en la memoria FIFO es inferior o igual a un nivel de umbral predefinido, la FIFO es recargada totalmente con datos provenientes de la memoria. Ver la imagen 6. La transferencia de datos se puede detener cuando:

  • Ya se enviaron todos los datos.
  • El periférico solicita el fin de la transferencia.
  • Es solicitado por software.

Imagen 6. Transferencia desde la memoria al periférico.

Memoria a Memoria.

En el modo de memoria a memoria los canales del DMA pueden funcionar sin ser activados por una petición desde un periférico.  En este modo el DMA es habilitado por una petición por software. Cuando se realiza dicha petición, el DMA inmediatamente comienza a llenar la memoria FIFO, desde una localidad de memoria fuente, hasta alcanzar una cantidad de datos o nivel de umbral predefinido. Cuando el nivel umbral se alcanza, los datos en la FIFO se transfieren hacia la localidad de memoria destino. Ver la imagen 7. La transferencia se detiene cuando:

  •  Ya se enviaron todos los datos desde la localidad de memoria fuente.
  • Es solicitado por software.

Nota: Cuando se utiliza el modo de memoria a memoria, no se permite el modo circular. Sólo el controlador DMA2 es capaz de realizar transferencias de memoria a memoria.

 Imagen 7. Transferencia de memoria a memoria.

Prioridad de transferencia.

Cada puerto DMA tiene un árbitro que gestiona las ocho solicitudes de flujo DMA. El arbitro gestiona la secuencia de acceso entre los periféricos y la memoria,  basado en la prioridad de cada uno de los dos puertos maestros AHB. Ver imagen 8. Las prioridades se gestionan en dos etapas:

  • Etapa por Software. Cada prioridad de transferencia se configura por software y se tienen disponibles cuatro niveles:
  1. – Muy Alta prioridad.
  2. – Alta prioridad.
  3. – Prioridad media.
  4. – Baja prioridad.
  • Etapa por Hardware. Si dos solicitudes tienen el mismo nivel de prioridad de software, la solicitud del número más bajo tiene prioridad sobre la solicitud con el número más alto. Por ejemplo, la secuencia 2 tiene prioridad sobre la secuencia 4.

Propiedades de transferencia DMA.

Una transferencia DMA se caracteriza por las siguientes propiedades:

  • Un Canal por solicitud de transmisión.
  • Selección de prioridad de transmisión.
  • Definir direcciones de origen y de destino.
  • Transferencia en modo ráfaga.
  • Tamaño de transferencia (sólo cuando el DMA es el controlador de flujo).
  • La dirección de origen y/o destino puede incrementarse de manera automática.
  • Configurar ancho de datos de origen y destino.
  • Configurar el modo de la memoria FIFO.
  • Configurar modo de doble buffer.
  • Control de flujo.

Tamaño de transferencia.

El valor del tamaño de transferencia sólo se debe definir cuando el DMA es el controlador de flujo. De hecho, este valor define el volumen de datos que se van a transferir de origen a destino. Dependiendo de la petición recibida (ráfaga o simple), el valor del tamaño de transferencia disminuye en la cantidad de datos transferidos. El ancho de datos para origen y destino puede definirse como:

  • Byte (1 byte).
  • Half-word (2 bytes).
  • Word (3 bytes).

Incremento de la dirección de origen / destino.

Los punteros de dirección de los periféricos y de la memoria pueden opcionalmente ser post-incrementados automáticamente o mantenerse constantes después de cada transferencia, dependiendo de la configuración.Ver imagen 8.

Imagen 8. Incremento de la dirección de origen y destino.

La desactivación del modo de incremento automático es útil cuando: se accede a los datos de origen del periférico o de destino a través de un único registro. Si está activado el modo de incremento, la dirección de la siguiente transferencia será la dirección de la anterior incrementada en 1, 2 o 4 bytes en función del ancho o tipo de datos configurado.

Con el fin de optimizar la operación de empaquetado, es posible fijar el tamaño de desplazamiento del incremento para la dirección periférica, cualquiera que sea el tamaño de los datos transferidos en el puerto periférico AHB.

Interrupciones generadas por el DMA.

Para cada trasmisión del DMA, se puede producir una interrupción en los siguientes eventos:

Media transferencia.

Esta interrupción se habilita cuando una transferencia se ha completado hasta la mitad de datos configurados anteriormente.

Transferencia completa.

Esta interrupción se habilita cuando una transferencia se ha completado satisfactoriamente.

Error durante la transferencia.

Esta interrupción se establece cuando:

  • Se produce un error de bus durante una lectura DMA o un acceso de escritura.
  • El software solicita un acceso de escritura en un registro de direcciones de memoria en el modo de búfer doble, mientras que el flujo está habilitado y la memoria de destino actual es la que es impactada por la escritura en el registro de direcciones de memoria.

Error por desbordamiento de la memoria FIFO.

El indicador de interrupción de error FIFO se establece si:

  • Se detecta una condición de mal funcionamiento en la FIFO.
  • Se detecta una condición de desbordamiento en la FIFO (en el modo de memoria a memoria no hay detección, porque las solicitudes y transferencias son gestionadas internamente por el DMA).
  • El flujo está habilitado mientras que el nivel de umbral FIFO no es compatible con el tamaño de la transmisión.

Error de modo directo.

Este indicador se establece cuando se produce una solicitud de DMA, mientras que los datos anteriores aún no se han transferido completamente a la memoria (porque no se permitió acceso al bus de memoria). En este caso, la interrupción indica que se transfirieron sucesivamente dos elementos de datos a la misma dirección de destino, lo que podría ser un problema si el destino no es capaz de gestionar esta situación

Menú