发新帖我要提问
12
返回列表
打印
[应用相关]

STM32 IAP升级程序设计详解-IAR环境

[复制链接]
楼主: 过期的塔头
手机看帖
扫描二维码
随时随地手机跟帖
21
过期的塔头|  楼主 | 2021-12-30 22:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
在系统启动文件中找到SystemInit函数,并在最后两行可以看到如下代码:

使用特权

评论回复
22
过期的塔头|  楼主 | 2021-12-30 22:06 | 只看该作者
这里可以设置SRAM和Flash中断向量表的偏移,这里以Flash为例所以需要检查VECT_TAB_SRAM是否被定义,如果定义了则需要取消,然后再设置宏VECT_TAB_OFFSET的值。在该文件中找到VECT_TAB_OFFSET宏,可以发现的初始值为0

使用特权

评论回复
23
过期的塔头|  楼主 | 2021-12-30 22:08 | 只看该作者
由于我们之前设置了BootLoader的大小为32K,所以这里需要把VECT_TAB_OFFSET宏的值修改为0x8000



note:这里只需要设置APP程序的中断向量表的偏移,BootLoader不需要进行设置

使用特权

评论回复
24
过期的塔头|  楼主 | 2021-12-30 22:11 | 只看该作者
3. 编写Bootloader升级程序

使用特权

评论回复
25
过期的塔头|  楼主 | 2021-12-30 22:17 | 只看该作者
typedef void (*PFN_Reset)(void);        //定义函数指针类型
void vIapLoadApp(uint32_t xAppAddr)
{
        uint32_t nMSP, xJumpAddr;                /*栈顶指针*/                                 
        PFN_Reset vResetHandler = NULL;     /*复位中断函数指针*/
  
          /*app起始位置4个字节储存的是栈顶指针*/
        nMSP = *((__IO uint32_t*)(xAppAddr));
          /*取出复位中断函数的地址*/
          xJumpAddr = *((__IO uint32_t*)(xAppAddr+4));   
          /*复位中断函数指针赋值*/
        vResetHandler = (PFN_Reset)(xJumpAddr);         
          /*检测栈顶指针是否合法*/
        if((nMSP&0x2FFE0000) == 0x20000000)                                                 
        {
            /*初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)*/
                __set_MSP(nMSP);                        
            /*跳转到APP(从APP复位中断向量处取指令执行)*/  
                vResetHandler();                                                         
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则