STM32
Allgemeine Infos
Der STM32 ist ein Mikrocontroller 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össen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1 EUR anzubieten.
Bisher gibt es drei STM32-Familien, wobei sich die Größte (STM32F) in weitere Unterfamilien (Linien) aufteilt:
- STM32F
- Connectivity line
- Performance line
- USB Access line
- Access Line
- Value line (noch nicht so ganz verfügbar)
- STM32T (Touch)
- STM32W (RF-MCU)
Features
- Cortex-M3 Kern
- 16KB ... 1MB Flash-ROM und bis zu 96KB SRAM
- Gehäuse 36 ... 144 Pins als QFN, LQFP und BGA
- Derzeit sind über 110 STM32 Derivate/Varianten verfügbar
- Derzeit bis 72MHz, Modelle bis 120MHz (mit 0 Wait-States) sind angekündigt
- Externes Businterface
- Spannungsbereich 2,0 ... 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
- Externer Quarz
- Real Time Clock mit eigenem Quarz und separater Stromversorgung
- Bis zu 16 Timer, je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer
- 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
- Bis zu 2x I²C
- Bis zu 5x USART mit LIN, IrDA und Modem Control
- Bis zu 3x SPI
- Bis zu 2x I²S
- Bis zu 2x CAN
- USB 2.0 Full Speed / OTG
- 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".
FW-Lib
ST bietet eine umfangreiche Firmwarebibliothek, eine einzige Bibliothek für alle STM32 Derivate. Das ist der große Vorteil von ST. 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.
Die FW-Lib kann ebenfalls von der STM32 Seite kostenlos geladen werden:
- Firmware "STM32F10x_StdPeriph_Lib"
In dem Archiv ist die FW-LIB, zu jeder Peripherie gibt es bis zu 12 Demos und eine Beschreibung als CHM Datei "stm32f10x_stdperiph_lib_um.chm"
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 Standard (www.onARM.com) wurden die Headerfiles standardisiert, der Zugriff auf die Register erfolgt per Peripheral->Register. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, als auch 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 non-invasive 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 einen 10 Poligen Debug-Stecker entworfen, der alle Varianten sowie einen UART Anschluss enthält und die Pins optimal angeordnet sind:
Die Funktionen:
- JTAG
- SWD
- Debug-UART-Anschluss (verbunden mit einem freien UART vom STM32) (alternativ ein MAX232 Chip dazwischen schalten)
- Weniger Platzbedarf auf der Platine (Standard-JTAG 20 Polig)
- Über 4-Poligen Würfel kann der UART benutzt werden (Pin 7/8/9/10)
- Es kann ein Jumper gesteckt werden für eine Option (Pin 7/8) ohne dass es sich mit dem RS232 Chip beißt (sofern er eingebaut wurde)
- Über einen 5-Poligen einreihigen Stecker kann SWD verwendet werden (Pin 1/3/5/7/9)
- den ganzen Stecker braucht es nur, wenn man den herkömlichen JTAG nutzen möchte.
- Kurzschlussschutz, da GND und +3V3 nicht gegenüber liegen
In all meinen Projekten verwende ich nur noch diese Anordnung, denn sie ist einfach praktisch. Alles drauf und die Pins sind perfekt angeordnet für jede Art der Anwendung.
In diesem Beispiel ist der UART 1 benutzt mit den Pins PA9/PA10. Wenn die Boot-Pins auf einen separaten Jumper-Block gelegt werden, so könnte auch mit der ST Software ein Flash Update durchgeführt werden.
Hier die Erklärung warum es die BOOT-Pins nicht auf dem JTAG-Stecker benötigt. Ich habe mir einen eigenen Bootloader geschrieben, der kommt ohne das Interne Boot-ROM (und ohne die BOOT-Pins) aus. Ich habe den in die ersten 8KB Flash programmiert.
- Das PC-Programm senden über den UART den Befehl "GoTo Bootloader", damit wird mein Bootloader angesprungen.
- Dann sendet das PC Programm die Update-Daten.
- Wenn fertig, dann geht es zurück in die Applikation.
- Der Bootloader ist immer beim Einschalten des Boards aktiv. Sobald eine Tastenkombination gedrückt wird, bleibt er "hängen" und irgend welche LEDs blinken. Also wenn das Flash "Zerschossen" sein sollte kann man mit einem Restart/Tasten den Bootloader aktivieren und erneut den Update ausführen.
- Der ST eigene Bootloader hat mir nicht gefallen, weil da keine LED's Blinken und dem User sagen, "Hallo ich lebe und bin im Bootloader".
- Wenn die Tasten beim Einschalten nicht gedrückt werden, dann springt der Bootloader in die Applikation
- Der Bootloader kann jeden belibigen UART nutzen.
STM32 Programmiertool
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 Sprungleiste 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:
- Nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz (120 MHz Versionen sind von ST 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.
- Alle LPC1xxx haben 32 Bit Timer.
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.
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:
- Eclipse
- Yagarto Tools
- Codesourcery Light
- OpenOCD
- Eclipse Plugin "GDB Hardware Debugging"
Folgende Umgebungen sind als Demoversion (32k Codesize) verfügbar, idR sind dutzende von Examples dabei:
- Keil µVision
- IAR
- Raisonance Ride7
- Atollic (Lite Version ohne Code-Limit)
Programmieradapter
- J-Link / J-Trace Cortex-M3, als NonComercial J-Link für ca. 60,- zu haben, läuft in µVision, IAR, gdb
- Olimex ARM-USB-OCD (ca. 60.-)
- Keil ULINK2, ULINK pro
- ST-Link
- Raisonance RLink
- Amontec
- H-JTAG (Personal Edition ca 60,-)
Programmieradapter Open-Source
Installation für STM32
- Eclipse "Galileo" installation:
http://www.eclipse.org/ >> Downloads >> "Eclipse IDE for C/C++ Developers (79 MB)" http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/galileo/SR1/eclipse-cpp-galileo-SR1-win32.zip Entpacken der Datei eclipse-cpp-galileo-SR1-win32.zip nach "C:\WinARM\" (Ordner neu erstellen)
- Yagarto Tools:
http://www.yagarto.de/ >> "Download (for Windows)" >> "YAGARTO Tools" http://www.yagarto.de/download/yagarto/yagarto-tools-20091223-setup.exe Installieren, Auswahl Verzeichnis "C:\WinARM\yagarto-tools"
- CodeSourcery:
http://www.codesourcery.com/ >> Products>Sourcery G++>Editions>Lite >> Try Now http://www.codesourcery.com/downloads/public/public/gnu_toolchain/arm-none-eabi/arm-2009q3-68-arm-none-eabi.exe Installieren, Auswahl Verzeichnis "C:\WinARM\CodeSourcery"
- OpenOCD:
Kompillierte Version für Windows: http://www.freddiechopin.info/ >> Download >> Software >> OpenOCD installieren nach "C:\WinARM\OpenOCD_0_4_0" ist auch auf der Seite Yagarto.de beschrieben. PS: Sollte der Olimex ARM-USB-OCD verwendet werden, dann darf nicht der Treiber von Olimex verwendet werden, sondern der vom OpenOCD Download. Siehe hier.
- ST Firmware:
http://www.st.com >> Auswahl CPU STM32F103xxx >> "Firmware" "STM32F10x_StdPeriph_Lib" http://www.st.com/mcu/devicedocs-STM32F103RC-110.html Das ZIP "stm32f10x_stdperiph_lib.zip" Entpacken nach "C:\WinARM\examples\stm32_FW3.2.0\
- Eclipse PlugIn hinzufügen:
Help >> Install New Software... >> http://download.eclipse.org/tools/cdt/releases/galileo "Eclipse C/C++ Development Tools" + "Eclipse C/C++ GDB Hardware Debugging" installieren
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.
Demo-Projekte
- Cortex_M3_OCM3U
- Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:
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 7.3.3. Alle Infos von RM0008 7.3.x sind interssant
- CAN und USB sind nur bei der "◦Connectivity-Line" gleichzeitig nutzbar. Siehe Datenblätter.
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 und dem GPIO-Port aktivieren.
- Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.
Bezugsquellen
Controller
Versandhäuser für Privatpersonen
Gewerblich liefern natürlich viele wie Farnell, Digikey usw..
Evaluation Boards
- Im Shop von Embedded Projects
- Cortex M3 bei Watterott
- Primer und Primer2 von Raisonance
- Sander Electronic
- Artikel im Wiki, ARM mit USB und 4MB Speicher
- Futurlec Evalboard
- Cortex M3 Artikel im Wiki
- STM32 bei Olimex

