Probleme beim schreiben des Flash (Stellaris ARM LM3S9B92)

Gast #2632996
Hi,

ich habe ein Problem beim speichern einiger Programmdaten im Flash. Ich 
möchte verschiedene Programmdaten im Flash meines Controllers speichern 
um diese auch nach einem Spannungsausfall noch auslesen zu können.

Hierfür habe ich eine Funktion in der die Daten in den Flash gespeichert 
werden sollen. Der Speichervorgang läuft durch das beschreiben der 
entsprechenden Register.


Hier meine Funktion zum schreiben der Register:

#define FlASH_FMC_WRKEY 0xA4420000
#define FLASH_FMC_WRITE 0x00000001
#define HWREG(x)
        (*((volatile unsigned long *)(x)))


void BLInternalFlashProgram(unsigned long ulDstAddr, unsigned char 
*pucSrcData, unsigned long ulLength)
{
    unsigned long ulLoop;

    for(ulLoop = 0; ulLoop < ulLength; ulLoop += 4)
    {
        // FMA enthält die Adresse in die geschrieben werden soll
        // FMD die Daten und
        // FMC die Freigabe fürs schreiben

        HWREG(FLASH_FMA) = ulDstAddr + ulLoop;
        HWREG(FLASH_FMD) = *(unsigned long *)(pucSrcData + ulLoop);
        HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_WRITE;

        while(HWREG(FLASH_FMC) & FLASH_FMC_WRITE)
        {
        }
    }
}


Leider funktioniert das schreiben der Register nur bei 2 von 3'en. Das 
Flash Memory Control lässt sich leider nicht schreiben und ich habe 
keine Ahnung warum.

Vielleicht kann mir ja jemand sagen was ich falsch mache oder ob ich zum 
schreiben des FMC noch irgendwelche Bedingungen erfüllen muss.

MFG
Seb
Gast
Ok mein Problem ist gelöst. Ich hatte vergessen den Erase auszuführen.

#define FlASH_FMC_WRKEY 0xA4420000
#define FLASH_FMC_WRITE 0x00000001
#define HWREG(x)
        (*((volatile unsigned long *)(x)))


void BLInternalFlashProgram(unsigned long ulDstAddr, unsigned char
*pucSrcData, unsigned long ulLength)
{
    unsigned long ulLoop;
        HWREG(FLASH_FMA) = ulDstAddr + ulLoop;
        HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | 0x02;

    for(ulLoop = 0; ulLoop < ulLength; ulLoop += 4)
    {
        // FMA enthält die Adresse in die geschrieben werden soll
        // FMD die Daten und
        // FMC die Freigabe fürs schreiben

        HWREG(FLASH_FMA) = ulDstAddr + ulLoop;
        HWREG(FLASH_FMD) = *(unsigned long *)(pucSrcData + ulLoop);
        HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_WRITE;

        while(HWREG(FLASH_FMC) & FLASH_FMC_WRITE)
        {
        }
    }
}

Ich hab den funktionierenden Code mal hier eingefügt falls jemand 
anderes mal bei seiner verzweifelten Suche auf diesen Thread stößt.

MFG

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.