STM32F4 串口IAP程序解析

1. IAP程序跳转到APP程序

void Jump2APP(uint32_t appxaddr)
{
    /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
    if (((*(__IO uint32_t*)appxaddr) & 0x2FFE0000 ) == 0x20000000)    //1.检查栈顶地址是否合法
    {
        /* Jump to user application */
        JumpAddress = *(__IO uint32_t*) (FLASH_APP_ADDR + 4);    //2.用户代码区第二个字为程序开始地址(复位地址)
        
        Jump_To_Application = (pFunction) JumpAddress;
        /* Initialize user application's Stack Pointer */
        __set_MSP(*(__IO uint32_t*) FLASH_APP_ADDR);    //设置进程MSR堆栈首地址
        Jump_To_Application();  //设置PC指针指向复位地址,完成跳转
    }
}

1.1 检查栈顶地址是否合法

  变量appxaddr存放的是APP程序的首地址,即FLASH_APP_ADDR。*appxaddr就是取FLASH_APP_ADDR这个地址里面的数据,即APP代码堆栈的栈顶地址,它指向RAM,而RAM起始地址0x20000000。因此这句代码是:判断APP堆栈地址是否落在0x20000000~0x2001ffff(128K)区间内,

1.2 存放复位中断向量起始地址

  FLASH_APP_ADDR+4存放的是复位中断向量起始地址,这句代码是:将复位中断向量的起始地址存放在变量JumpAddress里。

1.3 设置堆栈指针

  跳转之前先使用__set_MSR()设置堆栈指针的首地址

1.4 设置PC指针

  设置PC指针指向复位地址。

原文地址:https://www.cnblogs.com/Mike2019/p/12491240.html