{"id":444,"date":"2017-11-24T23:31:37","date_gmt":"2017-11-24T22:31:37","guid":{"rendered":"http:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=444"},"modified":"2017-12-30T19:37:24","modified_gmt":"2017-12-30T18:37:24","slug":"57-virtuelle_eeprom-library-stm32f4","status":"publish","type":"page","link":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/stm32f4\/komplette-library-liste-stm32f4\/57-virtuelle_eeprom-library-stm32f4\/","title":{"rendered":"57-Virtuelle_EEprom-Library (STM32F4)"},"content":{"rendered":"<p><div id=\"nav-below\" class=\"navigation\"><div class=\"nav-previous\"><a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/stm32f4\/komplette-library-liste-stm32f4\/56-usb_hid_host-library-stm32f4\/\" title=\"56-USB_HID_HOST-Library (STM32F4)\"><span class=\"meta-nav\">\u2190<\/span> 56-USB_HID_HOST-Library (STM32F4)<\/a><\/div><\/div><!-- #nav-below --><div id=\"nav-below\" class=\"navigation\"><div class=\"nav-next\"><a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/stm32f4\/komplette-library-liste-stm32f4\/58-backup_ram-library-stm32f4\/\" title=\"58-Backup_RAM-Library (STM32F4)\">58-Backup_RAM-Library (STM32F4) <span class=\"meta-nav\">&rarr;<\/span><\/a><\/div><\/div><!-- #nav-below --><\/p>\n<p>Diese Library emuliert ein EEprom mit dem internem Flash vom STM32F4.<br \/>\nDas erm\u00f6glicht ein permanentes abspeichern von Datenwerten ohne das ein zus\u00e4tzlicher externer Akku angeschlossen sein mu\u00df.<\/p>\n<p>Im H-File muss eingestellt werden, wie gro\u00df das virtuelle EEprom sein soll.<br \/>\nDie Datenbreite betr\u00e4gt 16bit (pro Adresse)<\/p>\n<p>Es gibt eine Funktion zum lesen aus dem \u201cEEprom\u201d und eine zum schreiben.<br \/>\nAls \u00dcbergabeparameter muss die \u201cAdresse\u201d die gelesen\/geschrieben werden soll angegeben werden.<\/p>\n<p>Wichtig !! Der R\u00fcckgabewert ist ein <strong>Signed-INT32<\/strong> damit man Fehler beim lesen\/schreiben erkennen kann. (dann ist der Returnwert kleiner Null)<\/p>\n<p>Die Funktionsweise wird in einer Apllication_note (AN3969) von ST erkl\u00e4rt.<br \/>\nIn kurzen Worten :<br \/>\n1. Zum speichern der Daten werden zwei 16kByte gro\u00dfe Flash-Bl\u00f6cke benutzt<br \/>\n2. Bei jedem \u201cwrite\u201d werden die Daten in einer freien Flash-Zelle gespeichert, zusammen mit der \u201cvirtuellen Adresse\u201d (es werden also 32Bit pro Datensatz belegt)<br \/>\n3. Beim \u201cread\u201d wird der Flash-Block nach dem letzten gespeicherten Datensatz durchsucht<br \/>\nund dieser wird dann zur\u00fcckgegeben.<br \/>\n4. Wenn ein Flash-Block voll ist, werden die aktuellen Daten in den zweiten Block kopiert und der erste Block wird komplett gel\u00f6scht.<\/p>\n<p><strong>Vorsicht !!<\/strong><br \/>\nDas Flash wird angegeben mit 100.000 Schreibzyklen.<br \/>\nRechenbeispiel : Zehn Variabeln werden alle 10ms (100 mal pro Sekunde) in das Flash geschrieben. Mit den beiden 16k Bl\u00f6cken wird damit eine einzelne Zelle alle 8 Sekunden \u00fcberschrieben. Damit w\u00e4re das Flash nach 9 Tagen (24\/7) defekt !!<\/p>\n<p><strong>Benutzte Pins :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">keine<\/pre>\n<p><strong>Voraussetzungen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">Benutzte Module der CooCox-IDE : FLASH\r\nBenutzte Librarys : keine<\/pre>\n<p><strong>Funktionen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">ErrorStatus UB_EE_FLASH_Init(void);                             \/\/ zum initialisieren\r\nint32_t UB_EE_FLASH_Read(uint16_t VirtAddress);                 \/\/ zum lesen aus dem \"EEprom\"\r\nint32_t UB_EE_FLASH_Write(uint16_t VirtAddress, uint16_t Data); \/\/ zum schreiben ins \"EEprom\"<\/pre>\n<p><strong>Beispiel :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">\/\/--------------------------------------------------------------\r\n\/\/ File     : main.c\r\n\/\/ Datum    : 05.09.2013\r\n\/\/ Version  : 1.0\r\n\/\/ Autor    : UB\r\n\/\/ EMail    : mc-4u(@)t-online.de\r\n\/\/ Web      : www.mikrocontroller-4u.de\r\n\/\/ CPU      : STM32F4\r\n\/\/ IDE      : CooCox CoIDE 1.7.4\r\n\/\/ GCC      : 4.7 2012q4\r\n\/\/ Module   : CMSIS_BOOT, M4_CMSIS_CORE\r\n\/\/ Funktion : Demo der virtuellen EEprom Lib\r\n\/\/ Hinweis  : Diese zwei Files muessen auf 8MHz stehen\r\n\/\/              \"cmsis_boot\/stm32f4xx.h\"\r\n\/\/              \"cmsis_boot\/system_stm32f4xx.c\"\r\n\/\/--------------------------------------------------------------\r\n\r\n#include \"main.h\"\r\n#include \"stm32_ub_led.h\"\r\n#include \"stm32_ub_ee_flash.h\"\r\n\r\nint main(void)\r\n{\r\n  ErrorStatus check;\r\n  int32_t ee_wert;\r\n\r\n  SystemInit(); \/\/ Quarz Einstellungen aktivieren\r\n\r\n  \/\/ init der LEDs\r\n  UB_Led_Init();\r\n\r\n  \/\/ init vom virtuellen EEProm\r\n  check=UB_EE_FLASH_Init();\r\n  if(check==SUCCESS) {\r\n    \/\/ gr\u00fcne LED einschalten\r\n    UB_Led_On(LED_GREEN);\r\n\r\n    \/\/ EEprom Adresse 0x00 auslesen\r\n    ee_wert=UB_EE_FLASH_Read(0x00);\r\n    \/\/ test ob Inhalt stimmt\r\n    if(ee_wert==0x3AC4) {\r\n      \/\/ Inhalt ist richtig\r\n      UB_Led_On(LED_BLUE);\r\n    }\r\n    else {\r\n      \/\/ wenn Inhalt nicht stimmt\r\n      UB_Led_On(LED_ORANGE);\r\n      \/\/ Adresse 0x00 mit Wert 0x3AC4 beschreiben\r\n      UB_EE_FLASH_Write(0x00,0x3AC4);\r\n    }\r\n  }\r\n  else {\r\n    \/\/ Fehler\r\n    UB_Led_On(LED_RED);\r\n  }\r\n\r\n  while(1)\r\n  {\r\n\r\n  }\r\n}\r\n<\/pre>\n<p>Hier die Library zum\u00a0<strong>Download :<\/strong><\/p>\n<p><a href=\"http:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2013\/09\/ub_stm32f4_ee_flash_v100.zip\">ub_stm32f4_ee_flash_v100<\/a><\/p>\n<p>Hier der komplette CooCox-Projektordner zum\u00a0<strong>Download :<\/strong><\/p>\n<p><a href=\"http:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2013\/09\/Demo_57_EEprom.zip\">Demo_57_EEprom<\/a><\/p>\n<hr \/>\n<h3 id=\"comments-title\">22 Antworten auf <em>57-Virtuelle_EEprom-Library (STM32F4)<\/em><\/h3>\n<ol class=\"commentlist\">\n<li id=\"li-comment-841\" class=\"comment even thread-even depth-1\">\n<div id=\"comment-841\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/09f8b07c5192e3c3246bda6643995263?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Jan Berg<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">26. September 2013 um 17:24<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Hi,<\/p>\n<p>herzlichen Dank f\u00fcr deine Library, echt genial, das erspart mir in Zukunft kleine Eeproms einzusetzen <img decoding=\"async\" class=\"wp-smiley\" src=\"wp-includes\/images\/smilies\/icon_smile.gif\" alt=\":)\" \/><\/p>\n<p>Hinzuf\u00fcgen m\u00f6chte ich noch, dass f\u00fcr die Benutzung der Library in eigenen Projekten die Link Time Optimization (LTO) in den Linker Optionen deaktiviert werden muss.<\/p>\n<p>Liebe Gr\u00fc\u00dfe,<br \/>\nJan<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<li id=\"li-comment-1114\" class=\"comment odd alt thread-odd thread-alt depth-1\">\n<div id=\"comment-1114\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/1.gravatar.com\/avatar\/bc3e6431f86eceb3a92db925c7394dcb?s=40&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">lungfish<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">5. Dezember 2013 um 10:14<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Vielen Dank f\u00fcr Demo. Ohne passendes Linkerscript \u00fcberschreibt man aber irgendwann den Programmspeicher.<br \/>\nMit einem entsprechenden Linkerscript bekommt man eine<br \/>\nEEPROM-Emulation auf dem F4 sauber mit jeder beliebigen Codegr\u00f6\u00dfe hin:<\/p>\n<p>sector0 (rx) : ORIGIN = 0\u00d708000000, LENGTH = 0\u00d700004000<br \/>\nfeeprom (rx) : ORIGIN = 0\u00d708004000, LENGTH = 0\u00d700008000<br \/>\nrom (rx) : ORIGIN = 0x0800C000, LENGTH = 0\u00d700074000<\/p>\n<p>sector0 enth\u00e4lt nur die Vektoren.<br \/>\nfeeprom enth\u00e4lt Flashseiten 1 und 2.<br \/>\nrom enth\u00e4lt alle anderen Festwerte und liegt in den gro\u00dfen<br \/>\nFlashpages.<\/p>\n<p>Mit diesem Setup kann man mit nur knapp 3x 16kB ein EEPROM emulieren. Ist<br \/>\nbei den F4 meist kein Beinbruch und spart das externe EEPROM.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-1384\" class=\"comment even depth-2\">\n<div id=\"comment-1384\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/28aec8e3f136a5dd4bc232d15a593ffa?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">martin<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">13. Februar 2014 um 16:59<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Hallo lungfish\/admin<\/p>\n<p>Ich kann im Beispielprojetzt keine memory.ld finden in die ich den speicherbereich eintragen kann oder muss ich die Anderungnen in der arm-gcc-link.ld eintragen.<\/p>\n<p>Leider ist mein projekt schon etwas angewachsen und daher muss ich den Speicherbereich freihalten.<\/p>\n<p>bin f\u00fcr jede Hilfe dankbar<br \/>\ngru\u00df<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-1394\" class=\"comment byuser comment-author-admin_ub bypostauthor odd alt depth-3\">\n<div id=\"comment-1394\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">14. Februar 2014 um 20:31<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>um ein eigenes Linker-Script File bei CoIDE zu benutzen, muss bei \u201cConfiguration\/Link\u201d der Haken bei \u201cUse Memory Layout from Memory Window\u201d entfernt werden. Danach liegt ein Linker-Script File im Projekt-Ordern. Dieses kann editiert und bei CoIDE unter \u201cScatter File\u201d wieder eingebunden werden.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-1559\" class=\"comment even depth-2\">\n<div id=\"comment-1559\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/87e4990fedc5a389c686e4fd6771bd11?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">ain<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">16. April 2014 um 00:21<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Damit die L\u00f6sung von lungfish funktioniert, muss mann in der stm32_ub_ee_flash.h Page 0 und 1 auch wirklich auf Sector 1 und 2 Setzten.<\/p>\n<p>#define FLASH_SEKTOR_SIZE ((uint32_t)0\u00d74000) \/\/ 16kByte<br \/>\n#define FLASH_SEKTOR1_START ((uint32_t)0\u00d708004000) \/\/ Sektor_1<br \/>\n#define FLASH_SEKTOR2_START ((uint32_t)0\u00d708008000) \/\/ Sektor_2<br \/>\n\u2026<br \/>\n#define PAGE0_ID FLASH_Sector_1<br \/>\n\u2026<br \/>\n#define PAGE1_ID FLASH_Sector_2<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-1212\" class=\"comment odd alt thread-even depth-1\">\n<div id=\"comment-1212\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/2619f273a6e9c152e3c629e47c5f42f2?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Jim<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">26. Dezember 2013 um 04:27<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Hi<br \/>\nI have tried your virtual EEPROM library and it works great if the program is small enough to fit the first sectors. But when the program size becomes bigger it tends to end up in the sectors that are being used as virtual EEPROM. I have tried changing the linker script as lungfish said but without any luck. I have changed the linker script as follows:<\/p>\n<p>OUTPUT_FORMAT (\u201celf32-littlearm\u201d, \u201celf32-bigarm\u201d, \u201celf32-littlearm\u201d)<br \/>\n\/* Internal Memory Map*\/<br \/>\nMEMORY<br \/>\n{<\/p>\n<p>ram (rwx) : ORIGIN = 0\u00d720000000, LENGTH = 0\u00d700020000<br \/>\nram1 (rwx) : ORIGIN = 0\u00d710000000, LENGTH = 0\u00d700010000<br \/>\nsector0 (rx) : ORIGIN = 0\u00d708000000, LENGTH = 0\u00d700004000<br \/>\nfeeprom (rx) : ORIGIN = 0\u00d708004000, LENGTH = 0\u00d700008000<br \/>\nrom (rx) : ORIGIN = 0x0800C000, LENGTH = 0\u00d700074000<br \/>\n}<\/p>\n<p>_eram = 0\u00d720000000 + 0\u00d700020000;<br \/>\n\/* Section Definitions *\/<br \/>\nSECTIONS<br \/>\n{<\/p>\n<p>.text0 :<br \/>\n{<br \/>\nKEEP(*(.isr_vector))<br \/>\n} &gt;sector0<\/p>\n<p>.text :<br \/>\n{<br \/>\n\/* KEEP(*(.isr_vector .isr_vector.*)) *\/<br \/>\n*(.text .text.* .gnu.linkonce.t.*)<br \/>\n*(.glue_7t) *(.glue_7)<br \/>\n*(.rodata .rodata* .gnu.linkonce.r.*)<br \/>\n} &gt; rom<\/p>\n<p>.ARM.extab :<br \/>\n{<br \/>\n*(.ARM.extab* .gnu.linkonce.armextab.*)<br \/>\n} &gt; rom<\/p>\n<p>__exidx_start = .;<br \/>\n.ARM.exidx :<br \/>\n{<br \/>\n*(.ARM.exidx* .gnu.linkonce.armexidx.*)<br \/>\n} &gt; rom<br \/>\n__exidx_end = .;<\/p>\n<p>. = ALIGN(4);<br \/>\n_etext = .;<br \/>\n_sidata = .;<\/p>\n<p>.data : AT (_etext)<br \/>\n{<br \/>\n_sdata = .;<br \/>\n*(.data .data.*)<br \/>\n. = ALIGN(4);<br \/>\n_edata = . ;<br \/>\n} &gt; ram<\/p>\n<p>\/* .bss section which is used for uninitialized data *\/<br \/>\n.bss (NOLOAD) :<br \/>\n{<br \/>\n_sbss = . ;<br \/>\n*(.bss .bss.*)<br \/>\n*(COMMON)<br \/>\n. = ALIGN(4);<br \/>\n_ebss = . ;<br \/>\n} &gt; ram<\/p>\n<p>\/* stack section *\/<br \/>\n.co_stack (NOLOAD):<br \/>\n{<br \/>\n. = ALIGN(8);<br \/>\n*(.co_stack .co_stack.*)<br \/>\n} &gt; ram<\/p>\n<p>. = ALIGN(4);<br \/>\n_end = . ;<br \/>\n}<\/p>\n<p>Anyone having any idea why it\u2019s not working?<br \/>\nHere is a link to my cocox project: <a href=\"..\/..\/dl.dropboxusercontent.com\/u\/10684755\/STM32F4_Discovery_CoOS%20eeprom%20test.html\" rel=\"nofollow\">https:\/\/dl.dropboxusercontent.com\/u\/10684755\/STM32F4_Discovery_CoOS%20eeprom%20test.rar<\/a><\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<li id=\"li-comment-1280\" class=\"comment even thread-odd thread-alt depth-1\">\n<div id=\"comment-1280\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/1.gravatar.com\/avatar\/b894d67379dd0647dd316009f47155d2?s=40&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Joerg<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">17. Januar 2014 um 22:50<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Funktioniert die Lib auch mit dem 429 ohne \u00c4nderungen?<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-1283\" class=\"comment byuser comment-author-admin_ub bypostauthor odd alt depth-2\">\n<div id=\"comment-1283\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">18. Januar 2014 um 17:19<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>bin mir nicht ganz sicher aber wahrscheinlich schon.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-1407\" class=\"comment even thread-even depth-1\">\n<div id=\"comment-1407\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/28aec8e3f136a5dd4bc232d15a593ffa?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">martin<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">19. Februar 2014 um 12:49<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Hallo admin_ub,<\/p>\n<p>ich wollt nur kurz berichten hab dein Programm jetzt implementiert allerdings nutze ich sectro 10 und 11 um genug platz zu lassen f\u00fcr den Programmcode. Leider funktioniert der tip von lungfish mit<br \/>\nsector0 (rx) : ORIGIN = 0\u00d708000000, LENGTH = 0\u00d700004000<br \/>\nfeeprom (rx) : ORIGIN = 0\u00d708004000, LENGTH = 0\u00d700008000<br \/>\nrom (rx) : ORIGIN = 0x0800C000, LENGTH = 0\u00d700074000<br \/>\nbei mir nicht. Vermute der linker erkennt es nicht richtig.<br \/>\nweshalb ich es so umgesetzt habe:<br \/>\nrom (rx) : ORIGIN = 0\u00d708000000, LENGTH = 0x000C0000<br \/>\nrom1 (rx) : ORIGIN = 0x080C0000, LENGTH = 0\u00d700040000<\/p>\n<p>Mir ist immer noch nicht ganz klar wie es sich richtig geh\u00f6rt aber es<br \/>\nfunktioniert erst mal.<\/p>\n<p>Komplement du machst hier tolle Arbeit!<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<li id=\"li-comment-1878\" class=\"comment odd alt thread-odd thread-alt depth-1\">\n<div id=\"comment-1878\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/1.gravatar.com\/avatar\/b2b0b82f80a9733557fde98d15b989f3?s=40&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Erat<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">16. Juni 2014 um 18:19<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Hallo,<\/p>\n<p>was ist denn der funktionale Unterschied zur flash-eeprom Implementierung von ST? Der Code scheint mir sehr \u00e4hnlich. Gibt es inhaltliche Unterschiede au\u00dfer Namen, Kommentare und Formatierung? Was war der Grund f\u00fcr deine Neuimplementierung?<\/p>\n<p>Danke<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-1881\" class=\"comment byuser comment-author-admin_ub bypostauthor even depth-2\">\n<div id=\"comment-1881\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">17. Juni 2014 um 17:41<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>es gibt keinen Unterschied\u2026das ist der Code von ST. Nur als Library \u201cverpackt\u201d\u2026soll bedeuten : die Funktionen liegen nicht alle im Main.c Quellcode<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-1889\" class=\"comment odd alt depth-3\">\n<div id=\"comment-1889\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/1.gravatar.com\/avatar\/b2b0b82f80a9733557fde98d15b989f3?s=40&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Erat<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">18. Juni 2014 um 14:57<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Ok, danke f\u00fcr die Info. Ich bin gerade an einem code review, weil wir den Fall hatten, dass pl\u00f6tzlich alle Variablen aus dem Flash gel\u00f6scht waren.<br \/>\nWie es scheint, ist es mit diesem Code m\u00f6glich, dass abh\u00e4ngig vom Power Off Zeitpunkt die beiden Flash Pages in einem unerlaubten Zustand sind, und das f\u00fchrt dazu, dass sie beim n\u00e4chsten Start (dh UB_EE_Flash_Init()) gnadenlos neu formatiert, dh gel\u00f6scht werden.<\/p>\n<p>Die erste solche Stelle ist in Zeile 111: bei Power off nach Ausf\u00fchrung dieser Zeile sind beide pages als VALID markiert, was ein ung\u00fcltiger Zustand ist. Man m\u00fcsste die Reihenfolge umdrehen: zuerst l\u00f6schen und dann VALID markieren.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-1890\" class=\"comment even depth-4\">\n<div id=\"comment-1890\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/1.gravatar.com\/avatar\/b2b0b82f80a9733557fde98d15b989f3?s=40&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Erat<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">18. Juni 2014 um 19:37<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>P. S. Siehe auch: <a href=\"https:\/\/my.st.com\/public\/STe2ecommunities\/mcu\/Lists\/STM32Java\/Flat.aspx?RootFolder=%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fSTM32Java%2fBug%20%28possible%20data%20loss%29%20in%20STM32F4xx_EEPROM_Emulation%20%28AN3969%29\" rel=\"nofollow\">https:\/\/my.st.com\/public\/STe2ecommunities\/mcu\/Lists\/STM32Java\/Flat.aspx?RootFolder=%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fSTM32Java%2fBug%20%28possible%20data%20loss%29%20in%20STM32F4xx_EEPROM_Emulation%20%28AN3969%29<\/a><\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-1892\" class=\"comment byuser comment-author-admin_ub bypostauthor odd alt depth-5\">\n<div id=\"comment-1892\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">19. Juni 2014 um 09:33<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Danke f\u00fcr den Hinweis, wie h\u00e4ufig kommt es zu diesem Fehler ?<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<li id=\"li-comment-1895\" class=\"comment even depth-5\">\n<div id=\"comment-1895\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/1.gravatar.com\/avatar\/b2b0b82f80a9733557fde98d15b989f3?s=40&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Erat<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">19. Juni 2014 um 15:35<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Bis jetzt ist es in meinen Tests in etwa zwei Monaten zwei mal vorgekommen, dass ein Exemplar unerkl\u00e4rlich seine ganzen Settings verloren hatte. Ob das dieser Bug war oder noch was anderes, weiss niemand \u2013 aber die Wahrscheinlichkeit, dass genau in diesem Moment ein Power Off passiert, halte ich an sich f\u00fcr sehr klein. Von daher f\u00fcrchte ich, dass es noch einen andere Ursache f\u00fcr gel\u00f6schtes Flash-EEPROM geben k\u00f6nnte\u2026<\/p>\n<p>Ich habe zus\u00e4tzlich zur \u00c4nderung der o. g. Reihenfolge (l\u00f6schen \u2013 markieren) auch noch die automatische Formatierung des Flash entfernt in allen F\u00e4llen au\u00dfer wenn beide Bl\u00f6cke EE_ERASED sind. Das letztere ist der einzige legitime Grund neu zu formatieren, n\u00e4mlich bei einem neuen (leeren) Controller beim ersten Start der Firmware.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-2310\" class=\"comment odd alt thread-even depth-1\">\n<div id=\"comment-2310\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/a616ce8cfda6e1c8531e134f062b4621?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Dominik<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">11. Oktober 2014 um 19:43<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Hallo<\/p>\n<p>Ich habe das Flash folgendermassen konfiguriert:<br \/>\n#define EE_FLASH_MAX_ADR 400<\/p>\n<p>\/\/\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2013<br \/>\n\/\/ Spannung der CPU muss zwischen 2.7V und 3.6V liegen<br \/>\n\/\/\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2013<br \/>\n#define VOLTAGE_RANGE (uint8_t)VoltageRange_3<\/p>\n<p>\/\/\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2013<br \/>\n\/\/ Adressen der beiden Pages<br \/>\n\/\/ benutzt werden zwei Sektoren im Flash<br \/>\n\/\/ die beiden Sektoren muessen gleich gross sein<br \/>\n\/\/ -&gt; Adressen und Groesse siehe (Referenz-Manual Seite 61)<br \/>\n\/\/\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2013<br \/>\n#define FLASH_SEKTOR_SIZE ((uint32_t)0\u00d74000) \/\/ 16kByte<br \/>\n#define FLASH_SEKTOR2_START ((uint32_t)0\u00d708020000) \/\/ Sektor_2<br \/>\n#define FLASH_SEKTOR3_START ((uint32_t)0\u00d708024000) \/\/ Sektor_3<\/p>\n<p>Die Linker Config ist f\u00fcr ROM Start = 0\u00d708000000 und End = 0x080FFFFF<\/p>\n<p>Ich arbeite mit der IAR Embedded Workbench.<br \/>\nBeim Aufruf der Funktion check=UB_EE_FLASH_Init(); erhalte ich ERROR, vorher mit dieser Einstellung:<br \/>\n-#define FLASH_SEKTOR2_START ((uint32_t)0\u00d708008000) \/\/ Sektor_2<br \/>\n-#define FLASH_SEKTOR3_START ((uint32_t)0x0800C000) \/\/ Sektor_3<\/p>\n<p>hat es immer geklappt. Jetzt ist mein Code aber gr\u00f6sser und ich muss den Bereich schieben, aber es funktioniert nicht, warum?<\/p>\n<p>Danke<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-2315\" class=\"comment byuser comment-author-admin_ub bypostauthor even depth-2\">\n<div id=\"comment-2315\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">12. Oktober 2014 um 10:12<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>wenn du statt Sektor 2+3 die Sektoren 5+6 benutzen willst (die sind 128k gro\u00df) und kann man auch nicht kleiner einstellen :<br \/>\n<code><br \/>\n#define FLASH_SEKTOR_SIZE    ((uint32_t)0x20000)     \/\/ 128kByte<br \/>\n#define FLASH_SEKTOR5_START  ((uint32_t)0x08020000) \/\/ Sektor_5<br \/>\n#define FLASH_SEKTOR6_START  ((uint32_t)0x08040000) \/\/ Sektor_6<\/code><\/p>\n<p>\/\/&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n\/\/ Page-0<br \/>\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n#define PAGE0_BASE_ADDRESS ((uint32_t)(FLASH_SEKTOR5_START))<br \/>\n#define PAGE0_END_ADDRESS ((uint32_t)(PAGE0_BASE_ADDRESS + (FLASH_SEKTOR_SIZE &#8211; 1)))<br \/>\n#define PAGE0_ID FLASH_Sector_5<\/p>\n<p>\/\/&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n\/\/ Page-1<br \/>\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n#define PAGE1_BASE_ADDRESS ((uint32_t)(FLASH_SEKTOR6_START))<br \/>\n#define PAGE1_END_ADDRESS ((uint32_t)(PAGE1_BASE_ADDRESS + (FLASH_SEKTOR_SIZE &#8211; 1)))<br \/>\n#define PAGE1_ID FLASH_Sector_6<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-4031\" class=\"comment odd alt thread-odd thread-alt depth-1\">\n<div id=\"comment-4031\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/2a234226734164d889af8d486d1a5c0d?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Jens<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">3. August 2015 um 13:42<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Hallo,<br \/>\nimmer wenn ich \u201cUB_EE_FLASH_Init();\u201d in meinem Programm aufrufe, bleibt das Programm beim Debuggen hier stehen. Ich habe die Adresse wie hier beschrieben ge\u00e4ndert,da mein Programm etwas gr\u00f6\u00dfer ist. An dieser Stelle ist noch frei.<\/p>\n<p>#define FLASH_SEKTOR2_START ((uint32_t)0x08036D00) \/\/ Sektor_2<br \/>\n#define FLASH_SEKTOR3_START ((uint32_t)0x0803AD12) \/\/ Sektor_3<\/p>\n<p>Was muss ich alles beachten, wenn ich diese Bereiche verschieben m\u00f6chte?<br \/>\nUnd wo finde ich dieses \u201cReferenz Manual Seite 61\u2033?<br \/>\n\/\/\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2013<br \/>\n\/\/ Adressen der beiden Pages<br \/>\n\/\/ benutzt werden zwei Sektoren im Flash<br \/>\n\/\/ die beiden Sektoren muessen gleich gross sein<br \/>\n\/\/ -&gt; Adressen und Groesse siehe (Referenz-Manual Seite 61)<br \/>\n\/\/\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2013<\/p>\n<p>Vielen Dank und viele Gr\u00fc\u00dfe<br \/>\nJens<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-4036\" class=\"comment byuser comment-author-admin_ub bypostauthor even depth-2\">\n<div id=\"comment-4036\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">4. August 2015 um 14:25<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>das Referenz Manual gibts bei ST als download und die Seitenzahl<br \/>\nist nur eine Info und kann bei einer anderen Version vom Manual abweichen.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-4397\" class=\"comment odd alt thread-even depth-1\">\n<div id=\"comment-4397\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/8ee1edc4df18d1afd12eb0c4c8a55091?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Christian<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">27. November 2015 um 11:52<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Gibt es denn inzwischen ein Linkerscript, welches die verwendeten Sektoren f\u00fcr die Codeerzeugung ausspart? Mein Projekt b\u00fcgelt da mit 100kb locker \u00fcber die beiden Sektoren dr\u00fcber. Aber es muss doch eine M\u00f6glichkeit geben, dass der Linker genau diese beiden Bl\u00f6cke ausspart.<\/p>\n<p>Das Manual ist heute Seite 71, dort ist die Tabelle mit den Adressen.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-4407\" class=\"comment byuser comment-author-admin_ub bypostauthor even depth-2\">\n<div id=\"comment-4407\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">28. November 2015 um 13:16<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>versuch das hier :<\/p>\n<pre lang=\"c\" line=\"1\">OUTPUT_FORMAT (\"elf32-littlearm\", \"elf32-bigarm\", \"elf32-littlearm\")\r\n\r\n\/* changed for Lib : stm32_ub_ee_flash *\/ \r\n\r\n\/* Internal Memory Map*\/\r\nMEMORY\r\n{\r\n\/* rom (rx)  : ORIGIN = 0x08000000, LENGTH = 1024K (original F4) *\/\r\nrom0 (rx) : ORIGIN = 0x08000000, LENGTH = 32K\r\neeprom (rx) : ORIGIN = 0x8008000, LENGTH = 32k \/* Block2+3 = eeprom *\/\r\nrom1 (rx) : ORIGIN = 0x08010000, LENGTH = 960K \r\nram (rwx) : ORIGIN = 0x20000000, LENGTH = 128K\r\nram1 (rwx) : ORIGIN = 0x10000000, LENGTH = 64K\r\n}\r\n\r\n_eram = 0x20000000 + 0x00020000;\r\nSECTIONS\r\n{\r\n.text0 :\r\n{\r\nKEEP(*(.isr_vector))\r\n} &gt; rom0\r\n\r\n.text :\r\n{\r\n*(.text*)\r\n\r\nKEEP(*(.init))\r\nKEEP(*(.fini))\r\n\r\n\/* .ctors *\/\r\n*crtbegin.o(.ctors)\r\n*crtbegin?.o(.ctors)\r\n*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\r\n*(SORT(.ctors.*))\r\n*(.ctors)\r\n\r\n\/* .dtors *\/\r\n*crtbegin.o(.dtors)\r\n*crtbegin?.o(.dtors)\r\n*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\r\n*(SORT(.dtors.*))\r\n*(.dtors)\r\n\r\n*(.rodata*)\r\n\r\nKEEP(*(.eh_fram e*))\r\n} &gt; rom1 \r\n\r\n.ARM.extab : \r\n{\r\n*(.ARM.extab* .gnu.linkonce.armextab.*)\r\n} &gt; rom1 \r\n\r\n__exidx_start = .;\r\n.ARM.exidx :\r\n{\r\n*(.ARM.exidx* .gnu.linkonce.armexidx.*)\r\n} &gt; rom1 \r\n__exidx_end = .;\r\n__etext = .;\r\n\r\n\/* _sidata is used in coide startup code *\/\r\n_sidata = __etext;\r\n\r\n.data : AT (__etext)\r\n{\r\n__data_start__ = .;\r\n\r\n\/* _sdata is used in coide startup code *\/\r\n_sdata = __data_start__;\r\n\r\n*(vtable)\r\n*(.data*)\r\n\r\n. = ALIGN(4);\r\n\/* preinit data *\/\r\nPROVIDE_HIDDEN (__preinit_array_start = .);\r\nKEEP(*(.preinit_array))\r\nPROVIDE_HIDDEN (__preinit_array_end = .);\r\n\r\n. = ALIGN(4);\r\n\/* init data *\/\r\nPROVIDE_HIDDEN (__init_array_start = .);\r\nKEEP(*(SORT(.init_array.*)))\r\nKEEP(*(.init_array))\r\nPROVIDE_HIDDEN (__init_array_end = .);\r\n\r\n. = ALIGN(4);\r\n\/* finit data *\/\r\nPROVIDE_HIDDEN (__fini_array_start = .);\r\nKEEP(*(SORT(.fini_array.*)))\r\nKEEP(*(.fini_array))\r\nPROVIDE_HIDDEN (__fini_array_end = .);\r\n\r\nKEEP(*(.jcr*))\r\n. = ALIGN(4);\r\n\/* All data end *\/\r\n__data_end__ = .;\r\n\r\n\/* _edata is used in coide startup code *\/\r\n_edata = __data_end__;\r\n} &gt; ram \r\n\r\n.bss :\r\n{\r\n. = ALIGN(4);\r\n__bss_start__ = .;\r\n_sbss = __bss_start__;\r\n*(.bss*)\r\n*(COMMON)\r\n. = ALIGN(4);\r\n__bss_end__ = .;\r\n_ebss = __bss_end__;\r\n} &gt; ram \r\n\r\n.heap (COPY):\r\n{\r\n__end__ = .;\r\n_end = __end__;\r\nend = __end__;\r\n*(.heap*)\r\n__HeapLimit = .;\r\n} &gt; ram \r\n\r\n\/* .stack_dummy section doesn't contains any symbols. It is only\r\n* used for linker to calculate size of stack sections, and assign\r\n* values to stack symbols later *\/\r\n.co_stack (NOLOAD):\r\n{\r\n. = ALIGN(8);\r\n*(.co_stack .co_stack.*)\r\n} &gt; ram \r\n\r\n\/* Set stack top to end of ram , and stack limit move down by\r\n* size of stack_dummy section *\/\r\n__StackTop = ORIGIN(ram ) + LENGTH(ram );\r\n__StackLimit = __StackTop - SIZEOF(.co_stack);\r\nPROVIDE(__stack = __StackTop);\r\n\r\n\/* Check if data + heap + stack exceeds ram  limit *\/\r\nASSERT(__StackLimit &gt;= __HeapLimit, \"region ram  overflowed with stack\")\r\n} \r\n<\/pre>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-4415\" class=\"comment odd alt thread-odd thread-alt depth-1\">\n<div id=\"comment-4415\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/8ee1edc4df18d1afd12eb0c4c8a55091?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Christian Julius<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">30. November 2015 um 01:27<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Ok, fehlt noch das ram1 (=CCRAM)<\/p>\n<p>\/* CCM-RAM section *\/<br \/>\n_siccram = LOADADDR(.ccram);<br \/>\n.ccram :<br \/>\n{<br \/>\n. = ALIGN(4);<br \/>\n_sccram = .; \/* create a global symbol at ccmram start *\/<br \/>\n*(.ccram)<br \/>\n*(.ccram*)<\/p>\n<p>. = ALIGN(4);<br \/>\n_eccram = .; \/* create a global symbol at ccmram end *\/<br \/>\n} &gt;CCRAM<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Diese Library emuliert ein EEprom mit dem internem Flash vom STM32F4. Das erm\u00f6glicht ein permanentes abspeichern von Datenwerten ohne das ein zus\u00e4tzlicher externer Akku angeschlossen sein mu\u00df. Im H-File muss eingestellt werden, wie gro\u00df das virtuelle EEprom sein soll. Die &hellip; <a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/stm32f4\/komplette-library-liste-stm32f4\/57-virtuelle_eeprom-library-stm32f4\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":144,"menu_order":57,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[128],"tags":[47,9,7],"class_list":["post-444","page","type-page","status-publish","hentry","category-stm32f4","tag-eeprom","tag-library","tag-stm32f4"],"_links":{"self":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-json\/wp\/v2\/pages\/444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-json\/wp\/v2\/comments?post=444"}],"version-history":[{"count":6,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-json\/wp\/v2\/pages\/444\/revisions"}],"predecessor-version":[{"id":1596,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-json\/wp\/v2\/pages\/444\/revisions\/1596"}],"up":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-json\/wp\/v2\/pages\/144"}],"wp:attachment":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-json\/wp\/v2\/media?parent=444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-json\/wp\/v2\/categories?post=444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-json\/wp\/v2\/tags?post=444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}