MP32F103-Stick: Ein Mini-Mikrocontroller-Board mit USB und bis zu 4MB Datenspeicher
von Mario Pieschel
Einleitung
Inspiriert vom verstärkten Interesse an Cortex-M3-Mikrocontrollern und nach Einarbeitung in diese Materie veröffentliche ich hier ein kleines Board mit dem Mikrocontroller STM32F103CBT6 von STMicroelectronics (www.st.com). Dieser Chip hat 128KB Flash, 20KB RAM, SPI, I2C, USART, USB, CAN, ADC und läuft bis 72 MHz. Das Board wird genauso aufgebaut sein wie mein MP2103-Stick:
Also sehr minimalistisch - alles was nötig ist um den Mikrocontroller zu betreiben, die Programmierung ohne Programmiergerät gewährleisten und möglichst viele Pins nach außen führen. Den MP32F103 an eine USB-Schnittstelle eines PCs anschließen und loslegen. Viele Mikrocontroller-Anwendungen sind als Stand-Alone-Anwendungen konzipiert – der MP32F103-Stick nicht!!! Er soll mehr als Interface-Baustein für den PC gesehen werden. Anwendungsbereiche sehe ich überall dort, wo irgendetwas mit dem PC elektrisch verbunden werden soll, was sich sonst nicht mit diesem über die herkömmlichen PC-Schnittstellen verbinden lässt. Überall wo der PC steuern, regeln und/oder messen soll, könnte der MP32F103-Stick zum Einsatz kommen. Die Daten feuern vom und zum PC mit einer Datenübertragungsgeschwindigkeit von fast bis zu 1 Megabit pro Sekunde! Für eventuelle Kalibrierdaten oder andere individuelle Daten für das zu betreibende Gerät steht ein bis zu 4 Megabyte großer Datenspeicher zur Verfügung. Für den MP32F103-Stick wird kein spezielles Programmiergerät benötigt – er wird einfach an einen USB-Anschluss eines PCs angeschlossen und das war’s. An ein bestimmtes Betriebssystem des Ziel-PCs ist man ebenfalls nicht gebunden, da für den eingesetzten USB-Baustein (FT232) Treiber für alle gängigen Betriebssysteme vom Hersteller FTDI-Chip angeboten werden.
Funktionsmodell
LINK: Datasheet vom STM32F103CBT6
LINK: st.com-Page vom STM32F103CBT6
LINK: Datasheet und Anwendung vom AT45DBxxx
Schaltplan
Herzstück des Boards ist der Mikrocontroller STM32F103CBT6 (IC1) mit 128kB Flash und 20 kB RAM. Die Anschlüsse von Port A und Port B sind mit den Steckleisten CON1 und CON2 zur Außenwelt verbunden, mit Ausnahme von PA9 und PA10, welche zur Kommunikation mit einem Hostrechner an das USB-IC FT232RL (IC3) gehen. Der Mikrocontroller benötigt drei Versorgungsspannungen mit je 3.3V (VDD, VDDA und VBAT). Der digitale Teil wird über VDD versorgt, der analoge über VDDA und die interne Uhr über VBAT. C1 bis C7 sind Abblockkondensatoren, L1 fungiert als Eingangsfilter gegen Störungen der analogen Komponenten und D1 dient der Entkopplung einer an den Stecker „BAT“ angeschlossene Backupbatterie für die interne Uhr (1 an +3,3V, 2 an 0V). Die beiden Quarze Q1 (32kHz) und Q2 (8MHz) werden für die externe Taktversorgung des Mikrocontrollers benötigt.
Der Mikrocontroller kann in drei Boot-Modi gestartet werden, welche mit S1 eingestellt werden können.
1=ON (2: ON oder OFF) -> der Mikrocontroller startet aus dem Flash (Normalfall).
1=OFF und 2=ON -> der interne Bootloader wird gestartet (zum downloaden der Firmware).
1=OFF und 2=OFF -> der Mikrocontroller startet aus dem RAM (für Tests).
R1 und R2 sind Pullup-Widerstände, R3 und R4 begrenzen den Stom im Fehlerfall und links neben S1 ist eine optionale Brücke, für den Fall, dass booten vom Flash unabhängig von S1 erwünscht wird (z. B. Auslieferungszustand).
S1 ist der RESET-Taster und D2, R5, C12 lösen einen RESET-Impuls nach Einschalten der Betriebsspannung aus. LED1 ist für universelle Zwecke an Port-Pin PC13 mit R6 als Strombegrenzung angeschlossen.
Das Board verfügt über einen Datenspeicher von bis zu 4MB (Mega Byte) Flash, IC2 AT45xxx von Atmel. Dieser ist per SPI mit dem Mikrocontroller verbunden. C13 ist ein Abblockkondensator, R8 und R9 Pullup-Widerstände, und R2! Nur bestücken, wenn das Flash schreibgeschützt seine soll (!!! im Normalfall nicht bestücken !!!).
Die Kommunikation mit einem Hostrechner erfolgt per seriellem Port UART1 (PA9 und PA10) über den USB-zu-seriell-Umsetzer FT232RL (IC3). Dort gehen die beiden Signale UART1_RX und UART1_TX an Pin 1 und 5. Die beiden Datenleitungen USBDM (Pin 16) und USBDP (Pin 15) sind direkt mit der USB-B-Buchse (Pin 2 und 3) verbunden. Es kann wahlweise eine Mini-USB-B-Buchse oder eine normale USB-B-Buchse eingesetzt werden. VDD5.0 (5 Volt) kommt von der USB-B-Buchse über L2 (Entstörung) und geht an Pin 20 von IC3. C14 bis C18 sind Abblockkondensatoren für die Versorgungsspannungen. LED1 und LED2 signalisieren den seriellen Datentransfer.
Der Mikrocontroller STM32F103CBT6 (IC1) benötigt eine Versorgungsspannung von 3,3V, welche von IC4 (TPS62203) erzeugt wird. L3 wird für den internen Schaltregler benötig und C19 bis C22 sind Abblockkondensatoren. R1! (Lötbrücke) erst bestücken wenn die elektrische Prüfung erfolgt ist.
Layout
Stueckliste:
Eagle-Files
Die Leiterplatte sollte von einem Leiterplattenhersteller gefertigt werden. Ich habe die Erfahrung gemacht, dass Anbieter mit Preis-Berechnungen auf Quadratdezimeter-Basis egal mit welchem Inhalt die günstigsten sind. Wichtig ist, dass die Leiterplatten mit Durchkontaktierungen gefertigt werden. Aus Erfahrung rate ich die Leiterplatten mit Lötstopplack fertigen zu lassen. Einfach die Datei „MP32F103_Stick_V1.3.brd“ dem Hersteller schicken.
Bestückung der Leiterplatte
Elektronische Bauteile sind durch elektrostatische Ladungen gefährdet. Deshalb ab jetzt mit ESD-Armband und ESD-Unterlage arbeiten!!! Beim Arbeiten mit den kleinen Bauteilen hilft auf jeden Fall ein Briefmarken-Lupen-Headset oder ein Stereo-Mikroskop mit Verstärkungsfaktor 10 (in der Bucht ca. 200,- €). Zuerst die beiden großen ICs, IC1 (STM32F103CBT6) und IC3 (FT232RL), bestücken. Da es sich um ziemlich kleine und mit hoher Pin-Anzahl versehene elektronische Bauteile handelt, empfehle ich folgende Vorgehensweise: Die Lötpads auf der Leiterplatte für das entsprechende IC reichlich mit dem Lötkolben und Lötzinn (<= 0,5 mm Durchmesser) verzinnen. Die Lötpads sollten glänzen und um ca. 0,1 bis 0,2 mm erhaben sein. Nun die Leiterplatte mit handelsüblichem Brennspiritus reinigen. Jetzt das IC mit ein wenig Klebstoff auf der Leiterplatte fixieren. Ich nehme dafür handelsüblichen Klebestift (Pr…-Stift). Eine kleine Messerspitze voll vom Klebestift auf die Mitte der IC-Position auf die Leiterplatte auftragen, das IC auf die Leiterplatte aufsetzen und positionieren. Es darf auf keinen Fall Klebstoff bis zu den Lötanschlüssen des ICs quellen. Erst mit dem Festlöten beginnen, wenn das IC korrekt auf den Lötpads sitzt und etwas angetrocknet ist. Ab jetzt wird nicht mehr mit Lötzinn gearbeitet – dieses am besten so weit wie möglich weglegen. Die Kapillarwirkung der IC-Anschlüsse ist viel zu groß, diese würden eine weitere Zugabe von Lötzinn sofort dieses zwischen die Lötpins ziehen und damit für reichlich Kurzschlüsse sorgen. Ab jetzt wird nur noch mit Flussmittel gearbeitet, entweder handelsübliches Flux oder Kolofonium (in Brennspiritus aufgelöst) nehmen. Ist das IC korrekt positioniert und fixiert mit dem Festlöten beginnen. Jeden einzelnen IC-Anschluss mit dem heißen Lötkolben und wenig Druck in Richtung Leiterplatte anlöten. Wichtig ist wirklich, sich damit Zeit zu nehem und darauf zu achten, dass das Lötzinn richtig fließt. Sollte bei einem der hier beschriebenen Arbeitsschritte etwas schief gehen, unbedingt die Arbeiten abbrechen, alles reinigen und von Anfang beginnen. Sind IC3 und IC4 erfolgreich auf die Leiterplatte gelötet können alle anderen Bauteile bestückt und gelötet werden. Wichtig: „R1!“ und „R2!“ nicht bestücken!!! Die voll bestückte Leiterplatte gründlich mit Brennspiritus und einem kleinen Pinsel reinigen. Die Leiterplatte wegen der Buchsen und Schalter/Taster nicht im Reinigungsmittel baden. Das Reinigungsmittel nicht abtrocknen lassen sondern mit Druckluft entfernen. Es werden so unschöne Flecken vermieden. Sollte der Stick in rauer Umgebung betrieben werden ist das Lackieren mit farblosem Leiterplattenlack sinnvoll.
Optische Prüfung
Jetzt sollte eine ausgiebige Fehlersuche auf Kurzschlüsse, kalte Lötstellen, Verpolung von Bauteilen und richtiger Bestückung erfolgen. Entweder mit einer großen Lupe oder einem Stereo-Mikroskop mit Vergrößerungsfaktor 10.
Alle weiteren Arbeitsschritt erst nach vollständiger Trocknung des Stick durchführen.
Elektrische Inbetriebnahme
Für erste Tests ist es am Besten den Stick mit einem Strom geregelten Netzteil über die USB-Buchse (Pin1 +5V, Pin4 Masse) zu verbinden; den Strom auf 50 mA begrenzen und 5 Volt einstellen. Nach Einschalten sollte ein Strom von ca. 10 bis 20 mA fließen und die anliegende Spannung weiterhin 5 Volt betragen. Bricht die Spannung zusammen auf keinen Fall die Strombegrenzung erhöhen sondern auf Kurzschlusssuche gehen. Fließt zu wenig Strom oder keiner kalte Lötstellen suchen. Ist kein Netzteil vorhanden, einfach drei kleine billige Knopfzellen á 1,5 Volt in Reihe schalten und den Strom mit einem Multimeter messen. Stimmt der Strom und liegen die 5 Volt an, die Spannungen an den Testpunkten TP1 bis TP4 überprüfen. Bezugspunkt ist TPM (Masse). Folgende Spannungen sollten gemessen werden:
TP1 = 3,3 Volt
TP2 = 5 Volt (oder 4,5V bei der Variante mit den drei 1,5V Knopfzellen)
TP3 = 3,3 Volt
TP4 = 3,3 Volt
Wenn diese Spannungen OK sind kann der Stick an den PC/Notebook über ein USB-Kabel angeschlossen werden. Nun sollte das Betriebssystem (Windows, für WinCE, Linux und Mac weiß ich es nicht) melden, dass neue Hardware erkannt wurde. Jetzt kann der Treiber für den FT232RL installiert werden. Den Treiber (Virtual COM Port, VCP) von der Herstellerseite www.ftdichip.com downloaden – die Vorgehensweise ist dort ausführlich beschrieben. Nach erfolgreicher Installation des Treibers sollte im Hardwaremanager ein neuer COMx-Port zu sehen sein. Die COM-Nummer sollte man sich merken. Windows registriert für jede USB-Schnittstelle eine andere COM-Port-Nummer, was zu Verwirrung beim Umstecken führen kann. Damit sind aber auch mehrere Sticks anschließbar.
LINK: die Treiber für den FT232RL
LINK: Driver Installation Guides
Sind alle Tests und Arbeitsschritte bis hier OK kann „R1!“ (Lötbrücke) eingelötet werden um den Mikrocontroller mit Strom zu versorgen. Es sollte ein Strom zwischen 20 und 40 mA fließen, wenn nicht: Fehlersuche nach Kurzschlüssen, kalten Lötstellen, verpolten Bauteilen und falscher Bestückung.
Firmware Upload
Zum Hochladen der Firmware benötigt man das Programm "mcuisp_stm". Das Download-Programm von st.com geht natürlich auch.
Jetzt am Besten erst einmal testen, ob sich der Mikrocontroller meldet.
Schalter S1 -> 1=OFF und 2=ON und RESET-Taster drücken
das Programm "mcuisp_stm" starten und den Button "Read Chip Info(R)" klicken.
Für Download der Firmware den Button "Start ISP(P)" klicken.
Programm starten mit Schalter S1 -> 1=ON und 2=egal und RESET-Taster drücken.
Compiler und IDE (neu)
Die Integrierte Entwicklungsumgebung von Raisonance, Ride7 und RKit-ARM, umfasst einen voll funktionsfähigen und Code unbegrenzten GNU C/C++-Compiler und das Raisonance Integrated Development Environment (RIDE). Über eine grafische Benutzeroberfläche wird die Bedienung der Softwareentwicklungs-Tools (Compiler, Assembler, Linker und Simulator) ermöglicht. Für die Softwareentwicklung und Kompilierung vom C-Source-Code bis hin zum endgültigen HEX-File besteht keine Codegrößenbegrenzung, lediglich das Debugging ist bis 32kByte begrenzt. Das ist aber hier nicht von Belang, da mit dem Bootloader des Mikrocontrollers geflasht wird.
Auf der Page von Raisonance.com anmelden und die Files "RKit-ARM" (GCC) und "Ride7" (IDE) downloaden und installieren. Zuerst RKit-ARM dann Ride7. Der Umgang mit diesen Programmen ist super einfach - keine Rumquälerei mit Makefiles und solcherlei Teufelszeug - alles ist bereits Mundgerecht von Raisonance zugeschneidert. Sehr empfehlenswert!
LINK: Compiler und IDE Ride7 von Raisonance.com
LINK: Getting Started with ARM & Ride7 User manual
Und wie einfach alles ist zeigt dieses Beipiel-Projekt:
LINK: Hello-World-Projekt mit Ride7
Da in Ride7 kein serielles Upload-Tool für den MP32F103-Stick integriert ist, kann zum Hochladen der Firmware (Hello_World.hex) das Programm "mcuisp_stm" genommen werden.
Da ich diesen Artikel parallel zur Entwicklung schreibe kann es etwas dauern.