Mein erstes Assemblerprogramm für den LPC2148
08. Januar 2012
Es werden hier zwar nur die LEDs angeschaltet, aber immerhin ist es mein erster Assemblercode für meinen ARM uC und er funktioniert. Jetzt habe ich eine kleine Basis, auf der ich weiter aufbauen kann.
Wirklich hilfreich war das Internet nicht gerade, als ich auf der Suche nach Beispielen war. Die meisten Assembler-Beispiele fand ich für RVCT (RealView Compiler Tools) und der Rest war nicht wirklich zu gebrauchen. Also hatte ich mir mal die Assemblerdateien angesehen, die CrossWorks in ein Projekt einbindet (z.B. die startup.s Datei), da hatte ich dann schon einen Anhaltspunkt für die Defines (der Adressen) und der Rest kam aus dem NXP-Manual.
Und weils so schön war, lassen wir die LEDs noch blinken :-)
Die zugehörige Include-Datei sieht so aus:
#define PINSEL0 0xE002C000
#define PINSEL1 0xE002C004
#define PINSEL2 0xE002C014
#define IO0SET 0xE0028004
#define IO0DIR 0xE0028008
#define IO0CLR 0xE002800C
#define IO1SET 0xE0028014
#define IO1DIR 0xE0028018
#define IO1CLR 0xE002801C
.section .text, "ax"
.code 32
.align 2
.global _start
_start:
mov r1, #0x0
ldr r0, =PINSEL0
str r1, [r0]
ldr r0, =PINSEL1
str r1, [r0]
mov r1, #0xFFFFFFFF
ldr r0, =IO0DIR
str r1, [r0]
ldr r0, =IO1DIR
str r1, [r0]
ldr r0, =IO0SET
str r1, [r0]
ldr r0, =IO1SET
str r1, [r0]
.end
Wirklich hilfreich war das Internet nicht gerade, als ich auf der Suche nach Beispielen war. Die meisten Assembler-Beispiele fand ich für RVCT (RealView Compiler Tools) und der Rest war nicht wirklich zu gebrauchen. Also hatte ich mir mal die Assemblerdateien angesehen, die CrossWorks in ein Projekt einbindet (z.B. die startup.s Datei), da hatte ich dann schon einen Anhaltspunkt für die Defines (der Adressen) und der Rest kam aus dem NXP-Manual.
Und weils so schön war, lassen wir die LEDs noch blinken :-)
.include "lpc2148.inc"
.section .text, "ax"
.code 32
.align 2
.global _start
_start:
mov r1, #0x0
ldr r0, =PINSEL0
str r1, [r0]
ldr r0, =PINSEL1
str r1, [r0]
loop_on:
mov r1, #0xFFFFFFFF
ldr r0, =IO0DIR
str r1, [r0]
ldr r0, =IO1DIR
str r1, [r0]
ldr r0, =IO0SET
str r1, [r0]
ldr r0, =IO1SET
str r1, [r0]
mov r2, #4000
b loop_on1
loop_off:
ldr r0, =IO0CLR
str r1, [r0]
ldr r0, =IO1CLR
str r1, [r0]
mov r2, #4000
b loop_off1
loop_on1:
subs r2, r2, #1
beq loop_off
mov r3, #2000
b loop_on2
loop_on2:
subs r3, r3, #1
beq loop_on1
b loop_on2
loop_off1:
subs r2, r2, #1
beq loop_on
mov r3, #2000
b loop_off2
loop_off2:
subs r3, r3, #1
beq loop_off1
b loop_off2
.end
Die zugehörige Include-Datei sieht so aus:
.equ IO0SET, 0xE0028004
.equ IO0DIR, 0xE0028008
.equ IO0CLR, 0xE002800C
.equ IO1SET, 0xE0028014
.equ IO1DIR, 0xE0028018
.equ IO1CLR, 0xE002801C
.equ PINSEL0, 0xE002C000
.equ PINSEL1, 0xE002C004
.equ PINSEL2, 0xE002C014
Immer noch kein Kommentar. Jetzt wird's aber mal Zeit!
HILFE
Code-Beispiele werden mit den BBCodes [code][/code] dargestellt.
Jedes Tag muss eine Zeile für sich allein haben, d.h der Beispiel-Code
muss wirklich ZWISCHEN den Tags stehen. Beispiel:
Alles was zwischen den beiden Tags [register] und [/register] eingetragen wird, ist nur für registrierte (und eingeloggte) User sichtbar.
[code] ACHTUNG! HIER UMBRUCH WICHTIG. TAG [code] MUSS ALLEIN STEHEN
#include <stdio.h>
int main( void ){
return 0;
} ACHTUNG! HIER UMBRUCH WICHTIG. NACHFOLGENDES TAG [/code] MUSS ALLEIN STEHEN
[/code]Alles was zwischen den beiden Tags [register] und [/register] eingetragen wird, ist nur für registrierte (und eingeloggte) User sichtbar.
Dein Name *
Deine Email
Deine Website
Vorschau