STM32F030 eigenes breakout Board V

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.

Board in Funktion
Board in Funktion
bestückte Oberseite
bestückte Oberseite

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.

bestückte Unterseite
bestückte Unterseite

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:

Vergleich Lötkolben Chip (baugleicher STM8S103)

 

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.