STM32F4 BackupSram

Gast #3031239
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
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
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
Gast
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.