STM32

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

STM32 ist ein Mikrocontroller-Familie von ST mit einer 32-Bit ARM Cortex-M3 CPU. Diese Architektur ist speziell für den Einsatz in Microcontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1 € anzubieten.

Blockdiagramm STM32F103xC/D/E

STM32-Familien

Bisher gibt es drei STM32-Familien, wobei sich die Größte (STM32F) in weitere Unterfamilien (Linien) aufteilt:

  • STM32F1
    • Connectivity line
    • Performance line
    • USB Access line
    • Access Line
    • Value line (teilweise verfügbar)
  • STM32F2
    • Wie die STM32F1 Serie, jedoch 120MHz, Camera-Interface, 32-Bit Timer, ...
  • STM32L (LowPower) (auf ST-Webseite gelistet, noch in Entwicklung)
    • mit LCD Treiber
  • STM32T (Touch)
  • STM32W (RF-MCU)
  • STM32F4 (CM4)
    • ARM® Cortex™-M4-based STM32 F4
    • DSP instructions and the floating point unit
    • LQFP64, LQFP100, LQFP144, LQFP176 and UFBGA176 packages

Hier eine Übersicht zum auswählen eines STM32Fxxx

Features

  • Cortex-M3 Kern
  • 16KB ... 1MB Flash-ROM und bis zu 128KB SRAM und bis zu 4KB EEPROM (STM32L)
  • Gehäuse 36 ... 144 Pins als QFN, LQFP und BGA
  • Derzeit sind über 130 STM32 Derivate/Varianten verfügbar
  • Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168 MHz beim STM32F4xx, wobei eine spezielle prefetch-hardware bis 120/168 MHz eine Geschwindigkeit erzielen soll, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet.
  • Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)
  • LCD Treiber für 8x40 Punkte (nicht beim STM32F2xx)
  • Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig
  • Temperaturbereich bis 125 °C
  • Bis zu 112 IOs, viele davon 5V-tolerant
  • Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2xx)
  • Externer Quarz
  • Real Time Clock mit eigenem Quarz und separater Stromversorgung
  • Bis zu 14 Timer, je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G)
  • Systick Counter
  • Bis zu 3 12-Bit AD-Wandler mit insgesamt 21 AD-Eingängen, integrierter Temperatursensor
  • Bis zu 2 12-Bit DA-Wandler
  • Bis zu 2 DMA Controller mit bis zu 12 Kanälen (16 beim STM32F2xx)
  • Bis zu 2x I²C
  • Bis zu 5x USART mit LIN, IrDA und Modem Control (6 beim STM32F2xx)
  • Bis zu 3x SPI
  • Bis zu 2x I²S
  • Bis zu 2x CAN
  • RNG - Random Number Genrator (STM32F2xx)
  • Cryptographic Processor (CRYP) (STM32F2xx)
  • Hash Processor (HASH) (STM32F2xx)
  • Kamera-Interface (DCMI) (STM32F2xx)
  • USB 2.0 Full Speed / OTG
  • USB 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2xx)
  • SDIO Interface (z.B. SD-Card Reader)
  • Ethernet
  • Watchdog mit Window-Mode
  • Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich Strom sparen lässt
  • JTAG und SWD (Serial Wire Debug) Interface
  • Bis zu 6 Hardware-Breakpoints für Debuggen
  • und vieles mehr . . .

Struktur der Dokumentation:

Als Beispiel der Dokumentation soll stellvertretend der STM32F103RC genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.

Diese Dokumente von ST beschreiben den Controller:

Im Datasheet sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben. In der Referenz ist der gesamte Controller mit Peripheriemodulen im Detail beschrieben, gültig für alle STM32 Controller. Details zum Prozessorkern selbst und den nicht STM32-spezifischen mit dem Cortex-M3 Core assoziierten Modulen wie dem Interrupt-Controller und dem Systick-Timer findet man jedoch nicht dort, sondern im Cortex-M3 Manual. Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich die Flash Programming Reference für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates. Hinzu kommen optionale Dokumente von ARM, die den Cortex-M3 Kern beschreiben. Hier gibt es den Opcode wenn man ihn in Assembler programmieren möchte. Zusätzlich sollten auch die Errata Sheets beachtet werden. Empfohlen sei auch die Appnote "STM32F10xxx hardware development: getting started".

‎STM32F10x Standard Peripherals Library

ST bietet eine umfangreiche Firmwarebibliothek, eine einzige Bibliothek für alle STM32 Derivate. Das ist der große Vorteil von ST (gibt es beispielsweise auf den Cortex-M3 Controllern von TI auch, ist teilweise in einem separaten ROM untergebracht). Einmal programmieren und in allen STM32 verwendbar. Alle Funktionen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherieregister kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.A. Referenz und diverse Appnotes vermitteln.

Details siehe: ‎STM32F10x Standard Peripherals Library.

Mit libopenstm32 ist derzeit auch eine Open-Source Alternative (GPL, Version 3 oder höher) zur ST Library in Entwicklung.

CMSIS

Parallel zur Firmware-Library gibt es für die "Selbermacher" die CMSIS, die einen Teil der HW und den Core Support abdeckt. Im Rahmen des CMSIS-Standards (www.onARM.com) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per Peripheral->Register. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert.

Die CMSIS ist im Download der FW-Lib enthalten.

Debug-Interface

Als Debug Interface stehen zwei Varianten zur Auswahl:

  • JTAG
  • SWD (Serial Wire Debug)

Für JTAG sind 6 Steuerleitungen nötig, für SWD 2 (zzgl GND/3,3V). Die SWD Schnittstelle verfügt außerdem über eine weitere Leitung, SWO. Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie "printf-ähnlich" Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.

Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.

Standard-JTAG Steckerbelegungen: http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm

Der 10polige JTAG-Stecker von mmvisual

mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:

Ich habe diesen Part in den Artikel JTAG verschoben. Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. Siehe hier.

STM32 RS232 Programmiertool

Auch ohne JTAG lässt sich ein STM32 über RS232 programmieren. 3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.
RESET=RTS (L-aktiv)
BOOT0=DTR (H-aktiv)
BOOT1=LOW

Details sind hier im Forum: STM32 Programmiertool

Vorteile

Vorteile gegenüber ARM7:

  • Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7). Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im Insider's Guide unter 2.4.5 / Seite 20.
  • Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt
  • Weniger Pins für Debugging benötigt durch SWD
  • Mehr Hardware Breakpoints machen debuggen einfacher
  • Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt

Vorteile gegenüber LPC1700 und LPC1300:

  • Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen
  • FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.
  • Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300
  • Flexiblere Varianten der Peripherie >> bei weniger einen deutlichen Preisvorteil
  • ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!

Nachteil gegenüber LPC1700:

  • STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz) (Aber NXP hat schon 150MHz angekündigt)
  • Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART accelerators.
  • Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx (2 Stück)
  • I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden.

Vorteile gegenüber anderen "Kleinen" wie z.B. PIC, Atmel usw.

  • nahezu gleicher Preis bei Hobby Anwendungen
  • 32 Bit ohne Umwege in Assembler rechenbar
  • bessere Peripherie
  • ... und weitere 1000 Punkte ...

Nachteil für Hobby-Anwender

  • Nicht direkt "Steckbrettauglich", da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstabd und nicht 0.8mm wie AVR

Programmierung

Als Programmieroberfläche kann eine kostenlose Struktur verwendet werden. Es ist für den Einsteiger schwierig herauszufinden welche Open-Source Programme man braucht damit es funktioniert, daher hier eine Zusammenstellung:

Sehr nützlich für Linux-Anwender auch diese Seite: STM32/ARM Cortex-M3 HOWTO: Development under Ubuntu.

Folgende kommerzielle Umgebungen sind verfügbar:

  • Keil µVision (Demo max. 32KB Code): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden.
  • IAR (Demo max. 32KB Code)
  • Raisonance Ride7 (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)
  • Atollic (Lite Version ohne Code-Limit, auf GCC basierend)
  • CoIDE (Kostenlose GCC, Eclipse basierende IDE mit einem Code-Generator Tool)
  • Rowley Crossworks (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend)

Programmieradapter

Programmieradapter Open-Source

Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne daß man einen JTAG-Adapter benötigt.

Tipps für Installation mit Eclipse können in diesem Thread gelesen werden.

Installation für STM32

Hier ist der Anfang des Artikels STM32 Eclipse Installation, hier ist neueres beschrieben als hier aufgeführt. Wenn der Artikel fertig ist, dann wird dieser Teil gelöscht.

  • Eclipse "Helios" installieren mit GNU ARM Eclipse Plug-in

Eclipse IDE for C/C++ Developers[1] downloaden und installieren

Wird CodeSourcery G++ Lite verwendet, so muss die PATH Variable angepasst werden, damit das Plugin die CodeSourcery exe-Files findet[3]. Alternativ das eclipse von einem script aus starten und zuerst den PATH erweitern.

Soll das ST-LINK verwendet werden, so kann der Atollic ST-LINK GDBSERVER aus der Atollic free version genutzt werden. Mit dem gdbserver im eclipse kann damit problemlos geflasht und gedebuggt werden (JTAG und SWD). Die Startup- und Linkerscripts der Atollic free version können für ein Projekt in dieser Konstallation genutzt werden.

  • Eclipse "Galileo" installation[4]. Und das Servicepack 1[5]

Entpacken der Datei eclipse-cpp-galileo-SR1-win32.zip nach "C:\WinARM\" (Ordner neu erstellen)

  • Eclipse PlugIn[6] hinzufügen: Help → Install New Software... → "Eclipse C/C++ Development Tools" + "Eclipse C/C++ GDB Hardware Debugging" installieren
  • Yagarto Tools[7]
  • CodeSourcery: Achtung! Die Menustruktur ändert sich durchaus mal, dann suchen gehen. http://www.codesourcery.com/ → Products → Sourcery G++ → Editions>Lite Edition → ARM → Downloads. Direkter Download[8]. Installieren, Auswahl Verzeichnis "C:\WinARM\CodeSourcery"
  • OpenOCD: Kompilierte Version für Windows[9] installieren nach "C:\WinARM\OpenOCD_0_4_0" ist auch auf der Seite[10] beschrieben. PS: Sollte der Olimex ARM-USB-OCD verwendet werden, dann darf nicht der Treiber von Olimex verwendet werden, sondern der vom OpenOCD Download[11].
  • ST Firmware: http://www.st.com → Auswahl CPU STM32F103xxx → "Firmware" "STM32F10x_StdPeriph_Lib"[12]. Das ZIP "stm32f10x_stdperiph_lib.zip" Entpacken nach "C:\WinARM\examples\stm32_FW3.4.0\

Installation für STM32 auf einem zweiten Rechner

  • Kopieren des Verzeichnisses C:\WinARM\ (Zuvor wurden aus diesem Grund alle Setup-Pakete nach C:\WinARM\... installiert)
  • Die PATH-Variable in der Systemsteuerung mit den C:\WinARM\.... Verzeichnissen nachführen
  • Fertig.

Installation für STM32 mit AtollicTrueStudio (+Demo)

Demo-Projekte

Errata, Tipps und Tricks

  • AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.
  • CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 8.3.3. Alle Infos von RM0008 8.3.x sind interssant
  • CAN und USB sind nur bei der "◦Connectivity-Line" gleichzeitig nutzbar. Siehe Datenblätter.
  • Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.
  • Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).
  • Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt
  • Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde

Tipps für Umsteiger von Atmel/PIC/8051

  • Prozessortakt hat unterschiedliche Taktquellen und eine PLL.
  • Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.
  • Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und dem GPIO-Port aktivieren.
  • Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.
  • Forum zu Interrupts vs. Events

Bezugsquellen

Controller

Versandhäuser für Privatpersonen

Gewerblich liefern natürlich viele wie Farnell, Digikey usw..

Evaluation Boards

Weblinks, Foren, Communities

  1. http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/heliosr
  2. http://sourceforge.net/projects/gnuarmeclipse/
  3. für Discovery notwendig
  4. [1] → Downloads → "Eclipse IDE for C/C++ Developers (79 MB)
  5. Eclipse SR1
  6. http://download.eclipse.org/tools/cdt/releases/galileo
  7. [2] "Download (for Windows)" → "YAGARTO Tools" http://www.yagarto.de/download/yagarto/yagarto-tools-20091223-setup.exe Installieren, Auswahl Verzeichnis "C:\WinARM\yagarto-tools"
  8. [3]
  9. [4] → Download → Software → OpenOCD
  10. Yagarto.de
  11. [5]
  12. http://www.st.com/mcu/devicedocs-STM32F103RC-110.html