ARM Embedded

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

Re: ARM Embedded

Beitrag von Mathias »

Worauf bezieht sich das? Auf FPC? Dazu sind zum Controller passende Register-Definitions-Units notwendig.

Auf die GPIO-Zugriffe des AVR. http://wiki.freepascal.org/AVR_Embedded_Tutorial_-_Simple_GPIO_on_and_off_output/de
Mit Lazarus sehe ich grü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 »

Sind die AVR Register (z.B. "PORTD") in FPC definiert oder in einer in uses gelisteten unit?
So wie das Wechselblinker Demoprogram aussieht vermutlich direkt in FPC. Das ist mit den ARM-Chips kaum machbar, die sind zu komplex und es gibt viel zu viele verschiedene Derivate.

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

Re: ARM Embedded

Beitrag von Mathias »

Nein, sie sind in einer Unit. Die GPIO-Ports, werden im Speicher abgebildet.
Ausschnitt aus der Unit ATmega328P.

Code: Alles auswählen

  PORTB : byte absolute $00+$25; // Port B Data Register
  DDRB : byte absolute $00+$24; // Port B Data Direction Register
  PINB : byte absolute $00+$23; // Port B Input Pins


Einen einfachen Blinker kann ich auch so machen:

Code: Alles auswählen

var
  mem  : array[0..$7fff-1] of byte absolute $0;
begin
  DDRB := DDRB or (1 shl BP5);
  repeat
//    PORTB := PORTB or (1 shl BP5);
    Mem[$25] := Mem[$25] or (1 shl BP5);
    mysleep(sl);
 
    Mem[$25] := Mem[$25] and not (1 shl BP5);
//    PORTB := PORTB and not (1 shl BP5);
    mysleep(sl);
  until 1 = 2;
end.


Aus dem STM13 habe ich den Blinker folgendermassen hingekriegt:

Code: Alles auswählen

void loop() {
 
// Pin PC13 einschalten
        //  gpio_write_bit(GPIOC, 13, 1);
        //  GPIOC->regs->BSRR = (1U << 13) << (16 * 0l);
   GPIOC->regs->BSRR = 0b10000000000000;
 
   delay(100);
// Pin PC13 ausschalten
        //  gpio_write_bit(GPIOC, 13, 0);
        //  GPIOC->regs->BSRR = (1U << 13) << (16 * 1l);
   GPIOC->regs->BSRR = 0b100000000000000000000000000000;
 
   delay(100);

Macht eigentlich nicht viel Sinn, aber ich will den STM32 Kennenlernen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

FPK
Beiträge: 65
Registriert: Mi 21. Mai 2008, 19:38
Wohnort: Erlangen

Re: ARM Embedded

Beitrag von FPK »

Macht eigentlich nicht viel Sinn, aber ich will den STM32 Kennenlernen.


FPC für arm-embedded bauen:

make clean all OS_TARGET=embedded CPU_TARGET=arm SUBARCH=armv7m

Je nach persönlichem Setup installieren.

Code: Alles auswählen

 
begin
  PortC.BSRR:=%10000000000000;
end.
 


mit

<neu gebauter fpc> -Tembedded -Cparmv7m -WpSTM32F103X4 test.pp

übersetzen (STM32F103X4 ist ein willkürlich gewählter Typ).

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

Re: ARM Embedded

Beitrag von Mathias »

FPC für arm-embedded bauen:

make clean all OS_TARGET=embedded CPU_TARGET=arm SUBARCH=armv7m
Ist wohl doch nicht so einfach.

Code: Alles auswählen

system.pp(325) Error: Assembler arm-embedded-as not found, switching to external assembling
Da muss ich wohl die der Pfad zu der Datei "arm-embedded-as" einbinden, diese befindet sich irgendwo im Arduino-Ordner.

Auf einem Atmega328p habe ich den Port-Zugriff auf das Minimum optimiert.

Code: Alles auswählen

void loop() {
   (*(char *)(0x25)) |= 0b100000;
  delay(1000);
   (*(char *)(0x25)) &= ~0b100000;
  delay(100);
}
Dies funktioniert sogar. :shock:

Dies habe ich auf dem STM32 auch probiert, und siehe das es funktioniert auch.

Code: Alles auswählen

void loop() {
   //   gpio_write_bit(GPIOC, 13, 1);
   //  GPIOC->regs->BSRR = (1U << 13) << (16 * 0l);
   //  GPIOC->regs->BSRR = 0b10000000000000;
 
   (*(__uint32_t *) (0x40011000 + 16)) = 0b10000000000000;
 
   delay(100);
   //  gpio_write_bit(GPIOC, 13, 0);
   //   GPIOC->regs->BSRR = (1U << 13) << (16 * 1l);
   //   GPIOC->regs->BSRR = 0b100000000000000000000000000000;
   (*(__uint32_t *) (0x40011000 + 16)) = 0b100000000000000000000000000000;
 
   delay(10);
}

Nur komischerweise, wen das delay > 255 ist, dann hängt sich der STM32 auf, wieso auch immer.
Was aber der Mini-Code aussagt, das der STM32 die GPIOs auch im Memmory abbildet, ähnlich des AVRs.

Das +16 habe ich aus dieser struct berechnet.

Code: Alles auswählen

typedef struct gpio_reg_map {
    __IO uint32 CRL;      /**< Port configuration register low */
    __IO uint32 CRH;      /**< Port configuration register high */   + 4
    __IO uint32 IDR;      /**< Port input data register */           + 8
    __IO uint32 ODR;      /**< Port output data register */          + 12
    __IO uint32 BSRR;     /**< Port bit set/reset register */        + 16
    __IO uint32 BRR;      /**< Port bit reset register */
    __IO uint32 LCKR;     /**< Port configuration lock register */
} gpio_reg_map;
Mit Lazarus sehe ich grü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 »

Ein Beispiel zum debuggen mit ST-Link ist hier:
https://gitlab.com/mseide-msegui/mseuni ... inkerdebug
http://mseide-msegui.sourceforge.net/pics/armdebug.png

Code: Alles auswählen

 
Debug demo project for STM32L100C-Discovery board    2018-04-06 mse
-------------------------------------------------
 
- clone, build and install the texane ST-Link tools:
https://github.com/texane/stlink
see
https://github.com/texane/stlink/blob/m ... mpiling.md
 
- Download the ARM toolchain:
https://developer.arm.com/open-source/g ... /downloads
 extract it to a directory of your choice (<toolchaindir>).
 
- Download the ST firmware STM32CubeL1:
http://www.st.com/content/st_com/en/pro ... are-scroll
 extract it to a directory of your choice (<firmwaredir>).
 
- Run MSEide.
- 'Project'-'Open'-"blinkerdebug.prj".
- 'Project'-'Options'-'Macros', update <toolchaindir> and <firmwaredir>.
- 'Target'-'Download' in order to flash the program.
- 'Target'-'Continue' in order to run the program.
 
Have a lot of fun!
 
Martin
 

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 »

Hier ein Beispiel Free Pascal ARM-embedded:
https://gitlab.com/mseide-msegui/mseuni ... stm32l100c
http://mseide-msegui.sourceforge.net/pi ... bedded.png

Code: Alles auswählen

 
Free Pascal demo project for STM32L100C-Discovery board    2018-04-07 mse
-------------------------------------------------------
 
- clone, build and install the texane ST-Link tools:
https://github.com/texane/stlink
see
https://github.com/texane/stlink/blob/m ... mpiling.md
 
- Download the ARM toolchain:
https://developer.arm.com/open-source/g ... /downloads
 extract it to a directory of your choice (<toolchaindir>).
 
- Download the Free Pascal ARM-embedded cross compiler:
https://sourceforge.net/projects/mseide ... membedded/
 extract it to a directory of your choice (<crossfpcdir>).
 
- Run MSEide.
- 'Project'-'Open'-"stm32l100c.prj".
- 'Project'-'Options'-'Macros', update <toolchaindir> and <crossfpcdir>.
- 'Target'-'Continue' in order to run the program.
 
Have a lot of fun!
 
Martin
 

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

Re: ARM Embedded

Beitrag von Mathias »

Ich habe heiute ein wenig mit den GPIO-Registern rum gespielt.
Dafür habe ich an die Pins A0-A7 LEDs angeschlossen.

Code: Alles auswählen

#include <stddef.h>
#include <stdlib.h>
 
#define LEDPin 13
 
void setup() {
   GPIOA->regs->CRH = 0x33333333;
   GPIOA->regs->CRL = 0x33333333;
 
   GPIOC->regs->CRH = 0x33333333;
   GPIOC->regs->CRL = 0x33333333;
}
 
void loop() {
//   GPIOA->regs->BRR = 0B01010101;
//   GPIOA->regs->BSRR = 0B10101010;
   GPIOA->regs->ODR = 0B10101010;
   GPIOC->regs->BSRR = 1 << LEDPin;
//   (*(__uint32_t *) (0x40011000 + 16)) = 0b10000000000000;
 
   delay(500);
//   GPIOA->regs->BRR = 0B10101010;
//   GPIOA->regs->BSRR = 0B01010101;
   GPIOA->regs->ODR = 0B01010101;
   GPIOC->regs->BSRR = 1 << LEDPin << 16;
//    (*(__uint32_t *) (0x40011000 + 16)) = 0b100000000000000000000000000000;
 
   delay(500);
}

Da sieht man, das der STM32 einiges moderner als der AVR ist. Es gibt sehr viele Möglichkeiten um die GPIOs zu beschreiben. Man kann sich die or und and not. Verknüpfungen sparen, aber möglich wäre es immer noch.

Jetzt muss ich mal bei Gelegenheit gucken, ob ich den Cross-Compiler mit deinem Links hinkriege.
Am liebsten hätte ich es, wen es mit Lazarus laufen würde.
Mit Lazarus sehe ich grü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 »

Dann verwende zuerst meine MSEide Beispiele. Wenn es in MSEide funktioniert kannst du nach Lazarus portieren.
Wobei MSEide auch für Mikrocontroller als Entwicklungsziele entworfen wurde und für Embedded Entwicklungen speziell geeignet ist.

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:Jetzt muss ich mal bei Gelegenheit gucken, ob ich den Cross-Compiler mit deinem Links hinkriege.

Falls st-util mit der Fehlermeldung

Code: Alles auswählen

 
st-util: error while loading shared libraries: libstlink.so.1: cannot open shared object file: No such file or directory
 

abbricht ist vermutlich
https://github.com/texane/stlink/issues/700
das Problem. Kopiere die libstlink.* Dateien von
/usr/local/lib/lib/
nach
/usr/local/lib/
und rufe

Code: Alles auswählen

 
sudo ldconfig
 

auf.

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

Re: ARM Embedded

Beitrag von Mathias »

Der Fpc-Crodd-Pfad habe ich jetzt mal richtig.

Aber jetzt habe ich folgenden Fehler:

Code: Alles auswählen

Free Pascal Compiler version 3.1.1 [2018/04/07] for arm
Copyright (c) 1993-2018 by Florian Klaempfl and others
Target OS: Embedded
Compiling stm32l100c.pas
stm32l100c.pas(6,13) Warning: Variable "testvar" does not seem to be initialized
Assembling stm32l100c
stm32l100c.pas(9) Error: Assembler arm-embedded-as not found, switching to external assembling
stm32l100c.pas(9) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted


Da er die as-Datei nicht gefunden hat, habe ich sie umbenannt, hat aber nichts genutzt.
/home/acer/Schreibtisch/arm/gcc-arm-none-eabi-7-2017-q4-major/bin/arm-none-eabi-as --> /home/acer/Schreibtisch/arm/gcc-arm-none-eabi-7-2017-q4-major/bin/arm-embedded-as

Bei Macro steht folgendes:

Code: Alles auswählen

TOOLCHAINDIR   /home/acer/Schreibtisch/arm/gcc-arm-none-eabi-7-2017-q4-major/bin
Mit Lazarus sehe ich grü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 »

Code: Alles auswählen

 
TOOLCHAINDIR   /home/acer/Schreibtisch/arm/gcc-arm-none-eabi-7-2017-q4-major
 

Bitte mache die as-Umbenennung wieder rückgängig.

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

Re: ARM Embedded

Beitrag von Mathias »

Ich habe die Ordner ein wenig aufgeräumter gemacht.
Diese Datei habe ich jetzt.

Code: Alles auswählen

/home/tux/Schreibtisch/MSEgui_arm/gcc_arm/bin/arm-none-eabi-as

Bei Macros folgendes, wie du schreibst ohne bin.

Code: Alles auswählen

TOOLCHAINDIR   /home/tux/Schreibtisch/MSEgui_arm/gcc_arm

Habe ich noch was vergessen ?

Wieso kommt beim Fehler "arm-embedded-as", obwohl er nach deiner Meinung "arm-none-eabi-as" braucht ?
Das sieht so aus:
Bild
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: ARM Embedded

Beitrag von Mathias »

Ich habe im Ordner

Code: Alles auswählen

/home/tux/Schreibtisch/MSEgui_arm/gcc_arm/arm-none-eabi/bin
bei gewissen Dateien umbenannt, auf arm-embedded-xx.
Jetzt läuft der Compiler durch.
Hochladen tut er noch nichts, auch versucht er es nicht, ansonsten würde die LED am ST-LINK V2 kurz aufflackern.
Dafür habe ich ein Fehlermeldung oberhalb des grünen Start-Pfeiles.

Code: Alles auswählen

gdb server start error 127.
Mit Lazarus sehe ich grü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 »

'Project'-'Options'-'Make'-'Show Commandline' zeigt bei mir:

Code: Alles auswählen

 
/home/mse/test/crossfpc-x86_64_linux_eabi_embedded_3_1_1//lib/fpc/3.1.1/ppcrossarm -Fu/home/mse/test/crossfpc-x86_64_linux_eabi_embedded_3_1_1/lib/fpc/3.1.1/units/arm-embedded/* -Fi/home/mse/test/crossfpc-x86_64_linux_eabi_embedded_3_1_1/lib/fpc/3.1.1/units/arm-embedded/* -Fl/home/mse/test/crossfpc-x86_64_linux_eabi_embedded_3_1_1/lib/fpc/3.1.1/units/arm-embedded/* -Fo/home/mse/test/crossfpc-x86_64_linux_eabi_embedded_3_1_1/lib/fpc/3.1.1/units/arm-embedded/* -g -Tembedded -Cparmv7m -WpSTM32F103X4 -e/home/mse/download/arm/gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/bin stm32l100c.pas
 

Vor allem interessant

Code: Alles auswählen

 
-e/home/mse/download/arm/gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/bin
 

Wenn du in deinem entsprechenden Verzeichnis schaust, siehst du, dass dort die Tools ohne Prefix "arm-none-eabi" gelistet sind. Mit der original "gcc-arm-none-eabi-7-2017-q4-major" cross-toolchain und dem korrekten TOOLCHAINDIR Macro sind keine Umbenennungen notwendig.

Code: Alles auswählen

 
gdb server start error 127.
 


Das ist vermutlich das bereits erwähnte Problem
https://github.com/texane/stlink/issues/700
Bitte gib in einem Teminal

Code: Alles auswählen

 
st-util
 

ein. Falls eine Fehlermeldung

Code: Alles auswählen

 
st-util: error while loading shared libraries: libstlink.so.1: cannot open shared object file: No such file or directory
 

erscheint, kopiere die libstlink.* Dateien von
/usr/local/lib/lib/
nach
/usr/local/lib/
und rufe

Code: Alles auswählen

 
sudo ldconfig
 

auf.

Antworten