STM32

Aus brainelectronics Wiki
Wechseln zu: Navigation, Suche

Informationen

Allgemein

  • STM32F103C8T6 inm LQFP48 Format
  • 32-bit Cortex-M3 CPU
  • 72 MHz max CPU frequency
  • VDD von 2.0 V bis 3.6 V
  • 64 KB Flash
  • 20 KB SRAM
  • 32 GPIO mit Interrupt Fähigkeit
  • 2 12-bit ADC with 10 channels
  • On Board RTC
  • 4 Timer
  • 2 I2C
  • 3 USART
  • 2 SPI
  • USB 2.0 full-speed
  • CAN

Pinout

Die I/O Pins sind nur 3.3V tolerant sind! Blue Pill Wiki STM32Duino
Wie am Schaltplan zu erkennen, ist die LED auf 3.3V verbunden. Wird also der Pin PC13 auf LOW gelegt, so ist die LED AN. Dies ist genau entgegengesetzt zur Beschaltung bei den Arduino Boards!
Pinout Bluepill STM32F103 Bluepill STM32F103 Schaltplan

API

Standardmäßig gibt es fast alles wie bei arduino. Für genaue Details und Tricks gibt es die Wiki API Seite von STM32duino

Arduino IDE

Manuell

Für die Verwendung in der Arduino IDE, muss das Repo in den Arduino/hardware Ordner gelegt werden, sodass dieses dann Arduino/hardware/Arduino_STM32 bildet. Abschließend müssen ggf. noch ein paar Konfigurationen vorgenommen werden, für die es bereits ein fertiges Skript gibt.

   $ cd /home/jones/Arduino/
   $ mkdir hardware
   $ cd hardware
   $ git clone https://github.com/rogerclarkmelbourne/Arduino_STM32.git
   $ cd Arduino_STM32/tools/linux
   $ ./install.sh

Board Manager

Für das ganze gibt es ab der Version 1.6.x mit dem Board Manager bereits ein fertiges Ding.

In der Arduino IDE über File -> Preferences. Dort den Button neben dem Eingabe Feld für 'Additional Boards Manager URLs' anklicken. Dort die Package JSON URL in eine extra Zeile eintragen.

 http://dan.drown.org/stm32duino/package_STM32duino_index.json
 

und danach über Tools->Board->Board Manager das entsprechende für den STM32 herunterladen und installieren lassen.

Probleme

Sollte kein passender Port gefunden werden, kann möglich sein, dass die udev rules für das Gerät in /etc/udev/rules.d/45-maple.rules neu geladen werden müssen.

   $ sudo udevadm control --reload-rules

Links

STM32Duino Wiki Installation
Arduino STM32 Repo
STM32duino Package JSON

Blink Code

#define pinLED PC13

void setup() {
  Serial.begin(9600);

  pinMode(pinLED, OUTPUT);
  digitalWrite(pinLED, HIGH);  // set pin HIGH to turn off LED

  Serial.println("START");  
}

void loop() {
  digitalWrite(pinLED, LOW);
  delay(1000);
  digitalWrite(pinLED, HIGH); // end with high to turn off the LED at this stage
  delay(1000);

  Serial.println("Hello World");  
}
 

Serial Monitor Opened Code

Dieser Code erlaubt es, Daten erst auszugeben nachdem der Serial Monitor geöffnet wurde. Dies verzögert bis zu diesem Zeitpunkt aber auch die Setup Funktion!

#define pinLED PC13

void setup() {
  Serial.begin(9600);

  pinMode(pinLED, OUTPUT);

  // wait for serial monitor to be connected.
  while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS())))
  {
    digitalWrite(LEDpinLEDPIN, !digitalRead(LEDpinLEDPIN)); // Turn the LED from off to on, or on to off
    delay(100); // fast blink
  }

  digitalWrite(pinLED, HIGH);  // set pin HIGH to turn off LED

  Serial.println("START");  
}

void loop() {
  digitalWrite(pinLED, LOW);
  delay(1000);
  digitalWrite(pinLED, HIGH);
  delay(1000);

  Serial.println("Hello World");  
}
 


Watchdog Code

Wird der Watchdog innerhalb von, hier, 8 Sekunden "gefüttert", startet der Controller neu

#include <libmaple/iwdg.h>

#define iwdg_init_ms(N) iwdg_init(IWDG_PRE_256,((N)/5))

#define pinLED PC13

int snacks = 5;

void setup()
{
  Serial.begin(115200);
  delay(5000);

  pinMode(pinLED, OUTPUT);

  // init an 8 second wd timer by prescaling the ~50KHz clock and then calculating resulting ticks in 8 secs...
  //iwdg_init(IWDG_PRE_256, 1600);

  // or init an 8s wd timer a bit more obviously using a wrapper
  iwdg_init_ms(8000);

  Serial.println("hmm, that's a mean looking dog!");
}

void loop()
{
  if (snacks > 0)
  {
    // blink to show activity
    digitalWrite(pinLED, LOW);
    delay(1000);
    Serial.println("nice doggy, here's a snack");
    digitalWrite(pinLED, HIGH);
    delay(1000);

    iwdg_feed();  // same as wdt_reset() at AVR chips

    --snacks;
  }
  else
  {
    Serial.println("uh oh, I've run out of snacks...");
    digitalWrite(pinLED, LOW);  // turn the LED on (if soldered from 3.3V to LED_PIN)
    while (true);
  }
  delay(1000);
}
 

Internal Temperature + Vdd Code

// Reading Vdd and Temperature Sensor
// Pito 8/2016
// Temperature sensor at ADC16, VREFINT at ADC17
// BluePill and Maple Mini

void setup_vdd_tempr_sensor()
{
    adc_reg_map *regs = ADC1->regs;
    regs->CR2 |= ADC_CR2_TSEREFE;    // enable VREFINT and Temperature sensor
    // sample rate for VREFINT ADC channel and for Temperature sensor
    regs->SMPR1 |=  (0b111 << 18);  // sample rate temperature
    regs->SMPR1 |=  (0b111 << 21);  // sample rate vrefint
    adc_calibrate(ADC1);
}

void setup()
{
    setup_vdd_tempr_sensor();
    Serial.begin(115200);
    delay(1);
}

void loop()
{
    float tempr, vdd;
    // reading Vdd by utilising the internal 1.20V VREF
    vdd = 1.20 * 4096.0 / adc_read(ADC1, 17);
    // following 1.43 and 0.0043 parameters come from F103 datasheet - ch. 5.9.13
    // and need to be calibrated for every chip (large fab parameters variance)
    tempr = (1.43 - (vdd / 4096.0 * adc_read(ADC1, 16))) / 0.0043 + 25.0;
    Serial.print("Vdd=  ");
    Serial.print(vdd);
    Serial.println(" V");
    Serial.print("Temp= ");
    Serial.print(tempr);
    Serial.println(" C");
    delay(500);
}
 

SMT32duino Forum Pito

Programmieren

siehe Arduino STM32 Upload
Das Programmieren des STM32 Boards ist über die nachfolgenden 3 Möglichkeiten gegeben: Bootloader, STLink, USB Serial Adapter

Nach dem Verbinden per USB kann der Code erst hochgeladen werden, nachdem die Onboard LED mehrmals schnell hintereinander geblinkt hat.

Boot Pin Settings

Normaler boot (mit Benutzer Code, der auch ein zweiter Bootloader sein kann):

  • Boot0 LOW
  • Boot1 LOW

Firmware Upload per USART1 zulassen:

  • Boot0 HIGH
  • Boot1 LOW

Nicht verwendet:

  • Boot0 = LOW
  • Boot1 = HIGH

Boot vom RAM (nicht implementiert in v2.0 bootloader):

  • Boot0 HIGH
  • Boot1 HIGH


Bootloader

Mit dem zu installierenden Bootloader ist es möglich, den STM wie ein normales Arduino Board per USB Port zu programmieren, ohne Jumper zusetzen, Reset zu drücken o.ä.
Da von Haus aus kein Bootloader installiert ist, muss dieser manuell gebrannt werden. Dafür ist Boot0 auf HIGH zu setzten und ein USB to Serial Adapter zu verbinden. Zudem muss das STM32duino Bootloader Repo geladen werden und der für das Board passende Bootloader gewählt werden. Für den STM32F103C8T6 mit der LED an PC13 ist dies der generic_boot20_pc13.bin. stm32flash Beschreibung+Git

   $ cd ~/Documents/Arduino/hardware/Arduino_STM32/tools/macosx/stm32flash
   $ ./stm32flash -w ~/Downloads/STM32duino-bootloader/STM32F1/binaries/generic_boot20_pc13.bin -v -g 0x0 /dev/tty.SLAB_USBtoUART

War das Flashen erfolgreich wird folgendes ausgegeben:

stm32flash Arduino_STM32_0.9

http://github.com/rogerclarkmelbourne/arduino_stm32

Using Parser : Raw BINARY
Interface serial_posix: 57600 8E1
Version      : 0x22
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0410 (Medium-density)
- RAM        : 20KiB  (512b reserved by bootloader)
- Flash      : 128KiB (sector size: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory
Wrote and verified address 0x08001c14 (100.00%) Done.

Starting execution at address 0x08000000... done.
 

Alternativ kann auch stm32loader.py verwendet werden Python STM32Loader

Damit befindet sich nun der STM32duino bootloader auf dem Board und der Boot0 Jumper wird wieder auf LOW gesetzt, da sonst bei einem Reset der Bootloader wieder gelöscht wird.
Nun kann in der Arduino IDE die Upload Methode: STM32duino bootloader gestellt werden und der STM über den Micro USB Anschluss verbunden werden es wird kein Port ausgewählt
WICHTIG:
Der Boot0 muss ab jetzt auf LOW gesteckt sein. Jetzt kann wie von Arduino gewohnt auf Upload geklickt werden und das Programm wird hochgeladen und startet. Der Debug Output der Arduino IDE sieht dabei folgendermaßen aus:

Sketch uses 13044 bytes (19%) of program storage space. Maximum is 65536 bytes.
Global variables use 2816 bytes of dynamic memory.
dfu-util 0.8

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2014 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to dfu-util@lists.gnumonks.org

dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Opening DFU capable USB device...
ID 1eaf:0003
Run-time device DFU version 0110
Claiming USB DFU Interface...
Setting Alternate Setting #2 ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 0110
Device returned transfer size 1024
Copying data from PC to DFU device

Download	[                         ]   0%            0 bytes
Download	[=                        ]   7%         1024 bytes
Download	[===                      ]  14%         2048 bytes
Download	[=====                    ]  21%         3072 bytes
Download	[=======                  ]  29%         4096 bytes
Download	[=========                ]  36%         5120 bytes
Download	[==========               ]  43%         6144 bytes
Download	[============             ]  50%         7168 bytes
Download	[==============           ]  58%         8192 bytes
Download	[================         ]  65%         9216 bytes
Download	[==================       ]  72%        10240 bytes
Download	[====================     ]  80%        11264 bytes
Download	[=====================    ]  87%        12288 bytes
Download	[=======================  ]  94%        13044 bytes
Download	[=========================] 100%        13044 bytes
Download done.
state(8) = dfuMANIFEST-WAIT-RESET, status(0) = No error condition is present
Done!
Resetting USB to switch back to runtime mode
 

Ab jetzt erscheint unter Port /dev/ttyACM0 (Marple Mini) der STM, welcher auch automatisch ausgewählt ist/angewählt werden muss. Über diesen Port (welcher nur simuliert wird) kann nun die Kommunikation mit dem STM erfolgen sowie jegliches weiteres Hochladen von neuem Arduino Code.

WICHTIG Wird der STM durch den Reset Button neugestartet, so ändert sich der USB Port und ein Upload ohne Wechsel auf diesen wird fehlschlagen.

STLink

ACHTUNG
Dies überschreibt einen gebrannten Bootloader wie z.B. den STM32duino bootloader!
Zum Programmieren muss Boot0 HIGH (und Boot1 LOW default) gesetzt werden. Danach wird der Reset Button einge Sekunden gedrückt, sodass die On Board LED 6x schnell blinkt. Nach dem erfolgreichen Upload beginnt der Code zu laufen. Für einen Start des Codes nach dem Einschalten ist Boot0 wieder auf LOW zu setzten.

Arduino Setup
Ermöglicht keine Ausgabe von Debug/Serial
Sollte die Arduino IDE folgenden Fehler ausgeben:

/home/jones/Arduino/arduino-1.6.12/hardware/Arduino_STM32-master/tools/linux/stlink_upload: line 2: 
/home/jones/Arduino/arduino-1.6.12/hardware/Arduino_STM32-master/tools/linux/stlink/st-flash: No such file or directory
 

so fehlen die nötigen Pakete, welche folgendermaßen installiert werden können:

   $ sudo apt-get install libc6-i386
   $ sudo apt-get install libusb-1.0-0:i386

Alternativ kann auch folgender Link verwendet werden http://apt.ubuntu.com/p/libc6-i386

USB to Serial Adapter

  • Mac: Funktioniert, anstecken und "Upload Methode: Serial" wählen.
  • Linux: Funktioniert, anstecken und "Upload Methode: Serial" wählen.

STM mit USB to Serial Adapter verbinden
ACHTUNG
Dies überschreibt einen gebrannten Bootloader wie z.B. den STM32duino bootloader!
Zum Programmieren muss Boot0 HIGH (und Boot1 LOW default) gesetzt werden. Danach wird der Reset Button einge Sekunden gedrückt, sodass die On Board LED 6x schnell blinkt. Nach dem erfolgreichen Upload beginnt der Code zu laufen. Für einen Start des Codes nach dem Einschalten ist Boot0 wieder auf LOW zu setzten.
Mit dieser Methode ist es möglich die Debug/Serial Ausgabe zu erhalten.

Probleme

Sollte der Datenlogger nicht mehr im Serial Monitor, bei der Portauswahl oder über das Terminal unter /dev/ttyAMC0 gelistet werden, der Bootloader voll funktionsfähig ist (auch ohne Fehler gebrannt werden kann), eine Programmierung via STLink oder den Serial Port PA9/PA10 ebenfalls funktioniert, DANN kann der Widerstand zwischen USB Buchse und STM32 oder die USB Buchse selbst einen Fehler aufweisen (Lötstelle defekt).
Dieses Verhalten bzw. dieses Problem zeigt sich im Terminal mit dem Befehl

   $ dmesg

als folgendes

[ 9715.253516] usb 1-5: new full-speed USB device number 72 using xhci_hcd
[ 9715.253767] usb 1-5: Device not responding to setup address.
[ 9715.461532] usb 1-5: Device not responding to setup address.
[ 9715.669511] usb 1-5: device not accepting address 72, error -71
 

auch wenn das Gerät manchmal als richtiges angezeigt wird

[ 9955.870998] usb 1-5: new full-speed USB device number 75 using xhci_hcd
[ 9956.012191] usb 1-5: New USB device found, idVendor=1eaf, idProduct=0003
[ 9956.012196] usb 1-5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 9956.012199] usb 1-5: Product: Maple 003
[ 9956.012202] usb 1-5: Manufacturer: LeafLabs
[ 9956.012204] usb 1-5: SerialNumber: LLM 003
 

Arduino kommentiert diesen Fehler mit folgendem Log

Sketch uses 14884 bytes (22%) of program storage space. Maximum is 65536 bytes.
Global variables use 2816 bytes of dynamic memory.
No valid DFU suffix signature
Warning: File has no DFU suffix
dfu-util 0.7

Copyright 2005-2008 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2012 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to dfu-util@lists.gnumonks.org

Filter on vendor = 0x1eaf product = 0x0003
Opening DFU capable USB device... ID 1eaf:0003
Run-time device DFU version 0110
Found DFU: [1eaf:0003] devnum=0, cfg=1, intf=0, alt=2, name="UNDEFINED"
Setting Configuration 1...
Claiming USB DFU Interface...
Setting Alternate Setting ...
 

Credits

Basic Tutorial mit Serial Upload
STM32Duino Bootloader brennen
Flashing Bootloader STM32duino Wiki
List of working Libs
STM32 Info + C Code
Blue Pill Wiki