检测APP区的栈顶地址是否合法
1 |
|
- 上面的代码为什么是取app区的首地址里面的内容 & 上 0x2FFF 0000 == 0x2000 0000就知道APP区的程序是否有问题?
1.对于STM32 内部SRAM是从0x20000000开始的,如果是64k的SRAM那么它的范围是 0x2000 0000 ~ 0x2000 FFFF

2.看图片的上的解释,则有栈顶地址:(*(__IO uint32_t *)0x08003000),再把(栈顶地址&0x2FFF 0000 == 0x2000 0000),前面的表达式就是判断栈顶地址的高16位是否全为0,如果高16为有一位为1,代表栈顶地址超出了 0x2000 FFFF
栈顶地址都有错误,证明APP区的程序肯定跑不起来,设置错误的栈顶地址就会死机了。间接证明了APP区的程序不对。

以上示例是假设MCU的SRAM是64k大小范围是: 0x2000 0000 ~ 0x2000 FFFF,如果是128k大小范围是:0x2000 0000 ~ 0x2001 FFFF,需要(栈顶地址&0x2FFE 0000 == 0x2000 0000)。
补充:

- 复位函数

利用MDK内置的特殊变量自动设置中断向量表
MDK 里面内置的特殊变量有很多,其中包括:
1 | extern int Image$$ER_IROM1$$Base; // ROM1的开始地址在MDK里面设置的,依据下图设置这个值保存在0x8003000地址 |

- MDK的.map文件路径


通过查看.map文件,找到
Image$$ER_IROM1$$Base这个变量保存的地址确实是0x8003000,也就是MKD选项里设置的ROM1开始地址。注意是这个变量的保存在0x8003000地址,不是这个变量的值等于0x8003000,所以要得到0x8003000应该写成:
(uint32_t)&Image$$ER_IROM1$$Base。
示例:

图片上等效于:#define VECT_TAB_OFFSET 0x3000U
- 本文作者: 龙兄嵌入式
- 本文链接: https://hexo.880755.xyz/1970/01/01/zblog/download/100.检测APP区的栈顶地址是否合法/