Hallo zusammen,
ich habe mich diese Woche im Schreiben eines Bootloaders für den
Atmega32 probiert. Leider habe ich das Problem, dass meiner Meinung nach
der Bootlader nicht in den Bootloader-Bereich des Flashs geschrieben
wird. Die Einstellungen sollten aber richtig sein. Vielleicht hat einer
von auch eine Idee was ich falsch gemacht bzw. übersehen habe.
Nachfolgende die Daten und ein Auszug aus dem Code.
- Speicheradresse Bootloader bei 0x7000 über Linker mit dem Befehl
"-Ttext=0x7000" gesetzt.
- Bei den Fuse's habe ich "SPIEN", "BOOTRST" und "BOOTSZ" auf 1024 bzw.
2048 Words gesetzt. Daraus ergeben sich für HIGH 0xDA und LOW 0xFF
bzw.
HIGH 0xD8 und LOW 0xFF
Flashvorgang mit Adapter Diamex DX-ISP mittels STK500:
- Fuse's schreiben
- Bootloader flashen
- Applikation flashen
Hier ein Auszug aus dem Bootlaoder:
1 | #include <avr/io.h>
|
2 | #include <avr/boot.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <util/delay.h>
|
5 | #include "uart1.h"
|
6 |
|
7 | //9600 Baud bei F_CPU 16MHz
|
8 | unsigned int baud = 103;
|
9 |
|
10 | void main(void)
|
11 | {
|
12 | unsigned int c=0; /* Empfangenes Zeichen + Statuscode */
|
13 | unsigned char temp, /* Variable */
|
14 | flag=1, /*Flag zum steuern der Endlosschleife*/
|
15 | p_mode=0; /* Flag zum steuern des Programmiermodus */
|
16 | void (*start)( void ) = 0x0000; /* Funktionspointer auf 0x0000 */
|
17 |
|
18 | /* Interrupt Vektoren verbiegen */
|
19 | temp = GICR;
|
20 | GICR = temp | (1<<IVCE);
|
21 | GICR = temp | (1<<IVSEL);
|
22 |
|
23 | /* Einstellen der Baudrate und aktivieren der Interrupts */
|
24 | uart_init(baud);
|
25 | sei();
|
26 |
|
27 | uart_puts("Hallo hier ist der Bootloader\n\r");
|
28 | _delay_ms(1000);
|
29 |
|
30 | do
|
31 | {
|
32 | c = uart_getc();
|
33 | if(c!=0)
|
34 | {
|
35 | switch((unsigned char)c)
|
36 | {
|
37 | case 'q':
|
38 | flag=0;
|
39 | uart_puts("Verlasse den Bootloader!\n\r");
|
40 | break;
|
41 | default:
|
42 | uart_puts("Du hast folgendes Zeichen gesendet: ");
|
43 | uart_putc((unsigned char)c);
|
44 | uart_puts("\n\r");
|
45 | break;
|
46 | }
|
47 | }
|
48 | }
|
49 | while(flag);
|
50 |
|
51 | uart_puts("Springe zur Adresse 0x0000!\n\r");
|
52 | _delay_ms(1000);
|
53 |
|
54 | /* Interrupt Vektoren wieder gerade biegen */
|
55 | temp = GICR;
|
56 | GICR = temp | (1<<IVCE);
|
57 | GICR = temp & ~(1<<IVSEL);
|
58 |
|
59 | /* Rücksprung zur Adresse 0x0000 */
|
60 | start();
|
61 | }
|
Auszug aus der Applikation
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <avr/pgmspace.h>
|
4 | #include <util/delay.h>
|
5 | #include "uart1.h"
|
6 |
|
7 |
|
8 | //9600 Baud bei F_CPU 16MHz
|
9 | unsigned int baud = 103;
|
10 |
|
11 | int main()
|
12 | {
|
13 | unsigned int c;
|
14 | void (*bootloader)( void ) = 0x7000;
|
15 |
|
16 | uart_init(baud);
|
17 | sei();
|
18 |
|
19 | uart_puts("Hier ist das Anwendungsprogramm\n\r");
|
20 |
|
21 | for(;;)
|
22 | {
|
23 | c = uart_getc();
|
24 | if(c!=0)
|
25 | {
|
26 | switch( (unsigned char)c)
|
27 | {
|
28 | case 'b':
|
29 | uart_puts("\n\rSpringe zum Bootloader...");
|
30 | _delay_ms(1000);
|
31 | bootloader();
|
32 | break;
|
33 | default:
|
34 | uart_puts("\n\rDu hast folgendes Zeichen gesendet: ");
|
35 | uart_putc((unsigned char)c);
|
36 | break;
|
37 | }
|
38 | }
|
39 | }
|
40 | return 0;
|
41 | }
|
Vielen Dank für eure Hilfe!
Gruss
Sebastian