void erase_flash_sector(uint32_t sector_addr) { uint16_t erase_id = 0; uint32_t addr = 0; if(sector_addr == (sector_addr & FLASH_END_ADDR)) { erase_id = IAP_ERAS_SECT; addr = sector_addr; } else if((sector_addr >= DAT0_START_ADDR) && (sector_addr == (sector_addr & DAT0_END_ADDR))) { erase_id = IAP_ERAS_DAT0; addr = 0; } else if((sector_addr >= DAT1_START_ADDR) && (sector_addr == (sector_addr & DAT1_END_ADDR))) { erase_id = IAP_ERAS_DAT1; addr = 0; } else { #ifdef _FLASH_DEBUG_ printf(" > FLASH:SECTOR_ERASE_FAILED: [0x%.8x]\r\n", sector_addr); #endif return; } __disable_irq(); DO_IAP(erase_id, addr, 0, 0); __enable_irq(); }
int write_flash(uint32_t addr, uint8_t *data, uint32_t data_len) { __disable_irq(); DO_IAP(IAP_PROG,addr,(unsigned char*)data,data_len); __enable_irq(); return data_len; }
void erase_flash_block(uint32_t block_addr) { if(block_addr != (block_addr & FLASH_END_ADDR)) { #ifdef _FLASH_DEBUG_ printf(" > FLASH:BLOCK_ERASE_FAILED: [0x%.8x]\r\n", block_addr); #endif return; // masking; } __disable_irq(); DO_IAP(IAP_ERAS_BLCK, block_addr, 0, 0); __enable_irq(); }
uint32_t write_flash(uint32_t addr, uint8_t * data, uint32_t data_len) { // Invalid memory address range: Data blocks if((addr >= DAT0_START_ADDR) && (addr == (addr & DAT1_END_ADDR))) { if((data_len > SECT_SIZE) || (DAT0_START_ADDR + data_len > DAT1_END_ADDR)) { #ifdef _FLASH_DEBUG_ printf(" > FLASH:WRITE_FAILED: Invalid memory address range [0x%.8x]\r\n", addr); #endif return 0; } } // Invalid data_len if((data_len == 0) && (addr + data_len > DAT1_END_ADDR)) { #ifdef _FLASH_DEBUG_ printf(" > FLASH:WRITE_FAILED: Invalid data length [%d]\r\n", data_len); #endif return 0; // (Max ~ 0x0003FFFF) } // Invalid memory address range: Information block, Do not access if((addr > FLASH_END_ADDR) && (addr < DAT0_START_ADDR)) { #ifdef _FLASH_DEBUG_ printf(" > FLASH:WRITE_FAILED: Invalid memory address range [0x%.8x]\r\n", addr); #endif return 0; } __disable_irq(); DO_IAP(IAP_PROG, addr, data, data_len); __enable_irq(); return data_len; }
void erase_flash_block(uint32_t block_addr) { __disable_irq(); DO_IAP(IAP_ERAS_BLCK,block_addr,0,0); __enable_irq(); }
void erase_flash_page(uint32_t page_addr) { __disable_irq(); DO_IAP(IAP_ERAS_SECT,page_addr,0,0); __enable_irq(); }
/** * @brief Main Function */ int main() { uint32_t i,result; SystemInit(); // *(volatile uint32_t *)(0x41001014) = 0x0060100; //clock setting 48MHz /* CLK OUT Set */ // PAD_AFConfig(PAD_PA,GPIO_Pin_2, PAD_AF2); // PAD Config - CLKOUT used 3nd Function #ifdef __DEBUG UART_StructInit(&UART_InitStructure); UART_Init(USING_UART,&UART_InitStructure); UartPuts(USING_UART,"Test Start\r\n"); #endif // Make Dummy Data for Flash Write Test for(i=0;i<SECT_SIZE;i++) { save_buff[i] = i; } // Step 1 DATA0 Erase, Read, Write Test DO_IAP(IAP_ERAS_DAT0,0,0,0); DO_IAP(IAP_PROG,DAT0_START_ADDR,save_buff,SECT_SIZE); result = Buffercmp((uint8_t*)save_buff,((uint8_t *)(DAT0_START_ADDR)),SECT_SIZE); #ifdef __DEBUG if(result == PASSED) UartPuts(USING_UART,"Step1 Test Passed\r\n"); else UartPuts(USING_UART,"Step1 Test Falied\r\n"); #endif // Step 2 DATA1 Erase, Read, Write Test DO_IAP(IAP_ERAS_DAT1,0,0,0); DO_IAP(IAP_PROG,DAT1_START_ADDR,save_buff,SECT_SIZE); result = Buffercmp((uint8_t*)save_buff,((uint8_t *)(DAT1_START_ADDR)),SECT_SIZE); #ifdef __DEBUG if(result == PASSED) UartPuts(USING_UART,"Step2 Test Passed\r\n"); else UartPuts(USING_UART,"Step2 Test Falied\r\n"); #endif // Step 3 Code Flash Block Erase, Read, Write Test for(i=0;i<BLOCK_SIZE;i++) { save_buff[i] = i; } DO_IAP(IAP_ERAS_BLCK,CODE_TEST_ADDR,0,0); DO_IAP(IAP_PROG, CODE_TEST_ADDR,save_buff,BLOCK_SIZE); result = Buffercmp((uint8_t*)save_buff,((uint8_t *)(CODE_TEST_ADDR)),BLOCK_SIZE); #ifdef __DEBUG if(result == PASSED) UartPuts(USING_UART,"Step3 Test Passed\r\n"); else UartPuts(USING_UART,"Step3 Test Falied\r\n"); #endif }