Hallo zusammen,
ich bin gerade dabei einen Bootloader für den ATmega32 zu schreiben.
Aktuell habe ich das Problem, dass er mir den Flash Speicher weder
löscht noch mit Daten beschreibt.
Einstellungen:
Lockbits: 0xFF
Fuses: 0xDAFF
Linker: -Ttext=0x7000
1 | #include <string.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <avr/boot.h>
|
5 | #include <util/delay.h>
|
6 | #include "uart1.h"
|
7 | #include <avr/pgmspace.h>
|
8 |
|
9 | #define UART_BAUD 103
|
10 |
|
11 |
|
12 | unsigned char c;
|
13 | unsigned char temp;
|
14 |
|
15 |
|
16 | void program_page (uint32_t page, uint8_t *buf)
|
17 | {
|
18 | uint16_t i;
|
19 | uint8_t sreg;
|
20 |
|
21 | /* Disable interrupts */
|
22 | sreg = SREG;
|
23 | cli();
|
24 |
|
25 | eeprom_busy_wait ();
|
26 | uart_putc(page);
|
27 | boot_page_erase (page);
|
28 | boot_spm_busy_wait (); /* Wait until the memory is erased. */
|
29 | uart_puts("e");
|
30 | for (i=0; i<SPM_PAGESIZE; i+=2)
|
31 | {
|
32 | /* Set up little-endian word. */
|
33 | uint16_t w = *buf++;
|
34 | w += (*buf++) << 8;
|
35 |
|
36 | boot_page_fill (page + i, w);
|
37 | }
|
38 |
|
39 | boot_page_write (page); /* Store buffer in flash page. */
|
40 | boot_spm_busy_wait(); /* Wait until the memory is written.*/
|
41 |
|
42 | /* Reenable RWW-section again. We need this if we want to jump back */
|
43 | /* to the application after bootloading. */
|
44 | boot_rww_enable ();
|
45 |
|
46 | /* Re-enable interrupts (if they were ever enabled). */
|
47 | SREG = sreg;
|
48 | }
|
49 |
|
50 |
|
51 | int main()
|
52 | {
|
53 | uint16_t flash_page = 0;
|
54 |
|
55 | uint8_t flash_data[SPM_PAGESIZE];
|
56 | uint8_t c;
|
57 | uint8_t temp;
|
58 |
|
59 | temp = MCUCR;
|
60 | GICR = temp | (1<<IVCE);
|
61 | GICR = temp | (1<<IVSEL);
|
62 |
|
63 | //Befüllen des Buffers mit Testdaten für eine Page
|
64 | memset(flash_data, 0x1F, sizeof(flash_data));
|
65 |
|
66 | uart_init(UART_BAUD);
|
67 | sei();
|
68 |
|
69 | uart_puts("Hier ist das Testprogramm zum löschen einer page\n");
|
70 | _delay_ms(2000);
|
71 |
|
72 | do
|
73 | {
|
74 | c = uart_getc();
|
75 |
|
76 | if(c='d')
|
77 | {
|
78 | program_page((uint16_t)flash_page, flash_data);
|
79 | }
|
80 |
|
81 | }
|
82 | while(c!='d');
|
83 | uart_puts("Ende");
|
84 |
|
85 | return 0;
|
86 | }
|
Wenn ich mir das Flashabbild (als iHex) nach dem Ausführen des
Schreibvorganges anschaue, habe ich im Flashbereich 0x0000 bis 0x6FFF
den Wert 0xFF stehen. Ab 0x7000 steht der Code des Bootlaoders.
Hoffe es kann mir jemand von euch weiterhelfen.
Vielen Dank!
Gruss
Sebastian