今天在做STM32F207 bootloader时发生了一个诡异的事情,在IAR中将我的APP函数中断偏移设置为
即偏移了64KB,前64KB用于放置bootloader程序.编译连接最后生成map,查看也没出错
然后在IAR中下载调试(在此之前还没有下载bootloader):
竟然可以找到复位函数的入口,全速运行,程序正常执行.
按照ST官网的手册一般情况下,在复位后程序,程序从地址0x00000000读取堆栈地址,0x00000004取PC指针,0x00000000地址一般情况为0x08000000的映射,,
图中1就是2的别名,他们的数据能容是相同的.
我偏移了0x00010000后,理论上是应该从0x00010000(即0x08010000)取堆栈地址0x00010004(即0x08010004)取复位指针,这样执行似乎也是对的呀.
问题来了:在复位后STM32总是从0x00000000(不管被影射的那个地址RAM或者ROM或者外部FALSH) 处执行,但是此时0x00000000处并没有放置中断向量表,我的程序是如何知道向量表在0x00010000处(请不要带入上帝视角,单片机很单纯,你不告诉他就不知道)的呢?
0x00000000和0x08000000确实没有放置中断表,还是未开发的处女地
可以看到0x00010000和0x08010000放置了中断表,从此地址连续多个字节数据相同(上面两张图显示的格式不同,其实内容是相同的,有的数据时16位的,有的是32位).
由此我猜到了两个原因导致了这个现象
1.ST数据手册是错的,程序根本不是从0x00000000开始执行的,可能有某个数据被编译进了某个寄存器,一复位就中断偏移了?
2.调试器搞得鬼,不知森么鬼?
对于1我查看了中断偏移寄存器,如下:
根本没有偏移值,反复试验了多次,确实没有偏移
对于2,我拔掉了调试器,果然程序启动不了了,看来确实是调试器的问题,调试复位时并没有从0x00000000处取数据,而是调试器告诉了单片机中断向量的位置,至于原因暂时我还不懂,先记下来,避免以后再入坑.
上一篇: STM32启用Bootloader支持配置
下一篇:stm32按键中断点灯
推荐阅读最新更新时间:2024-03-16 16:19