Forum: Mikrocontroller und Digitale Elektronik STM32 internen FLASH schreiben


von Mape (Gast)


Lesenswert?

Ich verwende beim STM32F103VB die FLASH-Schreibbefehle und
habe die STM PM0075-Dokumentation schon hoch und runtergelesen.
Der Flash bleibt leer.
------------------------------------------------
1
#include "stm32f10x.h"       //this file is from the STM CMSIS folder
2
3
u16* Address;
4
5
RCC->CR |= RCC_CR_HSION;      //HSI clock must be on
6
  sleep(3);
7
  printf("FLASH->WRPR: 0x%04x, FLASH->OBR: 0x%04x, RCC->CR: 0x%08x\n",FLASH->WRPR,FLASH->OBR,RCC->CR);
8
9
FLASH_Unlock();               //write unlock keys
10
FLASH->CR |= FLASH_CR_PG;     //enable programming
11
  Address =(u16 *)0x800F004;  //128kbyte Flash
12
  printf("wr: Addr: 0x%08x (0x%04x)\n", (int)Address,0x1234);
13
*Address=(u16)0x1234;         //ASM: "strh ()" half word access!
14
  sleep(10);
15
16
  printf("FLASH->SR: 0x%04x, FLASH->CR: 0x%04x\n",FLASH->SR,FLASH->CR);
17
  printf("rd: Addr: 0x%08x (0x%04x)\n", (int)Address,*Address);
18
FLASH->CR &= ~FLASH_CR_PG;
------------------------------------------------
Ausgabe:
FLASH->WRPR: 0xFFFFFFFF, FLASH->OBR: 0x3FFFFFC, RCC->CR: 0x03035883
wr: Addr: 0x0800F004 (0x1234)
FLASH->SR: 0x0020, FLASH->CR: 0x0001
rd: Addr: 0x0800F004 (0xFFFF)

Bedeutung:
Zeile1 sagt "no write protection"
Zeile3 sagt "unlocked, writing was successfull"
Zeile4 aber die Zelle ist leer!


Beim Arduino-Mapleboard funktioniert die entsprechende Library tadellos.
Bei mir fehlt noch irgendeine Vorbedingung, irgendein Register.
Weiß jemand, welches?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ich benutze dazu die EEPROM library :
1
#include "eeprom.h"
2
ErrorStatus  HSEStartUpStatus;
3
FLASH_Status FlashStatus;
4
uint16_t VarValue = 0;
5
/* Virtual address defined by the user: 0xFFFF value is prohibited */
6
uint16_t VirtAddVarTab[NumbOfVar] = {0x5555, 0x6666, 0x7777};
7
uint16_t ErrValue = 0;
8
// now lets initialize the EEPROM Emulation and read in our variables
9
void EEPROMInit(void)
10
{
11
uint16_t chksum = 0;
12
  ErrValue = EE_ReadVariable(ee_DEAD_TIME_HALF,(uint16_t*)&DEAD_TIME_HALF);
13
  ErrValue = EE_ReadVariable(ee_motor_fwd_commutation,(uint16_t*)&motor_fwd_commutation);
14
  ErrValue = EE_ReadVariable(ee_motor_rev_commutation,(uint16_t*)&motor_rev_commutation);
15
  ErrValue = EE_ReadVariable(ee_checksum,&chksum);
16
// global error flag
17
  if ((chksum != CalcChecksum()) || ErrValue ) error |= ERR_EEPROM;
18
}
19
// write values to EEPROM
20
void EEPROMWrite(void)
21
{
22
  /* Unlock the Flash Program Erase controller */
23
  FLASH_Unlock();
24
  /* EEPROM Init */
25
  ErrValue = EE_Init();
26
// now write our bytes
27
  ErrValue = EE_WriteVariable(ee_DEAD_TIME_HALF,DEAD_TIME_HALF);
28
  ErrValue = EE_WriteVariable(ee_motor_fwd_commutation,motor_fwd_commutation);
29
  ErrValue = EE_WriteVariable(ee_motor_rev_commutation,motor_rev_commutation);
30
// finally write our checksum
31
  ErrValue = EE_WriteVariable(ee_checksum,CalcChecksum());
32
// Clear any EEPROM Error
33
  error &= ~(ERR_EEPROM);
34
}
Ich benutze Konstanten als Addressen,ymmv.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ich bins nochmal. Die EEPROM Library findet sich in der STM AN2594 - 
"AN2594_FW_V3.1.0" in meinem Fall.

von Star K. (starkeeper)


Lesenswert?

Nur weil du den Flash entsperrst kannst du noch lange nicht wie bei 
einem RAM darauf schreiben. Benutze doch einfach die FLASH-Befehle der 
ST-Periph-Library und schon wird sich dein Problem lösen. Oder schaue 
doch einfach mal dort rein, welche Bits du noch setzt/rücksetzen und 
abfragen musst bevor du wirklich was schreiben kannst.

Letztlich sehe ich bei dir nicht, dass du nach dem Unlock auch die 
entsprechende Page löscht bevor du sie wieder beschreibst. Der Unlock 
alleine langt ev. nicht aus.

von Mape (Gast)


Lesenswert?

Danke für die Tipps, aber mein Problem liegt noch weit vor der 
EEPROM-Emulation. Ich kann nichtmal ein Halfword in den Flash schreiben.

Die STM-Libraries habe ich natürlich intensivst durchforstet. Die machen 
exakt das, was oben schon steht, kein Quarz, keine PLL keine andernen 
Register nichts. Der STM32F101VB meldet ja nichtmal einen Schreibfehler, 
wenn die Ziel-Zelle 0xFFFF enthält, - andernfalls meckert er schon.

Auf meiner Plattform nutzen ich IMMER den internen RS232-Bootloader. 
Verändert der etwas, was ein JTAG-Upload nicht verändert?

von Mape (Gast)


Lesenswert?

Gelöst!

Man darf keine -0,6V (Diodenflussspannung) an den /RST pin anlegen. Bei 
-0.3V geht es.

Mein Problem war offenbar ein HW-Problem, das ausschließlich beim 
Programmieren des Flashes auffällt, dem Bootloader aber offenbar nichts 
ausmacht und auch sonst keine Funktion behindert.

Die korrigierte Bootloader-Beschaltung findet Ihr hier:
http://www.firefly-power.de/ARM/sloadhost.html

von Davis (Gast)


Lesenswert?

> Für die Programmierung mit der obigen Beschaltung gibt es ein schönes
> Windows-Programm hier: http://www.er-forum.de

Da wird man zu einem Shop umgeleitet. Hast du den Originallink?

von mcr42 (Gast)


Lesenswert?

Mape schrieb:
> Gelöst!
>
> Man darf keine -0,6V (Diodenflussspannung) an den /RST pin anlegen. Bei
> -0.3V geht es.
>
> Mein Problem war offenbar ein HW-Problem, das ausschließlich beim
> Programmieren des Flashes auffällt, dem Bootloader aber offenbar nichts
> ausmacht und auch sonst keine Funktion behindert.
>
> Die korrigierte Bootloader-Beschaltung findet Ihr hier:
> http://www.firefly-power.de/ARM/sloadhost.html

Sicher, dass der /NRST-Pin gemeint ist?
Die geänderte Schaltung enthält einen Hinweis auf den Boot0-Pin ?!?

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.