Part Number: UCD3138128
Other Parts Discussed in Thread: UCD3138A
Tool/software:
Hello again.
I am just now getting back to this issue. My immediate problem is that I can't seem to simply erase a block of Pflash memory.
I am running out of block 0 and want to erase block 2.
It seems when I execute the software_interrupt to clear prorgam flash block 2, I get a memory fault or something causing a reset.
(This is CASE 14 in the function: software_interrupt().)
The program It is attempting to run from a RAM copy of clear_program_flash_2 at that time.
Is there something special I need to do to allow the program to run from ram?
Here is the snippet: (it fails down around line 131)
case 14: // erase entire Program Flash
//--------------------------------------------------------------------------------------
// SWI ALIAS: Pflash_EraseBlock
// variables: Uint32 arg1, Uint32 arg2, Uint32 arg3, Uint8 swi_number
//--------------------------------------------------------------------------------------
{
register Uint32 * program_index = (Uint32 *) program_area; //store destination address for program
register Uint32 * source_index; //Used for source address of PFLASH;
register Uint32 counter;
if(arg1 == 0) //0 means first block by address, not flash block
{
if((DecRegs.MFBALR1.bit.ADDRESS == 0) && (DecRegs.MFBAHR1.bit.ADDRESS == 0)) //here if flash block 0 is at 0
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH0_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_0;
}
else if((DecRegs.MFBALR17.bit.ADDRESS == 0) && (DecRegs.MFBAHR17.bit.ADDRESS == 0))//if it's program flash 1;
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH1_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_1;
}
else if((DecRegs.MFBALR18.bit.ADDRESS == 0) && (DecRegs.MFBAHR18.bit.ADDRESS == 0))//if it's program flash 2;
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH2_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_2;
}
else if((DecRegs.MFBALR19.bit.ADDRESS == 0) && (DecRegs.MFBAHR19.bit.ADDRESS == 0))//if it's program flash 3;
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH3_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_3;
}
else
{
return;
}
}
else if(arg1 == 1) //1 means second block by address;
{
if((DecRegs.MFBALR1.bit.ADDRESS == 0x20) && (DecRegs.MFBAHR1.bit.ADDRESS == 0)) //here if flash block 0 is at 0x8000
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH0_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_0;
}
else if((DecRegs.MFBALR17.bit.ADDRESS == 0x20) && (DecRegs.MFBAHR17.bit.ADDRESS == 0))//if it's program flash 1;
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH1_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_1;
}
else if((DecRegs.MFBALR18.bit.ADDRESS == 0x20) && (DecRegs.MFBAHR18.bit.ADDRESS == 0))//if it's program flash 2;
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH2_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_2;
}
else if((DecRegs.MFBALR19.bit.ADDRESS == 0x20) && (DecRegs.MFBAHR19.bit.ADDRESS == 0))//if it's program flash 3;
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH3_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_3;
}
else
{
return;
}
}
else if(arg1 == 2) //2 means third block by address;
{
if((DecRegs.MFBALR1.bit.ADDRESS == 0) && (DecRegs.MFBAHR1.bit.ADDRESS == 1)) //here if flash block 0 is at 0x10000
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH0_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_0;
}
else if((DecRegs.MFBALR17.bit.ADDRESS == 0) && (DecRegs.MFBAHR17.bit.ADDRESS == 1))//if it's program flash 1;
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH1_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_1;
}
else if((DecRegs.MFBALR18.bit.ADDRESS == 0) && (DecRegs.MFBAHR18.bit.ADDRESS == 1))//if it's program flash 2;
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH2_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_2;
}
else if((DecRegs.MFBALR19.bit.ADDRESS == 0) && (DecRegs.MFBAHR19.bit.ADDRESS == 1))//if it's program flash 3;
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH3_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_3;
}
else
{
return;
}
}
else if(arg1 == 3) //3 means fourth block by address;
{
if((DecRegs.MFBALR1.bit.ADDRESS == 0x20) && (DecRegs.MFBAHR1.bit.ADDRESS == 1)) //here if flash block 0 is at 0x18000
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH0_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_0;
}
else if((DecRegs.MFBALR17.bit.ADDRESS == 0x20) && (DecRegs.MFBAHR17.bit.ADDRESS == 1))//if it's program flash 1;
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH1_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_1;
}
else if((DecRegs.MFBALR18.bit.ADDRESS == 0x20) && (DecRegs.MFBAHR18.bit.ADDRESS == 1))//if it's program flash 2;
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH2_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_2;
}
else if((DecRegs.MFBALR19.bit.ADDRESS == 0x20) && (DecRegs.MFBAHR19.bit.ADDRESS == 1))//if it's program flash 3;
{
DecRegs.FLASHILOCK.all = PROGRAM_FLASH3_INTERLOCK_KEY;
source_index = (Uint32 *)clear_program_flash_3;
}
else
{
return;
}
}
else
{
return; //ditch any invalid arg1s
}
for(counter=0; counter < 32; counter++) //Copy program from PFLASH to RAM
{
*(program_index++)=*(source_index++);
}
{
register FUNC_PTR func_ptr;
func_ptr=(FUNC_PTR)program_area; //Set function to program area
func_ptr();
}
}
break;
default:
break;
}
}







