Mit dieser Library kann das interne 4k Byte große Backup-RAM vom STM32F4 benutzt werden um Daten auch bei ausgeschalteter CPU zu speichern.
Dazu muss am Pin 6 der CPU (VBAT) eine externe Batterie angeschlossen werden.
Vorsicht !! Beim Discovery-Modul ist Pin6 über einen 0 Ohm Widerstand (R26) mit VDD verbunden. Dieser R26 muss dann ausgelötet werden, sonnst versorgt die Batterie das ganze Board.
Ich habe “read” und “write” auf 16bit Datenwerte ausgelegt so das in der Summe 2048 Werte im RAM abgelegt werden können (Adr 0×0000 bis 0x07FF)
Benutzte Pins :
1 | VBAT (Pin 6 der CPU) muss an eine externe Batterie |
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : RCC, PWR Benutzte Librarys : keine |
Funktionen :
1 2 3 | ErrorStatus UB_BKP_RAM_Init(void); // zum init vom RAM (und Test ob ok) void UB_BKP_RAM_Write(uint16_t adr, uint16_t wert); // zum schreiben eines 16bit Wertes in das RAM uint16_t UB_BKP_RAM_Read(uint16_t adr); // zum lesen eines 16bit Wertes aus dem RAM |
Beispiel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | //-------------------------------------------------------------- // File : main.c // Datum : 06.09.2013 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.4 // GCC : 4.7 2012q4 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der Backup-RAM-Lib // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_led.h" #include "stm32_ub_bkp_ram.h" int main(void) { ErrorStatus check; uint16_t ram_wert; SystemInit(); // Quarz Einstellungen aktivieren // init der LEDs UB_Led_Init(); // init vom Backup-RAM check=UB_BKP_RAM_Init(); if(check==SUCCESS) { // grüne LED einschalten UB_Led_On(LED_GREEN); // RAM Adresse 0x00 auslesen ram_wert=UB_BKP_RAM_Read(0x00); // test ob Inhalt stimmt if(ram_wert==0x3AC4) { // Inhalt ist richtig UB_Led_On(LED_BLUE); } else { // wenn Inhalt nicht stimmt UB_Led_On(LED_ORANGE); // Adresse 0x00 mit Wert 0x3AC4 beschreiben UB_BKP_RAM_Write(0x00,0x3AC4); } } else { // Fehler UB_Led_On(LED_RED); } while(1) { } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
Geht einfacher und komfortabler:
Linker script:
MEMORY
{
ROM (rx) : ORIGIN = 0×08000000, LENGTH = 1024K
RAM (rwx) : ORIGIN = 0×20000000, LENGTH = 128K
CCRAM (rwx) : ORIGIN = 0×10000000, LENGTH = 64K
BKRAM (rw) : ORIGIN = 0×40024000, LENGTH = 4K
}
/* Backup RAM section */
/* _sibkram = LOADADDR(.bkram); */
.bkram :
{
. = ALIGN(4);
*(.bkram)
*(.bkram*)
. = ALIGN(4);
} >BKRAM
und als Deklaration
#define BKRAM __attribute__((section(“.bkram”)))
int bkramvar BKRAM = 1235;