STM32F107 SPI -> Tasa de transferencia máxima UART

Estoy diseñando una placa con microcontrolador STM32F107 y AD7680 ADC. Lo que necesito es leer datos de ADC, incrementar el número de secuencia después de leer cada muestra y enviar valores de ADC a través de UART o USB OTG (dispositivo USB CDC) a una computadora. También necesito captar el flanco ascendente en un solo pin de activación GPIO y recordar el número de secuencia en el momento de la activación.

La principal limitación es la velocidad: necesito hacerlo lo más rápido posible. Como no tengo mucha experiencia con MCU de Cortex, tengo dos preguntas:

  • ¿Es posible lograr este escenario usando DMA (es decir, sin un bucle que consumirá todo el tiempo de CPU)?

  • Lo sé, es difícil, pero ¿alguien puede estimar la tasa de muestreo máxima alcanzable (5 kHz, 20 kHz, 50 kHz...)?

Gracias de antemano, cualquier sugerencia es bienvenida.

Klasyc

Respuestas (1)

Se puede usar DMA, pero solo tiene sentido si reúne las muestras en "bloques". Por ejemplo, DMA toma 100 muestras de ADC y las coloca en algún área de la memoria. Una vez hecho esto, envía todo el bloque a través de la UART, utilizando otro canal DMA y, simultáneamente, el primer canal DMA toma otras 100 muestras ADC en otra área de la memoria. Repetir.

Sin embargo, no funciona igual con la interfaz USB en STM32F107. DMA no interactúa directamente con USB, porque USB tiene un búfer de paquetes dedicado. Sin embargo, podría usar DMA para transferir datos a este búfer de paquetes.

Sin embargo, aún debe tener un ciclo principal, obviamente. Solo se llamará cada 100 muestras en lugar de para cada muestra, lo que liberará algo de energía de la CPU. Pero el compromiso es que hay una latencia adicional para obtener las muestras.

Ahora, para estimar la velocidad de datos máxima, hay tres factores limitantes: la CPU, el ADC y la interfaz de comunicación de salida. Creo que la CPU, a menos que la ejecute a una frecuencia muy baja, no será el cuello de botella. El cuello de botella serán los periféricos. El ADC realiza la conversión en aproximadamente 1 µS, por lo que está bien para las tasas que menciona en su pregunta. Ahora, el periférico de salida: si es el UART, todo depende de la tasa de baudios que pretendas usar, y los cálculos se hacen rápidamente: a 4,5 Mbit/s (velocidad máxima para USART1), con 16 bits por muestra (ADC es de 12 bits, pero debe redondear el tamaño de la muestra a un byte completo), genera alrededor de 280 kmuestras/segundos. Tal vez tenga algunos gastos generales debido al protocolo, así que hágalo un poco menos. Para USB, las matemáticas son las mismas, excepto que la velocidad de comunicación es de 12 MBit/seg. pero la sobrecarga del protocolo será mayor. Al final, podrá ir al menos tan rápido como con el USART.

Editar : Lo siento, me acabo de dar cuenta de que el ADC es externo. Pero no cambia lo que dije, excepto que las muestras provienen de SPI (y DMA debería interactuar con SPI, entonces). Entonces, el factor limitante aquí será el propio ADC, a 100 ksps.