STM32 internen FLASH schreiben

Gast #3056684
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?
(Firma: matzetronics) #3056693
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.
#3056803
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.
Gast #3347466
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?
Gast #3348008
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
Gast #3500310
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 ?!?

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