一、关于STM32单片机IAP升级中if(((*(__IO uint32_t*)Addr_App) & 0x2FFE0000) == 0x20000000)语句的理解
参考自:https://blog.csdn.net/weixin_45394120/article/details/122732203?spm=1001.2014.3001.5502
疑问:
1、为什么要用Addr_App里的数据跟0x2FFE0000相与呢?
因为Addr_App指向的数据是RAM地址,而0x20000000是RAM的首地址,假如你的STM32单片机RAM有128K,那RAM的末地址就是0x2001FFFF。所以与0x2FFE0000相与就是确保Addr_App指向的数据在0x20000000~0x2001FFFF之间;假如你的STM32单片机RAM有64K,那RAM的末地址就是0x2000FFFF。则只要与0x2FFF0000相与确保Addr_App指向的数据在0x20000000~0x2000FFFF之间;
2、为什么Addr_App里存的是RAM地址呢?
MSP的初始值是程序占用RAM的大小,按地址理解就是MSP的初始值是程序在RAM中的末地址+1。
小结:
程序存储在flash的首地址指向的是MSP的初始值,而这个初始值是程序占用RAM的大小,也是程序在RAM中的末地址+1。
二、关于中断向量表的重新映射
参考来自:(90条消息) stm32带BootLoader情况下,需要重新映射中断向量表_Surpas-HC的博客-CSDN博客_stm32重映射中断向量表
从ARM官网上的信息得知(Documentation – Arm Developer ),在Coretext-M3与Coretext-M4核中,在System Control Block中存在一个向量表偏移量寄存器 VTOR(0xE000ED08),系统产生中断后,内核通过这个寄存器的值来找到中断向量表的地址,进而执行中断例程代码,当然,此寄存器的值是可以修改的,它的默认值为0。实际上在大部分的M3和M4的工程中,一般都是在SystemInit函数中对此寄存器的值进行设置,当此之前,它的值为默认值0,由于映射关系,实际上就是指向映射地址,比如0x0800 0000. 如下图所示: