For the STM32F051 I use this to "goto" a soft at 0x400 and it work:
Code: Select all
void Set_VectorsCodes(unsigned long SP,unsigned long PC) // OK
{
unsigned int x2;
unsigned long *ptr=VECT_PG_ADDR+8,x4,y4;
x4=*ptr;
ptr++;
y4=*ptr;
if(x4!=SP || y4!=PC ) // purpose: do not write at each request if no difference
{
FLASH_Unlock();
FLASH_ErasePage(VECT_PG_ADDR);
FLASH_Write_HalfWord(VECT_PG_ADDR, 0x4801);
FLASH_Write_HalfWord(VECT_PG_ADDR+2, 0x4685);
FLASH_Write_HalfWord(VECT_PG_ADDR+4, 0x4801);
FLASH_Write_HalfWord(VECT_PG_ADDR+6, 0x4700);
x2=(unsigned int)SP;
FLASH_Write_HalfWord(VECT_PG_ADDR+8, x2);
x2=(unsigned int)(SP>>16);
FLASH_Write_HalfWord(VECT_PG_ADDR+10, x2);
x2=(unsigned int)PC;
FLASH_Write_HalfWord(VECT_PG_ADDR+12, x2);
x2=(unsigned int)(PC>>16);
FLASH_Write_HalfWord(VECT_PG_ADDR+14, x2);
FLASH_Lock();
}
}
Code: Select all
//------------------------------------------------------------------------------
void Set_VectorsCodes(unsigned long SP,unsigned long PC) /
{
unsigned long *ptr=VECT_PG_ADDR+8,x4,y4;
x4=*ptr;
ptr++;
y4=*ptr;
if(x4!=SP || y4!=PC ) // purpose: do not write at each request if no difference
{
FLASH_Unlock();
FLASH_ErasePage(VECT_PG_ADDR);
FLASH_Write_Word(VECT_PG_ADDR, 0x48014685);
FLASH_Write_Word(VECT_PG_ADDR+4, 0x48014700);
FLASH_Write_Word(VECT_PG_ADDR+8, SP);
FLASH_Write_Word(VECT_PG_ADDR+12,PC);
FLASH_Lock();
}
}
( of course I read the flash at VECT_PG_ADDR and have : 48014685 48014700 2000BFFC 00000401 )
Thanks for help