Forum: Mikrocontroller und Digitale Elektronik LPCXpresso IDE erzeugt fehlerhaften Maschinencode?


von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Ich habe hier ein eigenes Board mit dem LPC1754.
Als IDE hab ich kurzerhand LPCXpresso genommen.
Mein Board programmiere ich per ISP (also der Hardwarebootloader auf 
UART0)
Die Hex - Files dafür erzeugt mit LPCXpresso auch mit einer winzigen 
Modifikation.
Doch jetzt fängt der Spaß an, nach dem Programmieren schien der Code 
einfach nicht zu laufen, 4 Stunden Startup Code durchwühlen später bin 
ich dann einfach mal vom Bootloader aus direkt in eine sehr simple main 
gesprungen (adresse aus dem disassembler listing) und siehe da, GPIOs 
wackeln funktioniert.
Anscheinend ist der erzeugte Code von LPCXpresso so nicht lauffähig.

http://pastebin.com/KgayWJmT

Ist was der Disassembler draus macht.

Ein Sprung aus dem Bootloader nach 00000128 <ResetISR>: bringt nichts, 
der code hängt sich irgendwo auf.
Nur ein Sprung direkt nach 00000300 <main>: funktioniert, ist aber nicht 
sinn der sache, da so keinerlei startup code ausgeführt wird.

Hat jemand eine Idee woran das liegen könnte? Ich hab nicht mehr so ganz 
den durchblick gerade ...

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Achja der Code selbst ist vielleicht auch noch interessant ...
1
/*
2
===============================================================================
3
 Name        : main.c
4
 Author      : 
5
 Version     :
6
 Copyright   : Copyright (C) 
7
 Description : main definition
8
===============================================================================
9
*/
10
11
12
#include "LPC17xx.h"
13
#include <cr_section_macros.h>
14
#include <NXP/crp.h>
15
16
// Variable to store CRP value in. Will be placed automatically
17
// by the linker when "Enable Code Read Protect" selected.
18
// See crp.h header for more information
19
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;
20
21
// TODO: insert other include files here
22
23
// TODO: insert other definitions and declarations here
24
25
int main(void) {
26
   uint32_t i, j;
27
28
    /* SystemClockUpdate() updates the SystemFrequency variable */
29
    //SystemClockUpdate();
30
31
    LPC_GPIO2->FIODIR = 0x000000FF;    /* P2.xx defined as Outputs */
32
    LPC_GPIO2->FIOCLR = 0x000000FF;    /* turn off all the LEDs */
33
34
    while(1)
35
    {
36
    for(i = 0; i < 8; i++)
37
    {
38
      LPC_GPIO2->FIOSET = 1 << i;
39
      for(j = 1000000; j > 0; j--);
40
    }
41
    LPC_GPIO2->FIOCLR = 0x000000FF;
42
    for(j = 1000000; j > 0; j--);
43
    }
44
  return 0 ;
45
}

von Michael G. (let)


Lesenswert?

Interessant wäre noch der Startcode selbst (mit der target.h) sowie das 
Linkerskript. Besser gleich das ganze Projekt.
Im Startcode wird normalerweise der Quarzoszillator und die PLL 
aktiviert. Hast du einen Quarz dran? Wenn ja, was für einen?

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Manchmal hilft drüber schlafen doch ... Bei genauerer Betrachtung ist 
mir dann aufgefallen, dass das SCS Register noch auf den default wert 
(1-20MHz und Main Oscillator Enable) gesetzt war, und da n diesem Fall 
im Startup Code gewartet wird bis der Main Oscillator Stabil ist (auch 
wenn er nicht als Taktquelle genutzt wird, das hab ich auf internen RC 
Oszillator gesetzt) hängt er sich ohne lebenszeichen einfach auf.

Also: Aufpassen wenn man den Startup Code von LPCXpresso nutzt und 
garkeinen Externen Quarz am Main Oscillator hat, egal ob man ihn nutzt 
oder nicht!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.