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.