STK500v2 Bootloader auf AT90CAN32

Gast #2329005
Lesenswert?
• ▲
▼
Hallo,

ich versuche gerade seit Stunden Peter Fleury's stk500v2 Bootloader auf 
meinen AT90CAN32 zu bringen.

Ich habe den Bootloader dem Chip entsprechend abgeändert (s.u) und kann 
ihn auch in die Bootloader-section vom Chip flashen (mit einem 
usbasp-programmer).
Wenn ich jedoch über den STK500-Bootloader eine hex-Datei übertrage, 
meckert avrdude:
1
verification error, first mismatch at byte 0x0000
2
0x0c != 0x8f

Wenn ich danach den Inhalt des Chips mit dem usbasp-Programmer auslese, 
enthält die hex-datei nur den Bootloader (ca. 1200 bytes).
Es scheint also so als würde der Bootloader überhaupt nichts schreiben.

Ich habe das Programm folgendermaßen angepasst:
Makefile:
1
MCU = at90can32
2
F_CPU = 16000000
3
BOOTLOADER_ADDRESS = 7C00

main.c
1
#define REMOVE_BOOTLOADER_LED
2
#define ENABLE_LEAVE_BOOTLADER
3
#define USE_USART1
4
#define BAUDRATE 115200
5
#define UART_BAUDRATE_DOUBLE_SPEED 1
6
#define BOOTSIZE 512
Außerdem habe ich noch die Signatur des Chips eingefügt und das erste 
if, in dem normalerweise der PROG_PIN abgefragt wird, "überbrückt" (also 
if(1) { ... } ).

Wenn ich das so kompiliere, kommt der Fehler:
1
illegal opcode elpm for mcu at90can32

Um diesen Fehler zu umgehen füge ich noch nach den includes
1
#undef RAMPZ
ein, damit pgm_read_word_near statt pgm_read_word_far verwendet wird.

Danach mache ich folgendes:
1) Bootloader kompilieren
2) Chip löschen (per usbasp)
3) Bootloader flashen (per usbasp)
4) Lockbits auf 0x0F setzen (per usbasp)
5) Testprogramm flashen (per stk500v2boot) -> verification error
6) Chip lesen (per usbasp) -> Leer, bis auf den Bootloader

Meine Fuses sind folgendermaßen eingestellt:
Keine Brown-Out detection
JTAG enabled
SPI enabled
Boot Flash size = 512 words
Boot Reset vector enabled
Ext. Crystal 8-16MHz 1K CK + 65ms (16MHz sind bestückt)

Ich bin für alle Vorschläge dankbar :-)

Bei Bedarf kann ich auch Sources und Makefiles posten.
#2331301
Lesenswert?
• ▲
▼
Ich habe jetzt mal das Tutorial 
AVR Bootloader in C - eine einfache Anleitung durchgearbeitet und da 
hat alles funktioniert (UART, Flash-pages beschreiben).

Anscheinend lag mein Problem an den Linker-Flags:

Im Original Sourcecode von Peter Fleury ist der section-start 
folgendermaßen angegeben:
1
--section-start=.text=$(BOOTLOADER_ADDRESS)

ich hatte das auf
1
--section-start=.bootloader=$(BOOTLOADER_ADDRESS)
abgeändert, da es sonst beim flashen auf einen AT90CAN128 einen 
out-of-range error erzeugte.

Jetzt habe ich es (wie im tutorial) auf
1
-Ttext=$(BOOTLOADER_ADDRESS)
abgeändert und siehe da - es funktioniert.

Testweise hab ich es wieder auf
1
--section-start=.text=$(BOOTLOADER_ADDRESS)
zurückgeändert und jetzt gehts auch damit (jedenfalls am AT90CAN32).

das
1
#undef RAMPZ
hab ich auch wieder entfernt und dafür einfach im code die drei
1
#if defined(RAMPZ)
entfernt (und jeweils die else-cases aufgehoben).

Ich glaube das Grundproblem war, dass Peter Fleury auf MCUs mit einem 
Flash >64kb überprüft indem er checkt ob RAMPZ definiert ist.
Bei einem AT90CAN32/64 existiert das Register RAMPZ zwar, wird aber 
nicht verwendet, da <=64kb verbaut sind (Siehe Datasheet S13).

Lange Rede - kurzer Sinn:
Es wäre sinnvoll
1
#if defined(RAMPZ)
durch
1
#if FLASHEND>0xFFFF
zu ersetzen, dann funktionierts auch mit AT90CAN32/64.

Liebe Grüße

Niko

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren