Kamil Cukrowski / Mbed 2 deprecated STM32_Button_Interrupt_dla_taty

Dependencies:   mbed DS18B20 TextLCD

Committer:
KamilCuk
Date:
Thu Feb 13 16:27:38 2020 +0000
Revision:
0:55c37ea095b0
Working version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
KamilCuk 0:55c37ea095b0 1 #ifndef FLASH_H
KamilCuk 0:55c37ea095b0 2 #define FLASH_H
KamilCuk 0:55c37ea095b0 3
KamilCuk 0:55c37ea095b0 4 #include "mbed.h"
KamilCuk 0:55c37ea095b0 5 #include <cassert>
KamilCuk 0:55c37ea095b0 6 #include <limits>
KamilCuk 0:55c37ea095b0 7
KamilCuk 0:55c37ea095b0 8 void lcd_println(const char *fmt, ...);
KamilCuk 0:55c37ea095b0 9 extern "C" void d(const char *fmt, ...);
KamilCuk 0:55c37ea095b0 10
KamilCuk 0:55c37ea095b0 11 namespace flash {
KamilCuk 0:55c37ea095b0 12 static inline void _page_erase(uint32_t page) {
KamilCuk 0:55c37ea095b0 13 uint32_t page_error = 0;
KamilCuk 0:55c37ea095b0 14 FLASH_EraseInitTypeDef s_eraseinit;
KamilCuk 0:55c37ea095b0 15 s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES;
KamilCuk 0:55c37ea095b0 16 s_eraseinit.PageAddress = page;
KamilCuk 0:55c37ea095b0 17 s_eraseinit.NbPages = 1;
KamilCuk 0:55c37ea095b0 18 const HAL_StatusTypeDef status =
KamilCuk 0:55c37ea095b0 19 HAL_FLASHEx_Erase(&s_eraseinit, &page_error);
KamilCuk 0:55c37ea095b0 20 if (status) d("ERR: HFP %d", status);
KamilCuk 0:55c37ea095b0 21 }
KamilCuk 0:55c37ea095b0 22
KamilCuk 0:55c37ea095b0 23 static const uintptr_t _page = 0x0800F400;
KamilCuk 0:55c37ea095b0 24 static const uint16_t _mark = 0xbeef + 1;
KamilCuk 0:55c37ea095b0 25
KamilCuk 0:55c37ea095b0 26 static inline void _write16(uintptr_t address, uint16_t val) {
KamilCuk 0:55c37ea095b0 27 // d("W %lx=%04x", _page + address, val);
KamilCuk 0:55c37ea095b0 28 const HAL_StatusTypeDef status =
KamilCuk 0:55c37ea095b0 29 HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, _page + address * 2, val);
KamilCuk 0:55c37ea095b0 30 if (status) d("ERR: HFP %d", status);
KamilCuk 0:55c37ea095b0 31 }
KamilCuk 0:55c37ea095b0 32
KamilCuk 0:55c37ea095b0 33 static inline uint16_t _read16(uintptr_t address) {
KamilCuk 0:55c37ea095b0 34 const uint16_t val = *(volatile uint16_t *)(_page + address * 2);
KamilCuk 0:55c37ea095b0 35 // d("RR %lx=%04x", _page + address, val);
KamilCuk 0:55c37ea095b0 36 return val;
KamilCuk 0:55c37ea095b0 37 }
KamilCuk 0:55c37ea095b0 38
KamilCuk 0:55c37ea095b0 39 static inline void write(const void *data, size_t len) {
KamilCuk 0:55c37ea095b0 40 assert(len < FLASH_PAGE_SIZE - 2);
KamilCuk 0:55c37ea095b0 41 assert(len < std::numeric_limits<uint16_t>::max());
KamilCuk 0:55c37ea095b0 42 HAL_FLASH_Unlock();
KamilCuk 0:55c37ea095b0 43 _page_erase(_page);
KamilCuk 0:55c37ea095b0 44 flash::_write16(0, _mark);
KamilCuk 0:55c37ea095b0 45 flash::_write16(1, len);
KamilCuk 0:55c37ea095b0 46 for (size_t i = 0; i < len; i += 2) {
KamilCuk 0:55c37ea095b0 47 uint16_t var = 0;
KamilCuk 0:55c37ea095b0 48 const size_t to_copy = 1 + (i + 2 < len);
KamilCuk 0:55c37ea095b0 49 memcpy(&var, data, to_copy);
KamilCuk 0:55c37ea095b0 50 flash::_write16(2 + i / 2, var);
KamilCuk 0:55c37ea095b0 51 data = (const char*)data + to_copy;
KamilCuk 0:55c37ea095b0 52 }
KamilCuk 0:55c37ea095b0 53 HAL_FLASH_Lock();
KamilCuk 0:55c37ea095b0 54 }
KamilCuk 0:55c37ea095b0 55
KamilCuk 0:55c37ea095b0 56 static inline int read(void *data, size_t len) {
KamilCuk 0:55c37ea095b0 57 assert(len < FLASH_PAGE_SIZE - 2);
KamilCuk 0:55c37ea095b0 58 assert(len < std::numeric_limits<uint16_t>::max());
KamilCuk 0:55c37ea095b0 59 const uint16_t read_mark = flash::_read16(0);
KamilCuk 0:55c37ea095b0 60 if (read_mark != _mark) {
KamilCuk 0:55c37ea095b0 61 memset(data, '0', len);
KamilCuk 0:55c37ea095b0 62 return -1;
KamilCuk 0:55c37ea095b0 63 }
KamilCuk 0:55c37ea095b0 64 const uint16_t read_len = flash::_read16(1);
KamilCuk 0:55c37ea095b0 65 if (read_len != len) {
KamilCuk 0:55c37ea095b0 66 memset(data, '0', len);
KamilCuk 0:55c37ea095b0 67 return -2;
KamilCuk 0:55c37ea095b0 68 }
KamilCuk 0:55c37ea095b0 69 for (size_t i = 0; i < len; i += 2) {
KamilCuk 0:55c37ea095b0 70 const uint16_t var = flash::_read16(2 + i / 2);
KamilCuk 0:55c37ea095b0 71 const size_t to_copy = 1 + (i + 2 < len);
KamilCuk 0:55c37ea095b0 72 memcpy(data, &var, to_copy);
KamilCuk 0:55c37ea095b0 73 data = (char*)data + to_copy;
KamilCuk 0:55c37ea095b0 74 }
KamilCuk 0:55c37ea095b0 75 return 0;
KamilCuk 0:55c37ea095b0 76 }
KamilCuk 0:55c37ea095b0 77
KamilCuk 0:55c37ea095b0 78 template<typename T>
KamilCuk 0:55c37ea095b0 79 static inline void write(const T &t) {
KamilCuk 0:55c37ea095b0 80 flash::write((const void*)&t, sizeof(t));
KamilCuk 0:55c37ea095b0 81 }
KamilCuk 0:55c37ea095b0 82
KamilCuk 0:55c37ea095b0 83 template<typename T>
KamilCuk 0:55c37ea095b0 84 static inline int read(T &t) {
KamilCuk 0:55c37ea095b0 85 return flash::read((void*)&t, sizeof(t));
KamilCuk 0:55c37ea095b0 86 }
KamilCuk 0:55c37ea095b0 87
KamilCuk 0:55c37ea095b0 88 static inline void test() {
KamilCuk 0:55c37ea095b0 89 lcd_println("testing flash");
KamilCuk 0:55c37ea095b0 90 lcd_println("testing flash 2");
KamilCuk 0:55c37ea095b0 91 wait(1);
KamilCuk 0:55c37ea095b0 92
KamilCuk 0:55c37ea095b0 93 while (1) {
KamilCuk 0:55c37ea095b0 94 char buf[6] = {0};
KamilCuk 0:55c37ea095b0 95 const int e = flash::read(buf, 5);
KamilCuk 0:55c37ea095b0 96 int i = atoi(buf);
KamilCuk 0:55c37ea095b0 97 if (i == 0) i = 12345;
KamilCuk 0:55c37ea095b0 98 lcd_println("FR%d %d: %s", e, i, buf);
KamilCuk 0:55c37ea095b0 99
KamilCuk 0:55c37ea095b0 100 snprintf(buf, sizeof(buf), "%d", i + 1);
KamilCuk 0:55c37ea095b0 101 lcd_println("FW: %s", buf);
KamilCuk 0:55c37ea095b0 102 flash::write(buf, 5);
KamilCuk 0:55c37ea095b0 103
KamilCuk 0:55c37ea095b0 104 wait(1);
KamilCuk 0:55c37ea095b0 105 }
KamilCuk 0:55c37ea095b0 106 }
KamilCuk 0:55c37ea095b0 107 };
KamilCuk 0:55c37ea095b0 108
KamilCuk 0:55c37ea095b0 109 #endif