• 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指针指向复位地址。

  • 相关阅读:
    样式
    读取网页图片(包含代理)
    C# 替换“换行符”写法
    Iframe中弹出消息问题
    程序list
    C#对象序列化
    软件工程——个人总结
    软件工程——团队作业4
    软件工程———团队答辩
    软件工程--团队作业三
  • 原文地址:https://www.cnblogs.com/Mike2019/p/12491240.html
Copyright © 2020-2023  润新知