[应用相关] STM32 IAP升级程序设计详解-IAR环境

[复制链接]
 楼主| 过期的塔头 发表于 2021-12-30 22:05 | 显示全部楼层
在系统启动文件中找到SystemInit函数,并在最后两行可以看到如下代码:

288761cdbcba71262.png
 楼主| 过期的塔头 发表于 2021-12-30 22:06 | 显示全部楼层
这里可以设置SRAM和Flash中断向量表的偏移,这里以Flash为例所以需要检查VECT_TAB_SRAM是否被定义,如果定义了则需要取消,然后再设置宏VECT_TAB_OFFSET的值。在该文件中找到VECT_TAB_OFFSET宏,可以发现的初始值为0

6278061cdbce7ef497.png
 楼主| 过期的塔头 发表于 2021-12-30 22:08 | 显示全部楼层
由于我们之前设置了BootLoader的大小为32K,所以这里需要把VECT_TAB_OFFSET宏的值修改为0x8000

9273961cdbd4c40f81.png

note:这里只需要设置APP程序的中断向量表的偏移,BootLoader不需要进行设置
 楼主| 过期的塔头 发表于 2021-12-30 22:11 | 显示全部楼层
3. 编写Bootloader升级程序

2580461cdbe194204d.png
 楼主| 过期的塔头 发表于 2021-12-30 22:17 | 显示全部楼层
  1. typedef void (*PFN_Reset)(void);        //定义函数指针类型
  2. void vIapLoadApp(uint32_t xAppAddr)
  3. {
  4.         uint32_t nMSP, xJumpAddr;                /*栈顶指针*/                                 
  5.         PFN_Reset vResetHandler = NULL;     /*复位中断函数指针*/
  6.   
  7.           /*app起始位置4个字节储存的是栈顶指针*/
  8.         nMSP = *((__IO uint32_t*)(xAppAddr));
  9.           /*取出复位中断函数的地址*/
  10.           xJumpAddr = *((__IO uint32_t*)(xAppAddr+4));   
  11.           /*复位中断函数指针赋值*/
  12.         vResetHandler = (PFN_Reset)(xJumpAddr);         
  13.           /*检测栈顶指针是否合法*/
  14.         if((nMSP&0x2FFE0000) == 0x20000000)                                                 
  15.         {
  16.             /*初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)*/
  17.                 __set_MSP(nMSP);                        
  18.             /*跳转到APP(从APP复位中断向量处取指令执行)*/  
  19.                 vResetHandler();                                                         
  20.         }
  21. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部