ARM Embedded

Antworten
Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ARM Embedded

Beitrag von Mathias »

Das gibt natürlich in die Jahre hinweg viel Erfahrung. :wink:

Ich mache es nur als Hobby.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ARM Embedded

Beitrag von Mathias »

Da ich nun Dank DonAlfredo Lazarus als ARM-Crosscompiler hingekriegt habe, wollte ich mal den ersten Blinker erstellen.
viewtopic.php?f=9&t=11718&start=15

Dazu habe ich unter Zielplattform folgendes eingestellt:
Betriebssystem: Embedded
CPU:arm
Zielprozessoer: ARMV7M

Bei Benutzerdefinierten Einstellungen noch folgendes: -WpSTM32F103C8

Dabei habe ich folgenden Code:

Code: Alles auswählen

program stm32Blink;
var
  APB2ENR: DWord absolute $40021018; // APB2 peripheral clock enable register
  PortC: record
    CRL, CRH, IDR, ODR, BSRR, BRR, LCKR: uint32;
  end
  absolute $40011000;
 
  procedure Delay;
  var
    i: uint32;
  begin
    for i := 0 to 500000 do
    begin
      asm
               NOP end; // Leerbefehl
    end;
  end;
 
begin
  APB2ENR := APB2ENR or (1 shl 4); // Clock für GPIOC freigeben.
  APB2ENR := APB2ENR or (1 shl 3); // Clock für GPIOB freigeben.
  APB2ENR := APB2ENR or (1 shl 2); // Clock für GPIOA freigeben.
 
 
  // Pin P13 von PortC aud Output.
  PortC.CRH := $00300000;
 
  // Hinweis: Die LED leuchtet bei LOW.
  repeat
 
    // Pin13 -- High
    portc.BSRR := 1 shl 13;
    Delay;
 
    // Pin13 -- Low
    portC.BRR := 1 shl 13;
    Delay;
  until 1=2;
end.


Wen ich kompiliere, wird eine stm32Blink.hex erzeugt. Dies würde mal gut aussehen.

Hochladen habe ich es folgendermassen:

Code: Alles auswählen

 st-flash write stm32Blink.hex 0x8000000

Dabei habe ich folgende Ausgabe:

Code: Alles auswählen

st-flash 1.5.1
2018-10-02T17:56:06 INFO common.c: Loading device parameters....
2018-10-02T17:56:06 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410
2018-10-02T17:56:06 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2018-10-02T17:56:06 INFO common.c: Attempting to write 2950 (0xb86) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08000800 erased
2018-10-02T17:56:07 INFO common.c: Finished erasing 3 pages of 1024 (0x400) bytes
2018-10-02T17:56:07 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id
2018-10-02T17:56:07 INFO flash_loader.c: Successfully loaded flash loader in sram
2018-10-02T17:56:10 ERROR flash_loader.c: flash loader run error
2018-10-02T17:56:10 ERROR common.c: stlink_flash_loader_run(0x8000000) failed! == -1
stlink_fwrite_flash() == -1
Nur habe ich da leider einen ERROR.

Mache ich es ein zweites mal, gibt es keine Fehler mehr, und dies dauert nur sehr kurz, sieht man an der LED de ST-LINK.

Code: Alles auswählen

st-flash 1.5.1
2018-10-02T17:58:47 INFO common.c: Loading device parameters....
2018-10-02T17:58:47 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410
2018-10-02T17:58:47 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2018-10-02T17:58:47 INFO common.c: Attempting to write 2950 (0xb86) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08000800 erased
2018-10-02T17:58:47 INFO common.c: Finished erasing 3 pages of 1024 (0x400) bytes
2018-10-02T17:58:47 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id
2018-10-02T17:58:47 INFO flash_loader.c: Successfully loaded flash loader in sram
  3/3 pages written
2018-10-02T17:58:47 INFO common.c: Starting verification of write complete
2018-10-02T17:58:47 INFO common.c: Flash written and verified! jolly good!
 


Versuche ich es nochmals, kommt wieder der ERROR, probiere ich es nochmals, ist es wieder ohne Fehler, usw.

Unterbreche ich die Verbindung, zwischen dem STM32 und dem STLINK, kommt folgende Meldung:

Code: Alles auswählen

st-flash 1.5.1
2018-10-02T18:01:07 INFO common.c: Loading device parameters....
2018-10-02T18:01:07 WARN common.c: Invalid flash type, please check device declaration
Unknown memory region
Dies ist ein Zeichen dafür, das der STM32 wen angeschlossen, erkannt wird.

Aber eine blinkende LED sehe ich nicht, was mache ich falsch ?

Hat jemand eine Idee ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ARM Embedded

Beitrag von Mathias »

Ich bin weiter gekommen, ich muss die *.bin und nicht die *.hex nehmen.

So hat es geklappt. 8)

Code: Alles auswählen

st-flash write stm32Blink.bin 0x8000000
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ARM Embedded

Beitrag von Mathias »

Nächstes Problem:

Ich will gerne die Unit "STM32F10x_ld" einbinden.
Wen ich sie in den Klausel einbinde und kompiliere, wird sie nicht gefunden.

Code: Alles auswählen

uses
  STM32F10x_ld; 

Aber wen ich mit dem Cursor auf den Namen gehe und [Ctrl+Enter] drücke, dann findet die IDE die Unit sofort.

Nachtrag:
Die Unit ist schon eingebunden, so wie beim AVR die "Atmega328.pp".

Dies wird erkannt:

Code: Alles auswählen

begin
  RCC.APB2ENR := 0;


Aber ich habe doch noch ein Problem.
Wen ich den Cursor auf "RCC" setzt und [Ctrl+Hoch] drücke, wird der Bezeichner nicht gefunden.
Dafür wird in die "systemh.inc" gesprungen, und bleibt bei Zeile 559 hängen.

Code: Alles auswählen

{ platform-dependent types }
{$i sysosh.inc} 


Wie kann ich dies umgehen ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: ARM Embedded

Beitrag von mse »

Mathias hat geschrieben:Wie kann ich dies umgehen ?

Ich kann dir da nicht helfen. Erlaube eine Bemerkung. Meiner Meinung nach ist der Einbau aller bekannten uP's in den Compiler nicht zielführend. Besser wäre ein System von vom Compiler unabhängigen Definitions-units und über Segmente gesteuerte Linker-scripts.

pluto
Lazarusforum e. V.
Beiträge: 7096
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: ARM Embedded

Beitrag von pluto »

Besser wäre ein System von vom Compiler unabhängigen Definitions-units und über Segmente gesteuerte Linker-scripts.

Macht das die Arduino IDE nicht ähnlich? Sie unterstützt als Grundlage erst mal ihre "hausgemachten" MC. nun haben "Leute" weitere wie z.b. den ESP hinzugefügt.

@Mathias
Welchen STM32 hast du genommen?
STM32F303 Discovery oder den STM32F103?

Wie groß ist deine BIN Datei? Unter Arduino ist sie gewaltig.... dabei soll der Code nur die LED blinken lassen.... dabei werden schon über ca 30% Flash Speicher verwendet.... Der Grund ist wohl der Bootloader den ich drauf gespielt habe(jedenfalls bei den STM32F103)....
MFG
Michael Springwald

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ARM Embedded

Beitrag von Mathias »

Welchen STM32 hast du genommen?

So ein billiger Chines: STM32F103C8T6

Wie groß ist deine BIN Datei?
Nur etwa 1KB.
Unter Arduino ist sie gewaltig....

Code: Alles auswählen

 
Globale Variablen verwenden 3088 Bytes (15%) des dynamischen Speichers, 17392 Bytes für lokale Variablen verbleiben. Das Maximum sind 20480 Bytes.

Auch das Hochladen geht sehr lange. Da sieht man wieder wie ineffizient Arduino ist.


PS: Ich habe gerade mein Compiler geupdatet.
Da motzt er, das er die Unit nicht mehr findet, aber im Editor wird sie geöffnet.

Code: Alles auswählen

stm32f103xb.pp(3,12) Fatal: Can't find unit stm32f103xb used by stm32Blink

Ich denke, dies ist fast der gleiche Fehler, wie ich gestern schon beschrieben habe.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ARM Embedded

Beitrag von Mathias »

Ich wollte wieder mal ausprobieren, ob ich einen STM32 Cross-Compiler hinkriege.
Gemäss meines Tutorials: https://wiki.freepascal.org/ARM_Embedde ... d_STM32/de

Ab diesem Punkt hier: https://wiki.freepascal.org/ARM_Embedde ... t_erzeugen scheitert es.
Es gibt den -WpSTM32F103C8 nicht mehr.

Alternativ habe ich mal einen -WpSTM32F103XB probiert.

Der Compiller kompiliert mir anstandslos das Blink-Beispiel.

Aber ST-Link macht Probleme.

Code: Alles auswählen

Projekt kompilieren, OS: embedded, CPU: arm, Ziel: /home/tux/fpcupdeluxe_stm32/projects/project1.elf: Erfolg
Projekt: Ausführen des Befehls nach: Exit code 255, Fehler: 1
2020-02-23T15:45:22 INFO common.c: Loading device parameters....
2020-02-23T15:45:22 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410
2020-02-23T15:45:22 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x10000 bytes (64 KiB) in pages of 1024 bytes
open(stm32Blink.bin) == -1
2020-02-23T15:45:22 ERROR common.c: map_file() == -1
st-flash 1.6.0
stlink_fwrite_flash() == -1
Panic: tool stopped with exit code 255. Use context menu to get more information.

Weis jemand einen Rat, das dies wieder läuft ?
Was muss ich anstelle von -WpSTM32F103C8 nehmen ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ARM Embedded

Beitrag von Mathias »

Nachtrag, jetzt läufts.
Ich habe -WpSTM32F103X8 genommen. Kommischerweise läuft es jetzt auch mit dem -WpSTM32F103XB .
Vielleicht hat auch st-link Probleme gemacht, nach einem Neustart des PCs geht's wieder.

Ein

Code: Alles auswählen

{$O-}
Musste ich auch noch einfügen, so wie es scheint wurde auch am Compiler weiter gearbeitet.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 2818
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: ARM Embedded

Beitrag von Socke »

Mathias hat geschrieben:Es gibt den -WpSTM32F103C8 nicht mehr.

Alternativ habe ich mal einen -WpSTM32F103XB probiert.

Die beiden MCUs gehören zur selben Serie; daher sind relativ geringe Probleme zu erwarten. Ggf. erzeugt der Compiler zu große Binaries, die nicht mehr in den Flash passen oder du steuerst Peripherie an, die dein MCU gar nicht hat.

Korrekterweise sollten im Compiler aber alle Varianten hinterlegt werden, damit er die korrekten Daten zur Verfügung hat. Wann STM32F103C8 aus dem Compiler entfernt wurde (bzw. ob es jemals da war), konnte ich nicht herausfinden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ARM Embedded

Beitrag von Mathias »

Er war mal da, ansonsten wären meine alten Programme nicht mit diesem.
Der C8 ist sehr verbreitet.
Die Ports hiessen mal GPIO.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

kupferstecher
Beiträge: 274
Registriert: Do 17. Nov 2016, 11:52

Re: ARM Embedded

Beitrag von kupferstecher »

Ist mir auch aufgefallen, dass sich die Bezeichnung geändert hat.

Das x in -WpSTM32F103x8 steht ja für eine beliebige Zahl, also auch für den STM32F103C8, das ist schon die richtige Einstellung.

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ARM Embedded

Beitrag von Mathias »

Schade, haben sie das x nicht klein geschrieben, dann wäre es übersichtlicher gewesen. :wink:

Aber Hauptsache, es geht wieder. Das Wiki habe ich angepasst.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Antworten