STM32F4 BackupSram

Gast #3031239
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
Gast #3032279
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);
Gast #3035023
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
Gast #3035080
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
  }
Gast #3035166
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
}
Gast #3035268
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 ...
Gast #5117185
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?

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