ATmega32 Flash beschreiben

Gast #356914
Lesenswert?

Hallo,

ich möchte bei meinem ATmega32 den Flash im Betrieb beschreiben um dort
Daten zu speichern. Versuche es mit der Funktion aus dem
avr-libc-user-manual, aber es wird infach nichts in den Flsh
geschrieben, obwohl der Code Problemlos durchläuft.

Irgendwelche Ideen?




Hier das wichtigste aus dem Code:

#define F_CPU 16000000UL
#define UART_BAUD_RATE      56000

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <avr/boot.h>
#include <inttypes.h>
#include "uart.h"


typedef signed char int8_t;
typedef unsigned char uint8_t;

unsigned char adc_in;
unsigned char *sinus = {  0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda,
0xb0, 0x80, 0x4f, 0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f};



void boot_program_page (uint32_t page, uint8_t *buf) {
  uint16_t i;
  uint8_t sreg;

  // Disable interrupts.
  sreg = SREG;
  cli();
  eeprom_busy_wait ();
  boot_page_erase (page);
  boot_spm_busy_wait (); // Wait until the memory is erased.

  for (i=0; i<SPM_PAGESIZE; i+=2) {
  // Set up little-endian word.
    uint16_t w = *buf++;
    w += (*buf++) << 8;
    boot_page_fill (page + i, w);
  }

  boot_page_write (page); // Store buffer in flash page.
  boot_spm_busy_wait(); // Wait until the memory is written.
  // Reenable RWW-section again. We need this if we want to jump back
  // to the application after bootloading.
  boot_rww_enable ();
  // Re-enable interrupts (if they were ever enabled).
  SREG = sreg;
}



Aufruf der Funktion wie folgt: boot_program_page (3200, sinus);

Ich find den Fehler einfach nicht.

MfG
Ralf
Angehängte Dateien:
Gast #356915
Lesenswert?

Abgesehen davon, dass
> unsigned char *sinus = {...};
in meinen Augen zunächst nicht viel Sinn macht (Wofür hier ein Array
von Pointern? Aber vielleicht hab ich den Zusammenhang noch nicht ganz
durchschaut...): Die Deklaration ist falsch. Wenn überhaupt, dann

unsigned char *sinus[] = {...};
Gast #356919
Lesenswert?

Ich hab mich gerade mal weiter informiert.
Ich will mein Prog nun in die Bootloader Section flaschen, aber was
muss ich dazu bei Winavr (linker) --section-start=.text= angeben?
Ich habs mit 0x3800 versucht und dem doppletem (weil Datenblattangabe
ja in words). Bei beidem wird der Code aber nicht ausgeführt. Müsste
eigentlich per UART daten senden.
Ich hab den Auszug aus dem Datenblatt mal angehängt.

Ralf
Angehängte Dateien:
Gast #356920
Lesenswert?

Der Code aus den avr-libc boot-Funktionen zum schreiben (eigentlich
Makros) muss in er "Boot section" abgelegt sein. Flash schreiben aus
der "Application section" ist beim ATmega32 nicht vorgesehen. Man
kann entweder die Schreibfunktionen (mit den "Aufrufen" der
boot-Funktion) in eine extra gcc-section legen (attribute section,
nicht zu verwechseln mit Boot/Application section des AVR) und beim
Linken diese (gcc-)-Section eine Addresse im Boot-Bereich zuweisen
(--section-start...). Wenn die Anwendung klein ist und den die AVR
Boot-Section passt, kann man die gesamte Anwendung (".text") in die
Boot-Section verlagern (so wie bei einem Bootloader).
Vgl. avr-libc Dokumenation FAQ17, binutils/ld-Manual,
Quellcode/Makefiles vom mit der GNU-Toolchain erstellten Bootloadern
(z.B.
http://www.siwawi.arubi.uni-kl.de/avr_projects/index.html#avrprog_boot
)

Martin Thomas
Gast #356921
Lesenswert?

Danke, das hat mir schon sehr geholfen.
Mein Code wird jetzt in der Bootloader section ausgeführt.
Was allerdings immer noch nicht geht ist das beschreiben des Flash, es
wird einfach nichts geschrieben, obwohl keine Lockbits gesetzt sind.
Ich hab auch schon die Funktionen von Martin probiert, aber ohne
erfolg.

Hat das Problem schon mal jemand gehabt?

Ralf
Gast #356922
Lesenswert?

>Hat das Problem schon mal jemand gehabt?

Vermutlich niemand. Liegt wohl daran, dass man in Flash i.d.R. nur
Konstanten speichert. Das EEPROM ist ja eher als Datenspeicher
vorgesehen...

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