STM32F103C8T6 - die ersten Schritte. Beginnen Sie mit der Herstellung eines Oszilloskops

Über die Freuden und Schwierigkeiten der ersten Bekanntschaft mit STM32 nach AVR. Da habe ich die einfachste Aufgabe implementiert - Daten auf einen PC zu übertragen.


Mit etwas Erfahrung mit AVR möchte ich die eingetroffenen Controller (die einzeln 1,7 USD / Einheit kosten ) mit denen in ihrer Nähe zum Preis von ATMEGA328 ( 1,4 USD / Einheit ) vergleichen.
ATMEGA328STM32F103C8T6Gewinnen Sie mal
Flash, kB32642
RAM, kB2zwanzig10
Maximale Frequenz, MHzzwanzig723.6
ADC-Geschwindigkeit, kSPSfünfzehn2 * 1000 (kann übertaktet werden)133

Vor dem Hintergrund einer 10-100-fachen Erhöhung der Leistungsindikatoren stieg Flash nur um das 2-fache. Darüber hinaus werden diese 64 kB bei AVR fast schneller verbraucht als 32. Es ist logisch, solche Steuerungen dort zu verwenden, wo eine hohe Leistung erforderlich ist, aber es gibt keine codeintensiven Algorithmen ... zum Beispiel ein Oszilloskop.

Aussehen der Debug-Boards: Von links nach rechts:
Bild

  • Arduino UNO (ATmega328P), 3,59 USD ;
  • Unser Board, das wir quälen werden (STM32F103C8T6), $ 4,97 ;
  • Ein weiteres Debugboard auf STM32F103C8T6, 3,92 US-Dollar ;
  • Arduino Nano (ATmega328P), 2,23 - 2,56 USD .


Wie man programmiert


Es gibt sehr viele Programmierumgebungen STM32 - IAR, Keil, Coocox ... auf den ersten Blick scheint es gut zu sein und Sie werden auf jeden Fall etwas Passendes finden. Dann kommt das Verständnis, wie ein solcher Zoo entstanden ist. Nur jemand hat eine nicht sehr gute IDE gemacht. Die anderen schauten es sich an und entschieden, was sie besser machen könnten. Und sie taten es. In gewisser Weise stellte sich heraus, dass es besser war, in etwas Schlimmerem. Nachdem ich die Bewertungen gelesen und die IAR ausprobiert hatte, entschied ich mich für Coocox.

Es gibt ein anderes Programm - STM32CubeMX. Tatsache ist, dass STM32 viel mehr Peripheriegeräte enthält als AVR. Die Initialisierung ist viel schwieriger. Mit STM32CubeMX können Sie einen Controller auswählen, mit der Maus stochern und einen Initialisierungscode generieren. Auch wenn wir diesen generierten Code nicht verwenden möchten, ist es in STM32CubeMX praktisch, das Pinbelegungs- und Taktschema zu betrachten, die Teiler und Faktoren auszuwählen und sie manuell in Ihrem Code zu registrieren! Sehr zu empfehlen für alle Anfänger!

STMStudio ist ein Programm, das die Echtzeitüberwachung von Variablenwerten in MK ermöglicht.

Als Programmierer habe ich mich für den günstigen ST-Link V2 für 2,6 US-Dollar entschieden .
Alles ist sehr einfach miteinander verbunden. Nehmen Sie die JTAG-Pinbelegung,


sehen Sie sich das Bild auf ST-Link an und schließen Sie die Kabel an (ST-LINK -> JTAG):



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

Führen Sie CoIDE aus und schreiben Sie
Blinken
#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 .

kompilieren, flashen ... und alles hat sofort funktioniert! Ohne mit einem Tamburin zu tanzen! Sogar der In-Circuit-Debugger hat funktioniert! Wir starten STMStudio - und es funktioniert. Erstellt Diagramme von Variablen während des MK-Betriebs! Es gibt Jumper auf dem Board, aber Sie müssen nichts umschalten, um den MK zu programmieren / zu starten! Genau wie bei einem Arduino! Nun, es kann nicht so gut sein ... aber es kann nicht.

Beginnen Sie mit der Herstellung eines Oszilloskops


In meinen Träumen sollte das Oszilloskop wie folgt funktionieren:
Beide ADCs verarbeiten das Signal gleichzeitig mit einer Geschwindigkeit von 1-2 MSPS. Nächste 2 Optionen:
  1. All dies wird in Echtzeit über USB an den PC übertragen und dort wird entschieden, was damit geschehen soll (denken Sie daran, erstellen Sie ein Diagramm, verarbeiten Sie es irgendwie, ...).
  2. . : (, , , ). .

Beide Optionen konnten nicht implementiert werden.
Das erste ist, weil ich USB nicht starten konnte. Vielmehr konnte ich das Projekt nur in STM32CubeMX generieren. Nach dem Export nach CoIDE musste der Bootloader jedoch durch Jumper für die Programmierung / Bedienung ersetzt werden, was nicht praktisch ist. Daher habe ich diese Option abgelehnt. Außerdem beträgt die USB-Geschwindigkeit nur 12 Mbit / s. Daten mit hoher Geschwindigkeit in Echtzeit passen immer noch nicht. Um Daten irgendwie auf den Computer zu übertragen, habe ich einen USB-UART-Konverter angeschlossen , der zu der Zeit für die Programmierung des Arduino Pro Mini gekauft wurde. Die zweite Option wurde abgedeckt, weil Der Interrupt-Handler hält länger als der ADC. Die Geschwindigkeit war auf nur 340-500 kSPS begrenzt, was um ein Vielfaches geringer als erwartet ist.





Die einzige funktionierende Hochgeschwindigkeitsoption stellte sich als folgende heraus: ADCs arbeiten kontinuierlich, wenn eine Messung erforderlich ist, schalten DMA ein, warten, bis sich der Puffer gefüllt hat, schalten DMA aus und übertragen langsam Daten über USART an den PC. Diese Option hat alle Erwartungen übertroffen. MK kann übertaktet werden, so dass sich 9 MSPS mit zwei ADCs ergeben! Jene. 4,5 mal mehr als laut Dokumentation! Darüber hinaus ist es sehr bequem, ein Signal mit einer Frequenz von bis zu 1 MHz zu beobachten. Im Vergleich zu dem, was wir früher mit Arduino (10 kSPS) erreicht haben, ist das Ergebnis sehr gut - die Geschwindigkeit wurde um das 900-fache erhöht!

Beim Übertakten ist jedoch nicht alles so fröhlich. Damit USB in Zukunft funktioniert, muss die Frequenz um das 16/9 = 1,8-fache reduziert werden, und dann werden nur 5 MSPS erhalten.

Beim Versuch, mit USB und anderen Peripheriegeräten umzugehen, stellte ich einen erheblichen Nachteil dieser Controller fest - im Internet gibt es nur sehr wenige Informationen. Wenn AVR eine Menge von allem hat, stellte sich heraus, dass es nicht so einfach war, ein Beispiel für den gleichzeitigen Betrieb von zwei ADCs im Fast Interleaved- Modus zu finden .

Arduino UNO! Wurde als Signalgenerator für den Oszilloskoptest ausgewählt. Nicht weil er gut ist oder so ... es ist nur sehr schnell.
Schreiben Sie 8 Zeilen:
 void setup() {
  pinMode(2, OUTPUT);  
  long d = 10;
  for(;;){
    PORTD = 255;
    delayMicroseconds(d);
    PORTD = 0;  
    delayMicroseconds(d);
  }
}

void loop() {
  
}


Schließen Sie die USB + 1-Verkabelung an (damit der 3,3-Volt-STM32 nicht an einem 5-Volt-Signal stirbt, das Signal wird über einen 2-kΩ-Widerstand eingespeist) und fertig!

Es stellte sich Folgendes heraus (unter jedem Bild befindet sich ein Foto des gleichen Signals auf dem Bildschirm eines analogen Oszilloskops): Signalperiode 0,9 μs. 1 Meter = 10 Pixel. Auf dem Oszilloskop ist 1 Teilung = 0,5 μs. Signalperiode 10 μs. 1 Meter = 5 Pixel. Auf dem Oszilloskop ist 1 Division = 2 μs. Die Oberseiten werden abgeschnitten, weil das Signal die ADC-Referenzspannung überschreitet.









Was weiter


In den Plänen:
  1. Besiege USB, um den USB-Konverter zu verlassen. <-> USART;
  2. Beenden Sie den analogen Teil so, dass der Eingangsspannungsbereich nicht 0 - 3,3 V beträgt, sondern anständiger ist.
  3. Mehrkanalmodus erstellen;
  4. Implementieren Sie die Steuerung von einem PC aus.
  5. Machen Sie ein fertiges Gerät in dem Fall.


Zusammenfassend mache ich auf zwei offenbarte Nachteile von STM32 gegenüber AVR aufmerksam:
  1. Erhöhter Verbrauch von Flash-Speicher;
  2. Komplexe Initialisierung der Peripherie, die durch Materialmangel noch verstärkt wird.


Ich weiß nicht wie, aber für eine so einfache Aufgabe waren 31 kB Flash erforderlich.
Die Schaltung der Debug-Karte (es war nicht leicht zu finden).

Der zweite Teil des Artikels.

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


All Articles