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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.