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();
}
Esempio n. 7
0
/**
  * @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
}