1、APP部分,M0内核的向量表必须拷贝到内存,并将中断向量修改为RAM
#define SYSCFG_MemoryRemap_SRAM ((uint8_t)0x03)
void IAP_Set()
{
uint32_t i = 0;
/* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/
/* Copy the vector table from the Flash (mapped at the base of the application
load address 0x08003000) to the base address of the SRAM at 0x20000000. */
for(i = 0; i < 48; i++)
{
*((uint32_t*)(0x20000000 + (i << 2)))=*(__IO uint32_t*)(APP_ADDRESS + (i<<2));
}
/* Enable the SYSCFG peripheral clock*/
#if 0 //STM32
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
#else //AMP32
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
/* Remap SRAM at 0x00000000 */
SYSCFG->CFG1_B.MMSEL = SYSCFG_MemoryRemap_SRAM;
#endif
}
2、APP中中断向量表在RAM中,所以要避免RAM覆盖,APP设置如下
?3、IAP跳转到APP
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;
void JumpAPP()
{
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APP_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APP_ADDRESS + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APP_ADDRESS);
/* Jump to application */
Jump_To_Application();
}
}
|