2018-09-19 09:28 PM
Hello,
I am verifying my flash write program.
The first writing is ok, but the error occurred from the second writing.
The following is my flash write program.
int cmd_flash_write(void)
{
uint32_t s_addr;
uint32_t data[512];
uint32_t len, i, status;
s_addr = atoi(argv[1]);
len = atoi(argv[2]);
/* Random data */
for(i = 0; i < len; i++) {
data[i] = rand() % 0xffffffff;
}
FLASH_Unlock();
status = FLASH_If_Write(&s_addr, (U32*)&data[0] ,len);
FLASH_Lock();
Uart_Printf("status : %d\n", status);
return TRUE;
}
U32 FLASH_If_Write(__IO U32* FlashAddress, U32* Data ,U16 DataLength){
U32 i = 0;
U32 a, b;
//dbg_printf("FlashAddress : 0x%.8x 0x%.8x %d\n", *FlashAddress, *Data, DataLength);
for (i = 0; (i < DataLength) && (*FlashAddress <= (USER_FLASH_END_ADDRESS-4)); i++){
if((*FlashAddress>=BOOTLOADER_START_ADDRESS) && (*FlashAddress<=BOOTLOADER_END_ADDRESS)) { //protect the boot area
dbg_printf("ADDRESS : 0x%.8x Error\n", *FlashAddress);
return (1);
}
/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
be done by word */
if (FLASH_ProgramWord(*FlashAddress, *(U32*)(Data+i)) == FLASH_COMPLETE){
a = *(__IO U32*)*FlashAddress;
b = *(U32*)(Data+i);
/* Check the written value */
if (a != b){
/* Flash content doesn't match SRAM content */
return(2);
}
/* Increment FLASH destination address */
*FlashAddress += 4;
}
else{
/* Error occurred while writing data in Flash memory */
return (1);
}
}
return (0);
}
The return value of the FLASH_If_Write() function is '2'.
It means that the written data is different from the read data.
Why does this difference occur from the second time?
Thanks
2018-09-19 09:58 PM
>>Why does this difference occur from the second time?
Where do you set a value for the flash address? Value in s_addr never set.
You only get to write flash once, then you need to erase it.
2018-09-20 05:36 PM
Thanks for your answer, Clive