Forum: Mikrocontroller und Digitale Elektronik STM32F4 BackupSram


von GamerBoy (Gast)


Lesenswert?

Hi

Ich versuche auf den BackupSram des STm32f4 zuzugreifen,
was bisher aber noch nicht geklappt hat. Im Datenblatt/Referenz Manual
sowie bei google konnte ich nichts finden, was mich auf den BKD Sram
zugreifen lässt.
Hier der Codeausschnitt zum Testen. Compilieren und debuggen geht, aber
es werden anscheint weder Daten in den BKD Sram geschrieben noch können
die dann gelesen werden.
1
  PWR_DeInit();
2
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE);
3
  PWR_BackupAccessCmd(ENABLE);
4
  PWR_BackupRegulatorCmd(ENABLE);
5
6
  *(uint32_t*)(BKPSRAM_BASE+0) = ('H'<<24)|('e'<<16)|('l'<<8)|('o');
7
8
  for(unsigned int i=0;i<40000;i++)
9
  {
10
    __asm("NOP");
11
  }
12
13
  uint32_t out_data = *(uint32_t*)(BKPSRAM_BASE+0);

MfG
GamerBoy

von Ralph (Gast)


Lesenswert?

Bei meinem STM32F2 sieht das so aus
1
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
2
  PWR_BackupAccessCmd(ENABLE);
3
  PWR_BackupRegulatorCmd(ENABLE);          // Stromversorgung für Backup-SRAM an
4
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);

von GamerBoy (Gast)


Lesenswert?

Hi,

da liest man Stundenlang Datenblätter und die Standart Lib druch und 
vergisst trotzdem diese Zeile:
1
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);

Danke

MfG
GamerBoy

von GamerBoy (Gast)


Lesenswert?

Ich hoffe, ihr könnt mir nochmal helfen. Ich schaffs einfach nicht, in 
den Ram zu schreiben und draus zu lesen.
1
int main(void)
2
{
3
  SystemInit();
4
5
  RCC_ClocksTypeDef clocks;
6
  RCC_GetClocksFreq(&clocks);
7
8
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE);
9
  PWR_BackupAccessCmd(ENABLE);
10
  PWR_BackupRegulatorCmd(ENABLE);
11
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
12
13
  for(unsigned int i=0;i<40000;i++)
14
  {
15
    __asm("NOP");
16
  }
17
18
  for(uint8_t i=0;i<100;i++)
19
  {
20
    *(__IO uint8_t *)(BKPSRAM_BASE+i) = 'H';
21
  }
22
23
  for(unsigned int i=0;i<40000;i++)
24
  {
25
    __asm("NOP");
26
  }
27
28
  uint8_t out_data[100];
29
  for(uint8_t i=0;i<100;i++)
30
  {
31
    out_data[i] = *(__IO uint8_t *)(BKPSRAM_BASE+i);
32
  }
33
34
    while(1)
35
    {
36
    }
37
}

Was mache ich falsch?

MfG
GamerBoy

von hp-freund (Gast)


Lesenswert?

Du hast zwar eine Warteschleife die hoffentlich nicht wegoptimiert wird, 
kannst aber trotzdem mal testen:
1
  /* Enable BKPRAM Clock */
2
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
3
  
4
  /* Enable the Backup SRAM low power Regulator */
5
  PWR_BackupRegulatorCmd(ENABLE);
6
7
  /* Wait until the Backup SRAM low power Regulator is ready */
8
  while(PWR_GetFlagStatus(PWR_FLAG_BRR) == RESET)
9
  {
10
  }

von GamerBoy (Gast)


Lesenswert?

Ich bleibe in der while Schleife hängen. Optimierung ist deaktiviert.
1
int main(void)
2
{
3
  SystemInit();
4
5
  RCC_ClocksTypeDef clocks;
6
  RCC_GetClocksFreq(&clocks);
7
8
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE);
9
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
10
  PWR_BackupAccessCmd(ENABLE);
11
  PWR_BackupRegulatorCmd(ENABLE);
12
13
  while(PWR_GetFlagStatus(PWR_FLAG_BRR) == RESET)
14
  {
15
  }
16
17
  for(uint8_t i=0;i<100;i++)
18
  {
19
    *(__IO uint8_t *)(BKPSRAM_BASE+i) = 'H';
20
  }
21
22
  for(unsigned int i=0;i<40000;i++)
23
  {
24
    __asm("NOP");
25
  }
26
27
  uint8_t out_data[100];
28
  for(uint8_t i=0;i<100;i++)
29
  {
30
    out_data[i] = *(__IO uint8_t *)(BKPSRAM_BASE+i);
31
  }
32
33
    while(1)
34
    {
35
    }
36
}

von hp-freund (Gast)


Lesenswert?

Hab auch noch experimentiert mit diesem Beispiel ab Zeile 149:
http://tech.munts.com/MCU/Frameworks/ARM/stm32f4/libs/STM32F4xx_DSP_StdPeriph_Lib_V1.0.1/Project/STM32F4xx_StdPeriph_Examples/RTC/BKP_Domain/main.c

Bevor ich damit angefangen hatte zeigte mir debug in eclipse noch den 
Inhalt von Speicher ab BKPSRAM_BASE (0x40024000)

nach Schreibversuchen in den Bereich ließ sich der F4 nicht mal mehr 
flashen.
Erst nach komplett Löschen wieder. Jetzt zeigt mir eclipse in dem 
Bereich nur noch Fragezeichen.

Wenn ich das sehe:
http://www.disca.upv.es/aperles/arm_cortex_m3/curset/STM32F4xx_DSP_StdPeriph_Lib_V1.0.1/html/group___p_w_r___group4.html

fürchte ich das da der Zugriff auf den Bereich doch etwas komplizierter 
ist ...

von hp-freund (Gast)


Lesenswert?

GamerBoy schrieb:
> Ich bleibe in der while Schleife hängen.

Nachdem ich die Breakpoints verändert und ein paar mal debug ausgeführt 
habe, hänge ich jetzt auch drin.

Reicht erstmal für Heute.

von Backus (Gast)


Lesenswert?

Hallo,

ich hänge mich einfach mal an dieses Thema:

Kann man den Backup SRAM beim STM32 nutzen wie eine normale 
Speicherstelle, d.h. beliebig nacheinander Nullen durch Einsen ersetzen 
und umgekehrt, oder kann jede 1 nur ein mal durch eine 0 ersetzt werden 
und danach müsste man einen Lösch-Prozess über die gesamten 4kByte 
durchführen, ehe man eine geschriebene Null durch wieder eine Eins 
ersetzen kann?

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.