Gestern habe ich die neuen Platinen für den STM32F030-breakout erhalten. An der Schaltung wurde nichts geändert, lediglich das Layout wurde verbessert.
Einen kleinen Schönheitsfehler im Bestückungsdruck gibt es aber auch hier: C3 muss ein 100nF Kondensator sein, C1 ein 4,7µ Kondensator, denn der Stützkondensator sollte näher am Pin sein. Im Schaltplan ist es genau umgekehrt gezeichnet.
Nachdem ich einen ganzen Vormittag mit der Fehlersuche aufgrund eigener Dummheit verbracht habe, (der Chip sitzt auf der Unterseite, ist also bezüglich der Anschlüsse, von oben gesehen, gespiegelt – ein Nachteil meines Layouts, aber verschmerzbar, wenn man die Unterseite als Oberseite betrachtet und die DIL-Pins entsprechend einlötet) geht das Board nunmehr so wie geplant.
Beim fertigen Board fällt auf, dass noch viel Platz ist. Das soll zwar auch zum Teil so sein, denn es wird ja mit Hand bestückt. Aber hier ist noch Optimierungspotential und doch Platz für einen RESET-Taster und einen ST-Link-Stecker. Die Lötbrücken auf die Chip-Seite umlegen, der Quarz geht sowieso auf beiden Seiten einzulöten, die zusätzlichen Teile ebenfalls auf die Chipseite und dann oben und unten „tauschen“, so sollte es besser gehen.
Der fehlende Lack auf einem Leiterzug der Unterseite ist mein Fehler, bin mit dem Lötkolben abgerutscht – Weller WECP-20, siehe Foto als Größenvergleich:
Es wird Zeit, sich eine „ernsthafte“ Anwendung zu überlegen. Hier zunächst das mit Coocox erstellte Test-Programm:
#include "stm32f0xx.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_rcc.h"
#include <stdio.h>
void init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
// LED: Configure PA0 and PA1 in output pushpull mode
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Delay(__IO uint32_t nCount)
{
while(nCount--)
{
}
}
int main (void)
{
init();
while (1)
{
GPIOA->BSRR = GPIO_Pin_1 | GPIO_Pin_0; // Set PA! HIGH = LED off
Delay(500000L);
GPIOA->BRR = GPIO_Pin_0; // Set PA0 to GND (red LED on)
Delay(500000L);
GPIOA->BRR = GPIO_Pin_1; // Set PA1 to GND (green LED on)
Delay(500000L);
}
}
Ach ja, mit Quarz läuft dasselbe blinky-Programm deutlich schneller als auf dem TSSOP28-Adapter-Board. (ca. 3..4 mal schneller?) Schaltet der Chip die Taktquellen selbstständig um (angeblich startet er immer mit HSI und man muss mittels Programm umschalten) oder ist das Umschalten im Startcode von Coocox zu suchen? Ok, hab also noch zu tun …
EDIT: Hier:
ist ein Video des Testprogrammes zu sehen. Die Lösung des Geschwindigkeitsproblems liegt wie vermutet im startup-Code von Coocox, der bei externem Takt die PLL einschaltet.
Der fehlende Bestückungsaufdruck ist keine Absicht. 😐 Da hab ich wohl beim Gerbern geschlafen.
Wie trenne ich jetzt die Einzelnutzen auf? Das Platinenmaterial ist FR4, der Staub soll gesundheitsgefährlich sein. Sägen mit der Dekupiersäge fällt aus, das wird krumm und schief, vom Sägestaub ganz zu schweigen. Sägen per Hand mit der Metallsäge dauert lange, ist aufwendig und staubt. Schneiden mit dem Seitenschneider (in Ermangelung einer Blechschere, die öfter empfohlen wird) erzeugt unvorhersehbare Brüche und Risse in der Platine.
Die Lösung, bis mir etwas besseres unterkommt: Ritzen auf beiden Seiten mit dem Teppichmesser mit dem (Metall-)Meßschieber als Anschlag und dann über die Tischkante einfach brechen. Das funktioniert erstaunlich gut. Danke an das Internet, wo ich auf mehreren Seiten diesen Tipp fand.
Heute ist die Bestellung an ITEAD herausgegangen bezüglich des selbstentwickelten Boards.
Technisch ist es nicht optimal und nicht sehr gut, aber zumindest eine funktionierende Variante. Ich hatte keine Lust mehr, das noch zu verbessern. 😉 Wenn sich im Umgang damit weitere Anforderungen ergeben, werde ich das Design ohnehin noch mal ändern. Außerdem wollte ich unbedingt das mit dem „Nutzen-erstellen“ mal ausprobieren, es ist also ein 5 cm x 10 cm Board mit 6 Einzelstücken drauf. Jetzt bin ich gespannt auf das Ergebnis.
Meine Prämissen:
Die Platine sollte nicht größer als ein 20 poliger TSSOP-DIL-Adapter sein. (Ist sie jetzt doch aufgrund des für die Auftrennung notwendigen Platzes zwischen den einzelnen Platinen und der Umgehung der Pinreihe auf beiden Seiten mit je einem Signal sowie der links und rechts zu weit hinausgeschobenen Bauteile, siehe Layout – sicher noch optimierungsbedürftig)
VDDA sollte wahlweise vom DIL-Pin oder aus VDD kommen. Deshalb ist hierfür eine Lötbrücke vorgesehen. Die Gewinnung aus VDD ist nicht datenblattkonform, denn dieses fordert, dass VDDA vorher da ist und stets höher oder gleich VDD sein soll.
Eine weitere Lötbrücke ist gedacht für die Auswahl des Bootmodus. (boot0 high or low) Über den notwendigen Wert der Widerstände bin ich mir noch unsicher. Reicht ein „weak Pullup/Pulldown“ oder müssen sie „strong“ (= mehr Stromverbrauch) sein?
Einen separaten SWD-Stecker habe ich aus Platzgründen bewusst nicht vorgesehen, da diese Signale problemlos über die DIL-Reihe abgreifbar sind.
Auf einen RESET-Taster habe ich aus Platzgründen verzichtet. Mal sehen, ob ich das bereue. 🙂
Auf groundplanes (Eagle: Polygon) habe ich bewusst verzichtet, weil mit maximal 8 MHz keine wirklich problematischen Signale auf der Platine laufen. (obwohl ich mir gerade nicht mehr so sicher bin, ob das Weglassen klug ist)
Ich habe 1mm Platinendicke gewählt, weil so der Nutzen besser trennbar ist. (Hoffe ich zumindest)
Auf das Onlinestellen der Eagle-Dateien verzichte ich mal, da das Design noch lange nicht ausgereift ist.
Dieses Teil ist teilweise für unter 50 Cent pro Stück bei Ebay, Amazon oder Aliexpress zu erhalten. Interessant ist der Baustein vor allem deshalb, weil er im Gegensatz zu seinen größeren Brüdern in einem überschaubaren und bastlerfreundlichen Gehäuse verbaut ist. „Bastlerfreundlich“ ist allerdings ein Euphemismus für ein TSSOP20-Gehäuse, siehe Fotos: (auf den Fotos ist es ein STM8S103F3P6 im TSSOP20-Gehäuse)
Ein erster Versuch startete mit einem (zu großen) TSSOP28-Universaladapter und einem kleinen Breadboard:
Schlaumeier werden sehen, dass die Kondensatoren nicht der Empfehlung des Datenblatts entsprechen. 😉 Ich hatte aber gerade nur 22nF als steckbares Bauelement zur Hand und es funktioniert. Der Schaltplan dürfte erkennbar sein. Links oben geht es zum ST-LinkV2, daneben die Versorgungsspannung, links unten wird mit einem Widerstand 510 Ohm boot0 auf Masse gezogen. Laut Datenblatt (absolute maximum ratings: always VDDA >= VDD) darf man nicht vergessen, VDDA anzuschließen. Das habe ich im Internet schon anders gesehen. An PA0 und PA1 (direkt neben VDDA) sind jeweils eine LED mit Vorwiderstand angeschlossen. Reset hat einen internen Pullup-Widerstand.
Als software wurde mit Coocox ein einfaches blink mit delay zusammengetippt und mit dem ST-Link V2 aufgespielt. Die Schaltung lief auf Anhieb.
Nächstes Ziel wird ein eigenes breakout-Board sein.
Es gibt andere Entwürfe im Internet, die mir aber aus diversen Gründen nicht zusagen: