IAP compatible.
Fork of IAP by
Import programSTM32_IAP_internal_flash_write
STM32_IAP demo.
Import programSTM32_IAP_test
STM32_IAP test
Diff: IAP_STM32L1.cpp
- Revision:
- 12:fd6a08b46228
- Parent:
- 10:a0c5bb26d159
diff -r 937bd817d5bf -r fd6a08b46228 IAP_STM32L1.cpp --- 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;