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.
 
#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:
[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