Forum: Mikrocontroller und Digitale Elektronik STM32 Struct ins Flash


von Ma B. (drumstick)


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.

von Steel (Gast)


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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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;

von Ma B. (drumstick)


Lesenswert?

ok, Du hast die uint8_t in eine union verfasst, aber was bedeutet das 
int W; ??

Danke und Gruss

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Da könnte man die ganzen Zähler alle auf einmal auslesen und schneller 
weiter verwenden, z.B. bei Übertragung über CAN oder USB, da die immer 
32-Bit weise gefüttert werden.

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.