diff options
Diffstat (limited to 'source/Core/BSP/Miniware/flash.c')
-rw-r--r-- | source/Core/BSP/Miniware/flash.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/source/Core/BSP/Miniware/flash.c b/source/Core/BSP/Miniware/flash.c new file mode 100644 index 00000000..ba429dd4 --- /dev/null +++ b/source/Core/BSP/Miniware/flash.c @@ -0,0 +1,46 @@ +/*
+ * flash.c
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#include "BSP_Flash.h"
+#include "BSP.h"
+#include "string.h"
+#include "stm32f1xx_hal.h"
+
+static uint16_t settings_page[512] __attribute__ ((section (".settings_page")));
+
+uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
+ FLASH_EraseInitTypeDef pEraseInit;
+ pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
+ pEraseInit.Banks = FLASH_BANK_1;
+ pEraseInit.NbPages = 1;
+ pEraseInit.PageAddress = (uint32_t) settings_page;
+ uint32_t failingAddress = 0;
+ resetWatchdog();
+ __HAL_FLASH_CLEAR_FLAG(
+ FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR | FLASH_FLAG_BSY);
+ HAL_FLASH_Unlock();
+ HAL_Delay(1);
+ resetWatchdog();
+ HAL_FLASHEx_Erase(&pEraseInit, &failingAddress);
+ //^ Erase the page of flash (1024 bytes on this stm32)
+ // erased the chunk
+ // now we program it
+ uint16_t *data = (uint16_t*) buffer;
+ HAL_FLASH_Unlock();
+ for (uint8_t i = 0; i < (length / 2); i++) {
+ resetWatchdog();
+ HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,
+ (uint32_t) &settings_page[i], data[i]);
+ }
+ HAL_FLASH_Lock();
+ return 1;
+}
+
+void flash_read_buffer(uint8_t *buffer, const uint16_t length) {
+
+ memcpy(buffer, settings_page, length);
+}
|