STM32 Struct ins Flash

OP #2997183
Lesenswert?

Guten Morgen!

Ich arbeite mit dem STM32F103VDT6 und dem uVision von Keil.

Ich habe festgestellt, dass meine Funktion die Daten ins Flash speichert 
doch nicht ganz funktioniert.

So sieht mein  Struct aus:
1
typedef struct  {
2
                  uint8_t             CntCal;
3
                  int                 ShttrueIdx[CNTSHT];
4
                  uint8_t             Nmbr_of_Shttr;
5
                  uint8_t             Nmbr_of_ShttrPart;
6
                  uint8_t             CntsofWings;
7
                  int                 MotDir;
8
                  int                 MotDistCntVal;
9
                  int                 MotDistCal_PulsesMax;
10
                  int                 MotDistShttrPoints[6];
11
                  BOOL                cal_OK;
12
                }
13
                tSetup2;

BOOL ist als unsigned int definiert!

So sieht meine Funktion aus:
1
void set_in_Flash(tSetup2 *setup)
2
{
3
  uint32_t *pData = (uint32_t *)setup;
4
  uint8_t i;
5
  int x = (sizeof(tSetup2) / sizeof(int));
6
  
7
  FLASH_Unlock();
8
  FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR |  FLASH_FLAG_WRPRTERR);
9
  FLASH_ErasePage(FLSHBSEADRPG192);
10
   for(i=0;i<x;i++)
11
  {
12
     FLASH_ProgramWord(FLSHBSEADRPG192 + i*sizeof(uint32_t), pData[i]);
13
  }
14
  FLASH_Lock();
15
  
16
}



Kann mir jemand diese Zeile erklären?:
1
FLASH_ProgramWord(FLSHBSEADRPG192 + i*sizeof(uint32_t), pData[i]);

Warum pData[i] und nicht pData? bzw. pData ist ja ein Pointer der auf 
die Adresse von setup zeigt.

Ich wüsste im Moment nicht, wo der Fehler sonst noch sein könnte?!


Vielen Dank und Grüsse

M.B.
Gast #2997186
Lesenswert?

Das hat schon seine Richtigkeit, das i-te 32-Bit Wort aus dem 
Datenbereich mit der Anfangsadresse pData wird in den Flashbereich mit 
Anfangsadresse FLSHBSEADRPG192 plus i*4Byte kopiert.

Sehe da keinen Fehler.

Den struct sollte man "packed" machen, damit der Compiler keine 
Füllbytes einfügt und man sollte darauf achten, dass er vielfache von 32 
Bit lang ist.
(Firma: EleLa - www.elela.de) #2997199
Lesenswert?

Ich würde die Struct eher so anordnen (weiß grad die korrekte Syntax 
nicht auswendig, aber so ähnlich):
1
typedef struct  {
2
union {
3
int W;
4
struct{
5
                  uint8_t             CntCal;
6
                  uint8_t             Nmbr_of_Shttr;
7
                  uint8_t             Nmbr_of_ShttrPart;
8
                  uint8_t             CntsofWings: 7;
9
                  uint8_t             cal_OK: 1;
10
};
11
};
12
                  int                 MotDir;
13
                  int                 MotDistCntVal;
14
                  int                 MotDistCal_PulsesMax;
15
                  int                 MotDistShttrPoints[6];
16
                  int                 ShttrueIdx[CNTSHT];
17
                }
18
                tSetup2;

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