Ik ben bezig met een Olimex lpc-1766stk bordje. Hierop zit een arm cortex-m3 microcontroller. Deze probeer ik dus aan de gang te krijgen.
Nu heb ik dus een simpel stukje c code welke alleen een ledje aanzet en een startup file in assembly. Deze compile ik met yagarto naar een elf file. Deze elf file converteer ik naar een binair bestand waarin ik in een hex-editor de benodigde checksum inzet.
Deze file zet ik via jtag (Olimex ARM-USB-TINY/openocd) in de microcontroller.
Tot zover gaat het allemaal goed.
Maar wanneer ik nu de microcontroller reset komt deze meteen in de HardFault handler.
Het rare is echter dat het wel werkt wanneer ik de microcontroller reset-halt en zelf het geheugen map en het pc-register instel op het start adres. Normaal gesproken zou de ingebouwde bootloader dit doen.
Wanneer ik een breakpoint op de eerste paar instructies zet komt hij al bij de fout voordat een breakpoint bereikt is. Dit deed mij vermoeden dat de fout bij de eerste instructie optreed, als ik het juist begrepen heb bevestigd de volgende log dit:
Nu is de vraag waarom boot hij niet normaal? De dingen die ik handmatig doe wanneer het wel werkt zouden normaal gesproken door de hardware/bootloader gedaan moeten worden. Of zie ik hier iets over het hoofd?
helloworld.elf listing
LPC17xx user manual
Nu heb ik dus een simpel stukje c code welke alleen een ledje aanzet en een startup file in assembly. Deze compile ik met yagarto naar een elf file. Deze elf file converteer ik naar een binair bestand waarin ik in een hex-editor de benodigde checksum inzet.
Deze file zet ik via jtag (Olimex ARM-USB-TINY/openocd) in de microcontroller.
Tot zover gaat het allemaal goed.
Maar wanneer ik nu de microcontroller reset komt deze meteen in de HardFault handler.
code:
1
2
3
4
5
6
7
| > reset JTAG tap: lpc1766.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4) Invalid ACK 0x6 in JTAG-DP transaction lpc17xx -- clearing lockup after double fault target state: halted target halted due to debug-request, current mode: Handler HardFault xPSR: 0x60000003 pc: 0x000000ea msp: 0x10007fe0 |
Het rare is echter dat het wel werkt wanneer ik de microcontroller reset-halt en zelf het geheugen map en het pc-register instel op het start adres. Normaal gesproken zou de ingebouwde bootloader dit doen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| > reset halt JTAG tap: lpc1766.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4) target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x1fff0080 msp: 0x10001ffc // Map het geheugen, zodat de flash op adres 0 begint. > mww 0x400fc040 1 > mdw 0x4 0x00000004: 000000cc // Zet het pc-register naar het begin van de code. > reg pc 0xcc pc (/32): 0x000000CC > resume // Hier gaat het ledje branden zoals de bedoeling is. |
Wanneer ik een breakpoint op de eerste paar instructies zet komt hij al bij de fout voordat een breakpoint bereikt is. Dit deed mij vermoeden dat de fout bij de eerste instructie optreed, als ik het juist begrepen heb bevestigd de volgende log dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| > reset JTAG tap: lpc1766.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4) Invalid ACK 0x6 in JTAG-DP transaction lpc17xx -- clearing lockup after double fault target state: halted target halted due to debug-request, current mode: Handler HardFault xPSR: 0x60000003 pc: 0x000000ea msp: 0x10007fe0 > reg ===== arm v7m registers (0) r0 (/32): 0x00000000 -- knip -- (12) r12 (/32): 0xEEEC2880 (13) sp (/32): 0x10007FE0 (14) lr (/32): 0xFFFFFFF9 (15) pc (/32): 0x000000EA (16) xPSR (/32): 0x60000003 (17) msp (/32): 0x10007FE0 (18) psp (/32): 0x26F2704C -- knip -- > mdw 0x10007FE0 8 0x10007fe0: 00000000 000000cc 00000000 00000000 eeec2880 1fff0d5f 000000cc 60000000 // De een-na-laatste waarde zou hier het pc-register aangeven welke de fout veroorzaakt. // Oftewel het begin van de code, zie vorige log. |
Nu is de vraag waarom boot hij niet normaal? De dingen die ik handmatig doe wanneer het wel werkt zouden normaal gesproken door de hardware/bootloader gedaan moeten worden. Of zie ik hier iets over het hoofd?
helloworld.elf listing
LPC17xx user manual