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; } }