stm32 gpio a dma

1

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!

    
pregunta Engjunkie

3 respuestas

1
  1. GPIO no es el ADC. No entiendo lo que quieres decir. Si es un ADC externo, probablemente lo transfiera mediante interfaces estándar como I2C o SPI. Si desea leer los datos analógicos que necesita usar, entonces el ADC interno
  2. Tienes todo lo definido en los encabezados de CMSIS. No necesitas pensar en las direcciones físicas. Accederá a los registros de GPIO a su manera: por ejemplo, GPIOA -> MODER . Hay todas las definiciones de bits también en la forma legible por humanos.
  3. DMA no transfiere bits solo bytes, palabras a medias o palabras. Pero debe considerar una forma más inteligente de leerlos que una idea inicial. Como no escribió el dispositivo conectado, no puedo ayudarlo más.
  4. Mi consejo: comience con algo más fácil: aprenda a usar CMSIS y los periféricos en su micro. Estoy 100% seguro de que puede usar uno de los estándares: I2C, SPI o U (S) ART para él sin ninguna lectura de bits desde el GPIO
respondido por el P__J__
0

1) Esto suena como SPI . ¿Tenemos un XY-Problem ?

2) Necesitaría el GPIO port input data register (GPIOx_IDR) (x = A..K) , que está en el desplazamiento 0x10 desde el periférico GPIO base. La dirección base de cada periférico se encuentra en el encabezado stm32f7 o en la Tabla 1 del manual de referencia. (RM0385: Tabla 1)
Puede acceder a los registros GPIO en modo palabra, media palabra o byte. (RM0385: 6.4)
Nota: no puede acceder a todos los periféricos en todos los anchos.

3) No es la forma más eficiente con el DMA, la tasa de bits sería baja (kHz), pero se puede hacer.

  1. Haga que el DMA lea el byte en el disparador al búfer de memoria (circular). (o palabras si los gpio están muy separados)
  2. En DMA Complete / Half IRQ, reúna la palabra del búfer DMA. Sería bueno si tuviera bitbanding, pero el Cortex M7 carece de esto.
  3. Procesa la palabra. Preferiblemente en otra función para mantener la capa de bitbanging separada del procesamiento de datos.

Los bits de salida con DMA funcionan de la misma manera, excepto que debe usar GPIO port bit set/reset register (GPIOx_BSRR) (x = A..K) para no cambiar la E / S irrelevante.

    
respondido por el Jeroen3
0
  

una línea SPI acoplada a una tarjeta SD

El STM32F722ZE tiene interfaces SDMMC dedicadas que son significativamente más rápidas que SPI, especialmente si conectas los 4 pines de datos.

  

¿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?

Estaría bien si obtuviera la dirección correcta ( IDR está en offset 0x10 ), pero sería aún mejor usar las definiciones de los encabezados estándar

DMAx->SyPAR = (uint32_t)&(GPIOC->IDR);

y entonces sería obvio para todos los que miran tu código de qué trata este fragmento de código. Además, ayuda a evitar errores en el cálculo de la dirección.

  

Hay alguna forma en que el DMA pueda extraer los datos bit a bit de manera selectiva, hasta que tenga todos los 24 bits y luego enviarlos a través del SPI.

Conecte cada línea de datos a un controlador SPI diferente (hay 5 de ellos), conecte la línea del reloj a ambos. Deje que cada uno llene un búfer de 256 bytes (con DMA), uno junto al otro, para mantener al controlador SD satisfecho con un tamaño de bloque de 512 bytes (los búferes de 2 * 2048 bytes pueden ser incluso mejores). Cuando los buffers estén llenos, escriba todo el bloque en la tarjeta, mientras que los canales SPI DMA pueden cambiar automáticamente a buffers secundarios en una dirección diferente. Es posible que desee utilizar más de 2 búferes alternos para permitir las actualizaciones del sistema de archivos, si está utilizando alguno (FATFS puede ser muy lento al actualizar la tabla FAT). Supongo que puede volver a ensamblar los bits más tarde, cuando en realidad esté procesando los datos.

    
respondido por el berendi

Lea otras preguntas en las etiquetas