Atmega32 Bootloader flashen

OP #2155867
Lesenswert?

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
Gast #2984019
Lesenswert?

Könntest du deinen ATMEGA32 Bootloader bitte ganz veröffentlichen.

Ich habe Probleme mit der UART-LIB von Fleury.
Bei normalen Programmen geht sie gut, wenn ich aber die Startadresse im 
Linker verändere, wird von Controller nichts mehr über die RS232 
gesendet.

Liebe Grüße
Alois
(Firma: fritzler-avr.de) #2984046
Lesenswert?

Alois schrieb:
> wenn ich aber die Startadresse im
> Linker verändere, wird von Controller nichts mehr über die RS232
> gesendet.

Musst den Interruptvektor noch umbiegen ;)
(IVSEL)
1
void Move_interrupts(void)
2
{
3
/* Enable change of interrupt vectors */
4
GICR = (1<<IVCE);
5
/* Move interrupts to boot Flash section */
6
GICR = (1<<IVSEL);
7
}

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