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 ...
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 | } |
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.