/* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ /* Copyright (c) 2016 King Kévin */ /* this library is used to store (read and write) data in flash */ /* peripherals used: none */ /* standard libraries */ #include // standard integer types #include // general utilities /* STM32 (including CM3) libraries */ #include // device signature utilities #include // flash utilities #include "flash_storage.h" // flash storage library API #include "global.h" // global definitions // the flash page size (medium-density devices have 1KiB page size) #define PAGE_SIZE 1024 /* read data from address
into * returns if read succeeded */ bool storage_read(uint32_t address, uint8_t *buffer, size_t size) { // verify it's in the storage area if (addressSTORAGE_END) { return false; } if (buffer==NULL || size==0) { return false; } // copy data byte per byte // a more efficient way would be to copy words, than the remaining bytes for (size_t i=0; i data from to address
* returns if write succeeded */ bool storage_write(uint32_t address, uint8_t *buffer, size_t size) { // verify it's in the storage area if (addressSTORAGE_END) { return false; } if (buffer==NULL || size==0) { return false; } uint8_t page[PAGE_SIZE]; // the complete page to write flash_unlock(); // unlock flash to be able to write it // go through memory while (size) { uint32_t page_pre = address%PAGE_SIZE; // the beginning data size in the page address -= page_pre; // go to beginning of the page storage_read(address, &page[0], page_pre); // copy existing data if (size>=PAGE_SIZE-page_pre) { // no need to read tailing page data for (uint16_t i=0; i