Código de esquema de ADC crítico de tiempo STM32

1

Tengo la intención de usar un STM32F401RE (en una placa del núcleo) para capturar algunos datos basados en el tiempo.

Soy nuevo en ARM y tengo un fondo de 8bit uC (AVR). Tengo una cadena de herramientas configurada (usando gcc como parte de AC6 SW4STM32) y he usado la biblioteca HAL proporcionada por ST para hacer LEDs de enlace simple, etc.

He estado importando proyectos CubeMX en SW4STM32.

Estoy viendo la medición de voltaje a 10kS / s por un período de 3 segundos. Quiero usar el ADC de 12 bits completo.

Estaría bien lleno si alguien pudiera ayudarme con la estructura de código de alto nivel antes de invertir el tiempo aprendiendo las funciones, etc. y quedarme atascado en la codificación ...

Tengo algo como lo siguiente en mi cabeza, la interrupción se activa cada vez que se requiere una muestra ...

ISR every 1/10000s
    if measure > 0
        read ADC and ouptut to UART        
        measure++
        if measure == 30000
            measure = 0

main
    loop forever
        if measure==0
            if start_button == 1
                measure = 1

¿Cómo se ve esto como un punto de partida? Además, ¿cuál es la opinión general sobre el uso de las bibliotecas? En 8 bits, una "biblioteca" es poco más que algunas etiquetas para los registros, parece que se usan mucho más comúnmente en ARM ... ¿Debería aceptar el uso de HAL de ST, intentar restringirlo a CMSIS o realmente intentar y continuar presionando memoria? como en 8bit?

Cualquier orientación es muy recibida ...

    
pregunta OGMGIC

2 respuestas

2

lo más sencillo sería configurar un temporizador y en el temporizador iniciar el anuncio.

puede establecer la interrupción del temporizador en la prioridad más alta / más alta.

  

En 8 bits, una 'biblioteca' es poco más que algunas etiquetas para registros,

también se utilizan muchas bibliotecas en el mundo de 8 bits. puede estar pensando en macros vs. bibliotecas.

  

parece que se usan mucho más comúnmente en ARM ...

debido a su complejidad y su curva de aprendizaje mucho más pronunciada.

  

¿Debería simplemente aceptar el uso de la HAL de ST, intentar restringir a CMSIS o realmente intentar y continuar pinchando la memoria como en 8 bits?

es muy difícil NO usar cmsis para iniciar el dispositivo.

en cuanto a la biblioteca, inténtelo y puede ayudarlo a comenzar más pronto / más rápido.

Por lo general, comienzo con las bibliotecas OEM, pero las encajero de una manera que en el futuro puedo reemplazarlas con mi propio código si así lo deseo.

con una biblioteca oem, normalmente obtienes códigos de calidad + ejemplos de trabajo. vienen con un poco de sobrecarga (1-2KB típico) pero eso no es nada para un chip ARM típico.

editar: esto es lo que normalmente hago para todas mis rutinas relacionadas con el temporizador - > tienen una estructura idéntica pero se implementan de manera diferente en 8/16/32 chips:

ISR:
  clear the flag;
  _isrptr(); //execute the user handler

timer initialization (prescaler, period)
  stop the timer
  initialize the timer for user-specified prescaler and period
  start the timer - interrupt still disabled

timer activation (isrptr)
  _isrptr = isrptr; //install user handler
  clear the flag
  enable the interrupt

permite la instalación de una rutina especificada por el usuario en el temporizador isr. en su caso, esa rutina instalada por el usuario podría ser encender / apagar el anuncio, guardar / procesar los datos, configurar una bandera ...

este conjunto de rutinas será genérico y se puede portar de un chip a otro. puede implementarse a través de bibliotecas o puede hacer su propio rollo, completamente transparente al código de espacio del usuario, lo que significa que puede alternar entre las implementaciones libremente sin la necesidad de cambiar el código de usuario.

edit 2: aquí hay un ejemplo. el siguiente código,

tim1_init(1000, 1000);                  //run tim1 at 1000 prescaler + 1000 period = 1M
tim1_act(led_flp);                      //install user handler

se ejecuta en STM8S - > configura el temporizador 1 para que se desborde cada 1M ciclos y luego, en el desbordamiento del temporizador 1, ejecuta led_flp (), instalado por tim1_act ().

Substancialmente el mismo código se ejecuta en PIC, AVR, MSP430, PIC24 y varios chips ARM. Algunas versiones funcionan con SPL de ST (para STM8 y STM32), otras ejecutan el driverlib de Luminary, y otras ejecutan código codificado - > en el caso de STM8, algunos de los archivos de encabezado de IAR y otros fuera del stm8s.h desde el SPL, sin utilizar realmente el SPL.

Esto es para mostrar que la cuestión de si se debe usar una biblioteca de proveedores es bastante discutible, si estructura su código de manera adecuada. Para el código de usuario, no hace una gran diferencia si esas rutinas se implementaron en una biblioteca de proveedores o se realizaron mediante la modificación de los registros. Al final del día, hace el trabajo, y con suerte se hace bien.

Entonces, en lugar de perder el tiempo, si debe adoptar un enfoque particular, solo tome un enfoque y asegúrese de hacerlo correctamente.

    
respondido por el dannyf
1

CMSIS es, en su mayoría, un marco para facilitar la lectura de "solo meter memoria" (utilizando estructuras y macros). Creo que es justo decir que no ganas nada al deshacerte de CMSIS y tratar de usar el metal desde cero.

Cuando se trata de una HAL, las cosas se complican un poco más. Con frecuencia, la inicialización del control de reloj y del pin necesario para los periféricos no es trivial. Tal vez no demasiadas escrituras, pero resolver lo que se requiere puede llevar algo de tiempo; ahorrar este tiempo es donde una buena HAL puede ayudar. La calidad puede variar, pero probablemente valga la pena encontrar un marco adecuado que pueda escalar a sus proyectos futuros y familiarizarse con él. En el punto en el que necesita subprocesos y redes, probablemente no quiera hacer lo suyo para las cosas 'genéricas'.

    
respondido por el Sean Houlihane

Lea otras preguntas en las etiquetas