STM32F0xx IAP实现之中断向量表重定义

在STM32F103等cortex-m3/m4内核的单片机上可以通过设置SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;该寄存器的值来实现中断向量表的重定义。但在STM32F0xx系列以cortex-m0为内核的单片机中却怎么也找不到这个设置中断向量表的寄存器,可以通过以下方法来实现中断向量表重定义。

基本思想:
1、将中断向量表放入到RAM的起始地址(只需要在应用程序中保留RAM其实地址的0x100大小不使用即可)。
2、在bootload中将应用程序的中断向量表从Flash中拷贝到RAM中。
3、设置STM32F0xx中断向量表位于RAM中,主要用到的寄存器如下:




具体实现代码如下:
/*
*  Function: void JumpToApp(void)
* Parameter: none
*    Return: none
*/
static void JumpToApp(void)
{
  ApplicationAddress = APP_FLASHADDR;
  if (((*(uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
  {
    /* Jump to user application */
    m_JumpAddress = *(uint32_t*) (ApplicationAddress + 4);  /*最开头4个字节存放MSP的初始值,从这之后的4个字节存放                                                                                       ResetHandler中断向量*/
    JumpToApplication = (FunVoidType) m_JumpAddress;

    /* Initialize user application's Stack Pointer */
    __set_MSP(*(uint32_t*) ApplicationAddress);
    JumpToApplication();
  }
}
/*
*  Function: void clock_init(void)
* Parameter: none
*    Return: none
*/
int main(void)
{
  memcpy((void*)0x20000000, (void*)APP_FLASHADDR, 0x100);
  SYSCFG->CFGR1 |= 0x03;
 
  JumpToApp();
  while (1);
}

你可能感兴趣的:(atmel单片机开发)