lpcware

LPC4357 fw upgrade

Discussion created by lpcware Employee on Jun 15, 2016
Latest reply on Mar 3, 2017 by Raymundo Velarde
Content originally posted in LPCWare by pgeloso on Thu Jun 11 06:53:46 MST 2015



Hi,
I'm trying to run a m4 firmware upgrade code using LPC4357, but as soon as I erase sector 0, the code halts.
- I'm not using interrupts
- I've left 32Byte of stack offset. ... MCU Linker -> Target -> stack offest = 32
- I placed routines into RAM
- I copied the firmware that will upgrade the m4 into a free sector of Flash bank A then, to upgrade the firmware, I simply copy these sectors into sectors starting from 0

Am I missing something else?

Probably I'm not correctly using the instructions to place routines into RAM.
I'm attaching parts of the code:
could you please double check?
Any suggestions?

Thank you
Pietro


int main(void) {
   uint8_t result8=0;

    uint8_t (*longfunc)(void) = &ram_copy_fw_upgrade;

    SystemCoreClockUpdate();
    Board_UART_Init(0);//needed, or it will not compile

    Chip_IAP_Initialise();//important! Or iap will not work!

   result8=(*longfunc)();// routine that runs from RAM!


    while(1) {

    }
    return 0 ;
}


#define IAP_INIT_CMD 49

void Chip_IAP_Initialise(void)
{
uint32_t command[5], result[4];

command[0] = IAP_INIT_CMD;
iap_entry(command, result);
}

__RAMFUNC(RAM) uint8_t ram_Chip_IAP_PreSectorForReadWrite(uint32_t strSector, uint32_t endSector, uint8_t flashBank)
{
uint32_t command[5], result[4];

command[0] = IAP_PREWRRITE_CMD;
command[1] = strSector;
command[2] = endSector;
command[3] = flashBank;
iap_entry(command, result);

return result[0];
}

__RAMFUNC(RAM) uint8_t ram_Chip_IAP_CopyRamToFlash(uint32_t dstAdd, uint32_t *srcAdd, uint32_t byteswrt)
{
uint32_t command[5], result[4];

command[0] = IAP_WRISECTOR_CMD;
command[1] = dstAdd;
command[2] = (uint32_t) srcAdd;
command[3] = byteswrt;
command[4] = SystemCoreClock / 1000;
iap_entry(command, result);

return result[0];
}

__RAMFUNC(RAM) uint8_t ram_Chip_IAP_EraseSector(uint32_t strSector, uint32_t endSector, uint8_t flashBank)
{
uint32_t command[5], result[4];

command[0] = IAP_ERSSECTOR_CMD;
command[1] = strSector;
command[2] = endSector;
command[3] = SystemCoreClock / 1000;
command[4] = flashBank;
iap_entry(command, result);

return result[0];
}


__RAMFUNC(RAM) uint8_t ram_copy_fw_upgrade(void){
//routine placed in ram that uses routines placed in ram
//In a previous run I copied blinky.h data into sector STARTING_SECTOR_N=8
//Now I copy flash sector 8 into sector 0
uint32_t fw_lenght,sector_address;
int i;
uint8_t result8;

uint32_t n_sector=0;//we start writing data in this sector

uint32_t *read_address=(uint32_t *)sector_banka_start_map[STARTING_SECTOR_N];//leggo da qui

/// pointers to call routines placed into RAM
uint8_t (*longfunc_prepare)(uint32_t strSector, uint32_t endSector, uint8_t flashBank) = &ram_Chip_IAP_PreSectorForReadWrite;
uint8_t (*longfunc_copy)(uint32_t dstAdd, uint32_t *srcAdd, uint32_t byteswrt) = &ram_Chip_IAP_CopyRamToFlash;
uint8_t (*longfunc_erase)(uint32_t strSector, uint32_t endSector, uint8_t flashBank) = &ram_Chip_IAP_EraseSector;

__disable_irq();

sector_address=sector_banka_start_map[n_sector];
result8=(*longfunc_prepare)(n_sector, n_sector, 0);//prepare..Flash Bank A
result8 +=(*longfunc_erase)(n_sector, n_sector, 0);//erase         <<<<<<<<<<<<<<<< ---------- HERE THE PROGRAM HALTS -----------

fw_lenght=12988;//sizeof(new_firmware);

while(fw_lenght>0){

for(i=0;i<FLASH_DWORD_BLOCK;i++){ //copy sectors
flash_data=*read_address; 
fw_lenght -=4;
read_address++;
if(!(fw_lenght>0)){//last_iteration?
   for(i=i+1;i<FLASH_DWORD_BLOCK;i++) flash_data=0xFFFFFFFF;// fill with erased data
break;//fine del ciclo for
}
}

//storing data into flash
result8+=(*longfunc_prepare)(n_sector, n_sector, 0);//prepare
result8 +=(*longfunc_copy)(sector_address, flash_data, FLASH_BLOCK);//erase

//update flash address
sector_address +=FLASH_BLOCK;
if(!(sector_address<sector_banka_end_map[n_sector])){//if needed, change sector
n_sector++; //new sector
if(!(n_sector<MAX_FLASH_SECTOR)){
//fail !!
}
sector_address=sector_banka_start_map[n_sector];//new address
//nuovo settore:
result8+=(*longfunc_prepare)(n_sector, n_sector, 0);//prepare
result8 +=(*longfunc_erase)(n_sector, n_sector, 0);//erase
}
}

__enable_irq();

return result8;
}




Outcomes