6 #include "DrvFlash.hpp"
7 #include "DrvMacros.hpp"
8 #include "RtosInclude.hpp"
10 void DrvFlash::unlock() {
11 FLASH ->SR |= (FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR );
12 FLASH ->KEYR = ((uint32_t) 0x45670123);
13 FLASH ->KEYR = ((uint32_t) 0xCDEF89AB);
16 void DrvFlash::lock() {
17 FLASH ->CR |= FLASH_CR_LOCK;
20 bool DrvFlash::erasePage(
unsigned int page) {
21 if (!waitActionComplete()) {
24 uint32_t addr = (uint32_t) getPageStartAddress(page);
26 FLASH ->CR = FLASH_CR_PER;
28 FLASH ->CR |= FLASH_CR_STRT;
30 if (!waitActionComplete()) {
37 bool DrvFlash::write(
const void* dst,
const void* src,
size_t len) {
38 DRV_ASSERT((len&1)==0);
39 DRV_ASSERT(((uint32_t)dst&1)==0);
40 DRV_ASSERT(((uint32_t)src&1)==0);
42 if (!waitActionComplete()) {
47 uint16_t* dst16 = (uint16_t*) dst;
48 uint16_t* src16 = (uint16_t*) src;
49 for (
size_t i = 0; i < len; i++) {
50 FLASH ->CR = FLASH_CR_PG;
52 if (!waitActionComplete()) {
53 FLASH ->CR &= ~FLASH_CR_PG;
56 FLASH ->CR &= ~FLASH_CR_PG;
61 bool DrvFlash::waitActionComplete() {
62 while (FLASH ->SR & FLASH_SR_BSY ) {
64 if (FLASH ->SR & (FLASH_SR_PGERR | FLASH_SR_WRPERR )) {