IAP compatible.

Fork of IAP by Tedd OKANO

Import programSTM32_IAP_internal_flash_write

STM32_IAP demo.

Import programSTM32_IAP_test

STM32_IAP test

Revision:
12:fd6a08b46228
Parent:
10:a0c5bb26d159
--- a/IAP_STM32L1.cpp	Tue Apr 12 15:09:09 2016 +0000
+++ b/IAP_STM32L1.cpp	Sat Apr 30 03:32:33 2016 +0000
@@ -82,13 +82,16 @@
 }
 
 int *IAP::read_serial( void ) {
-    memcpy(&IAP_result[1], (void*)0x1ff800d0, sizeof(uint32_t) * 3);
+    memcpy(&IAP_result[1], (void*)0x1ff800d0, sizeof(uint32_t) * 3); // RM0388 31.2
     IAP_result[4] = 0; 
     return ( (int *)&IAP_result[ 1 ] );    //  to return the number itself (this command always returns CMD_SUCCESS)
 }
 
 int IAP::blank_check( int start, int end )
 {
+    if (!IS_FLASH_PROGRAM_ADDRESS(FLASH_BASE + start * FLASH_PAGE_SIZE) || !IS_FLASH_PROGRAM_ADDRESS(FLASH_BASE + end * FLASH_PAGE_SIZE)) {
+        return INVALID_SECTOR;
+    }
     uint8_t* p = reinterpret_cast<uint8_t*>(FLASH_BASE + start * FLASH_PAGE_SIZE);
     uint8_t* e = p + (end - start + 1) * FLASH_PAGE_SIZE;
     while(p < e) {
@@ -106,6 +109,9 @@
 
 int IAP::erase( int start, int end )
 {
+    if (!IS_FLASH_PROGRAM_ADDRESS(FLASH_BASE + start * FLASH_PAGE_SIZE) || !IS_FLASH_PROGRAM_ADDRESS(FLASH_BASE + end * FLASH_PAGE_SIZE)) {
+        return INVALID_SECTOR;
+    }
     FLASH_EraseInitTypeDef Erase;
     Erase.TypeErase = TYPEERASEDATA_BYTE;
     Erase.PageAddress = start * FLASH_PAGE_SIZE;
@@ -118,12 +124,15 @@
 
 int IAP::prepare( int start, int end )
 {
+    if (!IS_FLASH_PROGRAM_ADDRESS(FLASH_BASE + start * FLASH_PAGE_SIZE) || !IS_FLASH_PROGRAM_ADDRESS(FLASH_BASE + end * FLASH_PAGE_SIZE)) {
+        return INVALID_SECTOR;
+    }
     return CMD_SUCCESS;
 }
 
 int IAP::write( char *source_addr, char *target_addr, int size )
 {
-    if (!IS_FLASH_PROGRAM_ADDRESS((uint32_t)target_addr) || !IS_FLASH_PROGRAM_ADDRESS((uint32_t)target_addr + size)) {
+    if (!IS_FLASH_PROGRAM_ADDRESS((uint32_t)target_addr) || !IS_FLASH_PROGRAM_ADDRESS((uint32_t)target_addr + size - 1)) {
         return DST_ADDR_NOT_MAPPED;
     }
     uint32_t data;
@@ -167,7 +176,7 @@
 
 int IAP::write_eeprom( char *source_addr, char *target_addr, int size )
 {
-    if (!IS_FLASH_DATA_ADDRESS((uint32_t)target_addr) || !IS_FLASH_DATA_ADDRESS((uint32_t)target_addr + size -1)) {
+    if (!IS_FLASH_DATA_ADDRESS((uint32_t)target_addr) || !IS_FLASH_DATA_ADDRESS((uint32_t)target_addr + size - 1)) {
         return DST_ADDR_NOT_MAPPED;
     }
     EEPROM_Unlock unlock;