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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.