STM32F103C8T6: los primeros pasos. Comienza a hacer un osciloscopio

Sobre las alegrías y dificultades de la primera relación con STM32 después de AVR. Mientras implementaba la tarea más simple: transferir datos a una PC.


Al tener cierta experiencia con AVR, quiero comparar los controladores que llegaron (que cuestan individualmente $ 1.7 / unidad ) con aquellos cercanos a ellos al precio de ATMEGA328 ( $ 1.4 / unidad ).
ATMEGA328STM32F103C8T6Ganar, tiempos
Flash, kB32642
RAM, kB2veinte10
Frecuencia máxima, MHzveinte723.6
ADC velocidad, kSPSquince2 * 1000 (puede ser overclockeado)133

En el contexto de un aumento en los indicadores de rendimiento de 10 a 100 veces, Flash aumentó solo 2 veces. Además, estos 64 kB se consumen casi más rápido que 32 en AVR. Es lógico usar tales controladores donde se necesita un alto rendimiento, pero no hay algoritmos intensivos en código ... por ejemplo, un osciloscopio.

Apariencia de las placas de depuración: de izquierda a derecha:
imagen

  • Arduino UNO (ATmega328P), $ 3.59 ;
  • Nuestro tablero, que atormentaremos (STM32F103C8T6), $ 4.97 ;
  • Otra placa de depuración en STM32F103C8T6, $ 3.92 ;
  • Arduino Nano (ATmega328P), 2.23 - $ 2.56 .


Como programar


Hay una gran cantidad de entornos de programación STM32: IAR, Keil, Coocox ... al principio parece que es bueno y definitivamente encontrarás algo adecuado. Luego viene la comprensión de cómo se formó tal zoológico. Simplemente alguien hizo un IDE no muy bueno. Los demás lo miraron y decidieron qué podían hacer mejor. Y lo hicieron. De alguna manera resultó mejor, en algo peor. Después de leer las reseñas y probar el IAR, me decidí por Coocox.

Hay otro programa: STM32CubeMX. El hecho es que hay mucho más periféricos en STM32 que en AVR. Inicializarlo es mucho más difícil. STM32CubeMX le permite seleccionar un controlador, pinchar con el mouse y generar un código de inicialización. Incluso si no queremos usar este código generado, en STM32CubeMX es conveniente observar el esquema de pinout y reloj, seleccionar los divisores, factores y registrarlos manualmente en su código. ¡Muy recomendable para todos los principiantes!

STMStudio es un programa que permite el monitoreo en tiempo real de valores variables en MK.

Como programador, decidí usar el ST-Link V2 barato por $ 2.6 .
Todo está conectado de manera muy simple. Tome el pinout JTAG,


mire la imagen en ST-Link y conecte los cables (ST-LINK -> JTAG):



  • GND -> Pin 20;
  • 3.3V -> Pin 1;
  • RST -> Pin 15;
  • SWCLC -> Pin 9;
  • SWDIO -> Pin 7.

Ejecute CoIDE, escriba
Parpadeo
#include "stm32f10x.h"
int main(void)
{
	RCC->APB2ENR |= RCC_APB2Periph_GPIOC; //   
	GPIOC->CRH |= (0x3 << 20); //   50 
	GPIOC->CRH &= (~(0xC << 20)); //      -
	volatile long i = 0;
	while(1)
	{
		GPIOC->BSRR = GPIO_BSRR_BR13;
		for(i = 0; i < 1000*1000*5; i++){;};
		GPIOC->BSRR = GPIO_BSRR_BS13;
		for(i = 0; i < 1000*1000*5; i++){;};
	}
}

, AVR, , 2264 Flash… , AVR .
— 2176 .
STDLIB — 1476 .

compilar, flashear ... ¡y todo funcionó de inmediato! ¡Sin bailar con una pandereta! ¡Incluso el depurador en circuito funcionó! Iniciamos STMStudio, y funciona. ¡Construye gráficos de variables durante la operación MK! ¡Hay puentes en el tablero, pero no necesita cambiar nada para programar / iniciar el MK! ¡Al igual que con un Arduino! Bueno, no puede ser tan bueno ... pero no puede.

Comienza a hacer un osciloscopio


En mis sueños, el osciloscopio debería funcionar de la siguiente manera:
ambos ADC procesan simultáneamente la señal a una velocidad de 1-2 MSPS. Próximas 2 opciones:
  1. Todo esto se transfiere en tiempo real a la PC a través de USB y se toma una decisión sobre qué hacer con él (recuerde, construir un gráfico, procesarlo de alguna manera, ...);
  2. . : (, , , ). .

Ambas opciones no se pudieron implementar.
La primera es porque no pude iniciar el USB. Más bien, solo pude generar el proyecto en STM32CubeMX. Pero después de exportarlo a CoIDE, fue necesario cambiar el gestor de arranque con puentes para la programación / operación, lo cual no es conveniente. Por lo tanto, rechacé esta opción. Bueno, además, la velocidad del USB es de solo 12 Mb / s. Los datos a alta velocidad en tiempo real seguirán sin ajustarse. Para transferir datos de alguna manera a la computadora, conecté un convertidor USB <-> UART comprado en el momento para programar el Arduino Pro Mini. La segunda opción estaba cubierta porque el manejador de interrupciones dura más que el ADC. La velocidad se limitó a solo 340-500 kSPS, que es varias veces menos de lo esperado.





La única opción que funciona a alta velocidad resultó ser esta: los ADC funcionan continuamente cuando necesitamos medición, activamos DMA, esperamos que se llene el búfer, apagan DMA y transfieren datos lentamente a la PC a través de USART. Esta opción superó todas las expectativas. ¡MK se puede overclockear para que resulte 9 MSPS con dos ADC! Aquellos. ¡4.5 veces más que de acuerdo con la documentación! Al mismo tiempo, es bastante cómodo observar una señal con una frecuencia de hasta 1 MHz. En comparación con lo que logramos antes en Arduino (10 kSPS), el resultado es muy bueno: ¡la velocidad aumentó 900 veces!

Sin embargo, con el overclocking, no todo es tan alegre. En el futuro, para que el USB funcione, la frecuencia deberá reducirse en 16/9 = 1,8 veces y luego solo se obtendrán 5 MSPS.

Al tratar de manejar USB y otros periféricos, me di cuenta de un inconveniente significativo de estos controladores: hay muy poca información en Internet. Si AVR tiene un montón de todo, resultó que no fue tan fácil encontrar un ejemplo de operación simultánea de dos ADC en modo intercalado rápido .

Arduino UNO! Fue elegido como generador de señal para la prueba del osciloscopio. No porque sea bueno o algo así ... es muy rápido.
Escribe 8 líneas:
 void setup() {
  pinMode(2, OUTPUT);  
  long d = 10;
  for(;;){
    PORTD = 255;
    delayMicroseconds(d);
    PORTD = 0;  
    delayMicroseconds(d);
  }
}

void loop() {
  
}


Conecte el cableado USB + 1 (para que el STM32 de 3.3 voltios no muera por una señal de 5 voltios, la señal se alimenta a través de una resistencia de 2 kΩ) y listo.

Resultó lo siguiente (debajo de cada imagen hay una fotografía de la misma señal en la pantalla de un osciloscopio analógico): Período de señal 0,9 μs. 1 metro = 10 píxeles. En el osciloscopio, 1 división = 0.5 μs. Periodo de señal 10 μs. 1 metro = 5 píxeles. En el osciloscopio, 1 división = 2 μs. Las partes superiores se cortan porque la señal excede el voltaje de referencia ADC.









Que sigue


En los planes:
  1. Derrota a USB para abandonar el convertidor USB <-> USART;
  2. Termine la parte analógica para que el rango de voltaje de entrada no sea 0 - 3.3 V, sino más decente;
  3. Hacer modo multicanal;
  4. Implemente el control desde una PC;
  5. Haga un dispositivo terminado en el caso.


En conclusión, llamo la atención sobre dos desventajas reveladas de STM32 en comparación con AVR:
  1. Mayor consumo de memoria Flash;
  2. Inicialización compleja de la periferia, que se ve agravada por la falta de materiales.


No sé cómo, pero para una tarea tan simple, tomó 31 kB Flash.
El circuito de la placa de depuración (no fue fácil de encontrar).

La segunda parte del artículo.

Source: https://habr.com/ru/post/es384723/


All Articles