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

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.