Forum: Mikrocontroller und Digitale Elektronik Probleme beim schreiben des Flash (Stellaris ARM LM3S9B92)


von Seb (Gast)


Lesenswert?

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

von Seb (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.