Forum: Mikrocontroller und Digitale Elektronik LPC2294 Boot Loader Mode


von Achim (Gast)


Lesenswert?

Hallo!

ich hab seit kurzem Startproblem bei meinem phytec-LPC2294. Nach dem 
Start bleibt er immer im Boot Loader Mode, obwohl der Pin P0.14 auf HIGH 
gezogen ist. Im Startup.s hängt er immer in der zeile LDR PC, PAbt_Addr.

Stratup.s:

Vectors         LDR     PC, Reset_Addr
                LDR     PC, Undef_Addr
                LDR     PC, SWI_Addr
                LDR     PC, PAbt_Addr
                LDR     PC, DAbt_Addr
                NOP                            ; Reserved Vector
;               LDR     PC, IRQ_Addr
                LDR     PC, [PC, #-0x0FF0]     ; Vector from VicVectAddr
                LDR     PC, FIQ_Addr

Reset_Addr      DCD     Reset_Handler
Undef_Addr      DCD     Undef_Handler
SWI_Addr        DCD     SWI_Handler
PAbt_Addr       DCD     PAbt_Handler
DAbt_Addr       DCD     DAbt_Handler
                DCD     0                      ; Reserved Address
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

Ich hab schon die Startup code auf einen anderen Board ausprobiert und 
der LPC auf dem Board start immer im User Flash Mode.

Weiß vllt. jemand an was es liegen kann?

Danke für eure Hilfe.

von (prx) A. K. (prx)


Lesenswert?

Achim schrieb:

> Im Startup.s hängt er immer in der zeile LDR PC, PAbt_Addr.

Lies: Die Zieladressen der Einsprungtabelle zeigen ins Nirvana.

von Achim (Gast)


Lesenswert?

hm, und warum geht es auf den anderen Board? die Startup file hab ich 
von den Keil Beispielen...
ich verstehe auch nicht welche addresse das sein soll, kannst du mir da 
weiter helfen?

von (prx) A. K. (prx)


Lesenswert?

Zeig mal ein Disassembly-Listing von der Einsprungtabelle.

von Achim (Gast)


Lesenswert?

Anbei das ganze Startup File, falls du noch weiter Informationen 
brauchst.

Startup.s:
1
; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
2
3
Mode_USR        EQU     0x10
4
Mode_FIQ        EQU     0x11
5
Mode_IRQ        EQU     0x12
6
Mode_SVC        EQU     0x13
7
Mode_ABT        EQU     0x17
8
Mode_UND        EQU     0x1B
9
Mode_SYS        EQU     0x1F
10
11
I_Bit           EQU     0x80            ; when I bit is set, IRQ is disabled
12
F_Bit           EQU     0x40            ; when F bit is set, FIQ is disabled
13
14
15
16
;// <h> Stack Configuration (Stack Sizes in Bytes)
17
;//   <o0> Undefined Mode      <0x0-0xFFFFFFFF:8>
18
;//   <o1> Supervisor Mode     <0x0-0xFFFFFFFF:8>
19
;//   <o2> Abort Mode          <0x0-0xFFFFFFFF:8>
20
;//   <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8>
21
;//   <o4> Interrupt Mode      <0x0-0xFFFFFFFF:8>
22
;//   <o5> User/System Mode    <0x0-0xFFFFFFFF:8>
23
;// </h>
24
25
UND_Stack_Size  EQU     0x00000000
26
SVC_Stack_Size  EQU     0x00000008
27
ABT_Stack_Size  EQU     0x00000000
28
FIQ_Stack_Size  EQU     0x00000000
29
IRQ_Stack_Size  EQU     0x00000080
30
USR_Stack_Size  EQU     0x00000400
31
32
ISR_Stack_Size  EQU     (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \
33
                         FIQ_Stack_Size + IRQ_Stack_Size)
34
35
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
36
37
Stack_Mem       SPACE   USR_Stack_Size
38
__initial_sp    SPACE   ISR_Stack_Size
39
40
Stack_Top
41
42
;// <h> Heap Configuration
43
;//   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF>
44
;// </h>
45
46
Heap_Size       EQU     0x00000000
47
48
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
49
__heap_base
50
Heap_Mem        SPACE   Heap_Size
51
__heap_limit
52
53
54
; VPBDIV definitions
55
VPBDIV          EQU     0xE01FC100      ; VPBDIV Address
56
57
;// <e> VPBDIV Setup
58
;// <i> Peripheral Bus Clock Rate
59
;//   <o1.0..1>   VPBDIV: VPB Clock
60
;//               <0=> VPB Clock = CPU Clock / 4
61
;//               <1=> VPB Clock = CPU Clock
62
;//               <2=> VPB Clock = CPU Clock / 2
63
;//   <o1.4..5>   XCLKDIV: XCLK Pin
64
;//               <0=> XCLK Pin = CPU Clock / 4
65
;//               <1=> XCLK Pin = CPU Clock
66
;//               <2=> XCLK Pin = CPU Clock / 2
67
;// </e>
68
VPBDIV_SETUP    EQU     1
69
VPBDIV_Val      EQU     0x00000001
70
71
72
; Phase Locked Loop (PLL) definitions
73
PLL_BASE        EQU     0xE01FC080      ; PLL Base Address
74
PLLCON_OFS      EQU     0x00            ; PLL Control Offset
75
PLLCFG_OFS      EQU     0x04            ; PLL Configuration Offset
76
PLLSTAT_OFS     EQU     0x08            ; PLL Status Offset
77
PLLFEED_OFS     EQU     0x0C            ; PLL Feed Offset
78
PLLCON_PLLE     EQU     (1<<0)          ; PLL Enable
79
PLLCON_PLLC     EQU     (1<<1)          ; PLL Connect
80
PLLCFG_MSEL     EQU     (0x1F<<0)       ; PLL Multiplier
81
PLLCFG_PSEL     EQU     (0x03<<5)       ; PLL Divider
82
PLLSTAT_PLOCK   EQU     (1<<10)         ; PLL Lock Status
83
84
;// <e> PLL Setup
85
;//   <o1.0..4>   MSEL: PLL Multiplier Selection
86
;//               <1-32><#-1>
87
;//               <i> M Value
88
;//   <o1.5..6>   PSEL: PLL Divider Selection
89
;//               <0=> 1   <1=> 2   <2=> 4   <3=> 8
90
;//               <i> P Value
91
;// </e>
92
PLL_SETUP       EQU     1
93
PLLCFG_Val      EQU     0x00000024
94
95
96
; Memory Accelerator Module (MAM) definitions
97
MAM_BASE        EQU     0xE01FC000      ; MAM Base Address
98
MAMCR_OFS       EQU     0x00            ; MAM Control Offset
99
MAMTIM_OFS      EQU     0x04            ; MAM Timing Offset
100
101
;// <e> MAM Setup
102
;//   <o1.0..1>   MAM Control
103
;//               <0=> Disabled
104
;//               <1=> Partially Enabled
105
;//               <2=> Fully Enabled
106
;//               <i> Mode
107
;//   <o2.0..2>   MAM Timing
108
;//               <0=> Reserved  <1=> 1   <2=> 2   <3=> 3
109
;//               <4=> 4         <5=> 5   <6=> 6   <7=> 7
110
;//               <i> Fetch Cycles
111
;// </e>
112
MAM_SETUP       EQU     1
113
MAMCR_Val       EQU     0x00000002
114
MAMTIM_Val      EQU     0x00000004
115
116
117
; External Memory Controller (EMC) definitions
118
EMC_BASE        EQU     0xFFE00000      ; EMC Base Address
119
BCFG0_OFS       EQU     0x00            ; BCFG0 Offset
120
BCFG1_OFS       EQU     0x04            ; BCFG1 Offset
121
BCFG2_OFS       EQU     0x08            ; BCFG2 Offset
122
BCFG3_OFS       EQU     0x0C            ; BCFG3 Offset
123
124
;// <e> External Memory Controller (EMC)
125
EMC_SETUP       EQU     0
126
127
;//   <e> Bank Configuration 0 (BCFG0)
128
;//     <o1.0..3>   IDCY: Idle Cycles <0-15>
129
;//     <o1.5..9>   WST1: Wait States 1 <0-31>
130
;//     <o1.11..15> WST2: Wait States 2 <0-31>
131
;//     <o1.10>     RBLE: Read Byte Lane Enable
132
;//     <o1.26>     WP: Write Protect
133
;//     <o1.27>     BM: Burst ROM
134
;//     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit
135
;//                                   <2=> 32-bit  <3=> Reserved
136
;//   </e>
137
BCFG0_SETUP EQU         0
138
BCFG0_Val   EQU         0x0000FBEF
139
140
;//   <e> Bank Configuration 1 (BCFG1)
141
;//     <o1.0..3>   IDCY: Idle Cycles <0-15>
142
;//     <o1.5..9>   WST1: Wait States 1 <0-31>
143
;//     <o1.11..15> WST2: Wait States 2 <0-31>
144
;//     <o1.10>     RBLE: Read Byte Lane Enable
145
;//     <o1.26>     WP: Write Protect
146
;//     <o1.27>     BM: Burst ROM
147
;//     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit
148
;//                                   <2=> 32-bit  <3=> Reserved
149
;//   </e>
150
BCFG1_SETUP EQU         0
151
BCFG1_Val   EQU         0x0000FBEF
152
153
;//   <e> Bank Configuration 2 (BCFG2)
154
;//     <o1.0..3>   IDCY: Idle Cycles <0-15>
155
;//     <o1.5..9>   WST1: Wait States 1 <0-31>
156
;//     <o1.11..15> WST2: Wait States 2 <0-31>
157
;//     <o1.10>     RBLE: Read Byte Lane Enable
158
;//     <o1.26>     WP: Write Protect
159
;//     <o1.27>     BM: Burst ROM
160
;//     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit
161
;//                                   <2=> 32-bit  <3=> Reserved
162
;//   </e>
163
BCFG2_SETUP EQU         0
164
BCFG2_Val   EQU         0x0000FBEF
165
166
;//   <e> Bank Configuration 3 (BCFG3)
167
;//     <o1.0..3>   IDCY: Idle Cycles <0-15>
168
;//     <o1.5..9>   WST1: Wait States 1 <0-31>
169
;//     <o1.11..15> WST2: Wait States 2 <0-31>
170
;//     <o1.10>     RBLE: Read Byte Lane Enable
171
;//     <o1.26>     WP: Write Protect
172
;//     <o1.27>     BM: Burst ROM
173
;//     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit
174
;//                                   <2=> 32-bit  <3=> Reserved
175
;//   </e>
176
BCFG3_SETUP EQU         0
177
BCFG3_Val   EQU         0x0000FBEF
178
179
;// </e> End of EMC
180
181
182
; External Memory Pins definitions
183
PINSEL2         EQU     0xE002C014      ; PINSEL2 Address
184
PINSEL2_Val     EQU     0x0E6149E4      ; CS0..3, OE, WE, BLS0..3, 
185
                                        ; D0..31, A2..23, JTAG Pins
186
187
188
                PRESERVE8
189
                
190
191
; Area Definition and Entry Point
192
;  Startup Code must be linked first at Address at which it expects to run.
193
194
                AREA    RESET, CODE, READONLY
195
                ARM
196
197
; Exception Vectors
198
;  Mapped to Address 0.
199
;  Absolute addressing mode must be used.
200
;  Dummy Handlers are implemented as infinite loops which can be modified.
201
202
203
Vectors         LDR     PC, Reset_Addr         
204
               LDR     PC, Undef_Addr
205
                LDR     PC, SWI_Addr
206
                LDR     PC, PAbt_Addr
207
                LDR     PC, DAbt_Addr
208
                NOP                            ; Reserved Vector 
209
               LDR     PC, IRQ_Addr
210
                LDR     PC, [PC, #-0x0FF0]     ; Vector from VicVectAddr
211
                LDR     PC, FIQ_Addr
212
213
Reset_Addr      DCD     Reset_Handler
214
Undef_Addr      DCD     Undef_Handler
215
SWI_Addr        DCD     SWI_Handler
216
PAbt_Addr       DCD     PAbt_Handler
217
DAbt_Addr       DCD     DAbt_Handler
218
                DCD     0                      ; Reserved Address 
219
IRQ_Addr        DCD     IRQ_Handler
220
FIQ_Addr        DCD     FIQ_Handler   
221
222
;/ Modifikation: Code an Adresse 0x40 springt zum Reset_Handler
223
;/ Adresse 0x40 wird bei leerem Boot-Block als erster ausfuehrbarer
224
;/ Befehl im internen Flash erreicht
225
                B       Reset_Handler
226
Undef_Handler   B       Undef_Handler
227
SWI_Handler     B       SWI_Handler
228
PAbt_Handler    B       PAbt_Handler
229
DAbt_Handler    B       DAbt_Handler
230
IRQ_Handler     B       IRQ_Handler
231
FIQ_Handler     B       FIQ_Handler
232
233
234
; Reset Handler
235
236
                EXPORT  Reset_Handler
237
Reset_Handler   
238
239
                IF      :DEF:DEBUG
240
                LDR     R0, =0x800 
241
Reset_Catch
242
                SUBS    R0, R0, #1
243
                BNE     Reset_Catch
244
                ENDIF
245
246
247
; Setup External Memory Pins
248
                IF      :DEF:EXTERNAL_MODE
249
                LDR     R0, =PINSEL2
250
                LDR     R1, =PINSEL2_Val
251
                STR     R1, [R0]
252
                ENDIF
253
254
255
; Setup External Memory Controller
256
                IF      EMC_SETUP <> 0
257
                LDR     R0, =EMC_BASE
258
259
                IF      BCFG0_SETUP <> 0
260
                LDR     R1, =BCFG0_Val
261
                STR     R1, [R0, #BCFG0_OFS]
262
                ENDIF
263
264
                IF      BCFG1_SETUP <> 0
265
                LDR     R1, =BCFG1_Val
266
                STR     R1, [R0, #BCFG1_OFS]
267
                ENDIF
268
269
                IF      BCFG2_SETUP <> 0
270
                LDR     R1, =BCFG2_Val
271
                STR     R1, [R0, #BCFG2_OFS]
272
                ENDIF
273
274
                IF      BCFG3_SETUP <> 0
275
                LDR     R1, =BCFG3_Val
276
                STR     R1, [R0, #BCFG3_OFS]
277
                ENDIF
278
279
                ENDIF   ; EMC_SETUP
280
281
282
; Setup VPBDIV
283
                IF      VPBDIV_SETUP <> 0
284
                LDR     R0, =VPBDIV
285
                LDR     R1, =VPBDIV_Val
286
                STR     R1, [R0]
287
                ENDIF
288
289
290
; Setup PLL
291
                IF      PLL_SETUP <> 0
292
                LDR     R0, =PLL_BASE
293
                MOV     R1, #0xAA
294
                MOV     R2, #0x55
295
296
;  Configure and Enable PLL
297
                MOV     R3, #PLLCFG_Val
298
                STR     R3, [R0, #PLLCFG_OFS] 
299
                MOV     R3, #PLLCON_PLLE
300
                STR     R3, [R0, #PLLCON_OFS]
301
                STR     R1, [R0, #PLLFEED_OFS]
302
                STR     R2, [R0, #PLLFEED_OFS]
303
304
;  Wait until PLL Locked
305
PLL_Loop        LDR     R3, [R0, #PLLSTAT_OFS]
306
                ANDS    R3, R3, #PLLSTAT_PLOCK
307
                BEQ     PLL_Loop
308
309
;  Switch to PLL Clock
310
                MOV     R3, #(PLLCON_PLLE:OR:PLLCON_PLLC)
311
                STR     R3, [R0, #PLLCON_OFS]
312
                STR     R1, [R0, #PLLFEED_OFS]
313
                STR     R2, [R0, #PLLFEED_OFS]
314
                ENDIF   ; PLL_SETUP
315
316
317
; Setup MAM
318
                IF      MAM_SETUP <> 0
319
                LDR     R0, =MAM_BASE
320
                MOV     R1, #MAMTIM_Val
321
                STR     R1, [R0, #MAMTIM_OFS] 
322
                MOV     R1, #MAMCR_Val
323
                STR     R1, [R0, #MAMCR_OFS] 
324
                ENDIF   ; MAM_SETUP
325
326
327
; Memory Mapping (when Interrupt Vectors are in RAM)
328
MEMMAP          EQU     0xE01FC040      ; Memory Mapping Control
329
                IF      :DEF:REMAP
330
                LDR     R0, =MEMMAP
331
                IF      :DEF:EXTMEM_MODE
332
                MOV     R1, #3
333
                ELIF    :DEF:RAM_MODE
334
                MOV     R1, #2
335
                ELSE
336
                MOV     R1, #1
337
                ENDIF
338
                STR     R1, [R0]
339
                ENDIF
340
341
342
; Initialise Interrupt System
343
;  ...
344
345
346
; Setup Stack for each mode
347
348
                LDR     R0, =Stack_Top
349
350
;  Enter Undefined Instruction Mode and set its Stack Pointer
351
                MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
352
                MOV     SP, R0
353
                SUB     R0, R0, #UND_Stack_Size
354
355
;  Enter Abort Mode and set its Stack Pointer
356
                MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
357
                MOV     SP, R0
358
                SUB     R0, R0, #ABT_Stack_Size
359
360
;  Enter FIQ Mode and set its Stack Pointer
361
                MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
362
                MOV     SP, R0
363
                SUB     R0, R0, #FIQ_Stack_Size
364
365
;  Enter IRQ Mode and set its Stack Pointer
366
                MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
367
                MOV     SP, R0
368
                SUB     R0, R0, #IRQ_Stack_Size
369
370
;  Enter Supervisor Mode and set its Stack Pointer
371
                MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
372
                MOV     SP, R0
373
                SUB     R0, R0, #SVC_Stack_Size
374
375
;  Enter User Mode and set its Stack Pointer
376
                MSR     CPSR_c, #Mode_USR
377
                IF      :DEF:__MICROLIB
378
379
                EXPORT __initial_sp
380
381
                ELSE
382
383
                MOV     SP, R0
384
                SUB     SL, SP, #USR_Stack_Size
385
386
                ENDIF
387
388
389
; Enter the C code
390
391
                IMPORT  __main
392
                LDR     R0, =__main
393
                BX      R0
394
395
396
                IF      :DEF:__MICROLIB
397
398
                EXPORT  __heap_base
399
                EXPORT  __heap_limit
400
401
                ELSE
402
; User Initial Stack & Heap
403
                AREA    |.text|, CODE, READONLY
404
405
                IMPORT  __use_two_region_memory
406
                EXPORT  __user_initial_stackheap
407
__user_initial_stackheap
408
409
                LDR     R0, =  Heap_Mem
410
                LDR     R1, =(Stack_Mem + USR_Stack_Size)
411
                LDR     R2, = (Heap_Mem +      Heap_Size)
412
                LDR     R3, = Stack_Mem
413
                BX      LR
414
                ENDIF
415
416
417
                END

Vielen Dank für deine Hilfe!

von (prx) A. K. (prx)


Lesenswert?

Nützt nichts, weil ich nicht erkennen kann wohin er springt. Die 
Adressen - egal ob binär, hex, oktal oder dezimal, aber als Wert nicht 
als Name!!!

von Achim (Gast)


Angehängte Dateien:

Lesenswert?

Sorry ,

anbei die (hoffentlich) richtige Datei.


vielen Dank für deine Hilfe!

von (prx) A. K. (prx)


Lesenswert?

Da stehen immer noch keine Adressen drin, weil die dem Assembler nicht 
bekannt sind:
                       SWI_Addr
                               DCD              SWI_Handler
  254 00000030 00000000

von Achim (Gast)


Angehängte Dateien:

Lesenswert?

so jetzt muss das die richtige sein.

Danke

von (prx) A. K. (prx)


Lesenswert?

Das fängt schon ziemlich schräg an:
   241: 00000000 E59FF019   LDR     PC,[PC,#0x0019]
denn im Assembler-Listing stand dort noch
   241: 00000000 E59FF01C   LDR     PC, Reset_Addr
was mir deutlich besser gefiel.

Jedenfalls macht es sich nicht gut, 32-Bit Daten von einer ungeraden und 
zudem falschen Adresse zu laden. Warum das so heraus kommt, das kann ich 
nicht sagen, diese Entwicklungsumgebung kenne ich nicht.

von Helmut L. (helmi1)


Lesenswert?

>Das fängt schon ziemlich schräg an:
>   241: 00000000 E59FF019   LDR     PC,[PC,#0x0019]

Das wird zum internen Bootloader des LPC gehoeren


>denn im Assembler-Listing stand dort noch
>   241: 00000000 E59FF01C   LDR     PC, Reset_Addr

Und das zu seinem eigenen Programm.

Da funktioniert die umschaltung zwischen Bootloader und eigenes Programm 
nicht.

Schon mal richtig an den Bootloader Pins gemessen ob der Pegel in 
Ordnung ist ?

Gruss Helmi

von (prx) A. K. (prx)


Lesenswert?

Helmut Lenzen schrieb:

>>   241: 00000000 E59FF019   LDR     PC,[PC,#0x0019]
> Das wird zum internen Bootloader des LPC gehoeren

Welchen Sinn sollte es im Bootloader haben, von einer ungeraden Adresse 
zu laden. Hab grad nicht im Kopf, was ein ARM7 dann überhaupt macht.

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.