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
unsignedcharc;
13
unsignedchartemp;
14
15
16
voidprogram_page(uint32_tpage,uint8_t*buf)
17
{
18
uint16_ti;
19
uint8_tsreg;
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_tw=*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
intmain()
52
{
53
uint16_tflash_page=0;
54
55
uint8_tflash_data[SPM_PAGESIZE];
56
uint8_tc;
57
uint8_ttemp;
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
return0;
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
Zum einen löscht er den Speicher nicht, da er in diesem Bereich bereits
auf 0xFF steht.
@Neubi:
Ich habe deinen Code mit minimalen Anpassungen bei mir getestet und habe
leider immernoch das Problem, dass er keine Daten schreibt. Hast du noch
eine Idee, woran das liegen kannß
Sascha Weber schrieb:
< SELFPRGEN Fuse gesetzt ?
SPIEN ist laut den Werten der FUSES gestzt, aber AVR zeigt mir im Reiter
FUSES unter dem Punkt SPIEN ein Häckchen mit kleinem roten Fragezeichen
an.
Sebastian Z. schrieb:> Fuses: 0xDAFF>> Linker: -Ttext=0x7000
Da dein Flash-Write-Code nicht im Bootloader-Bereich liegt (sondern
etwas unterhalb), kann er das Flash auch nicht beschreiben.