历史上的今天
今天是:2024年12月11日(星期三)
2018年12月11日 | 在IAR调试stm32中断偏移的奇怪现象
2018-12-11 来源:eefocus
今天在做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按键中断点灯
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 去年,消费者购买了十亿多部手机,2.2亿台笔记本电脑,1.4亿只MP3,9千万数码相机(DSC)以及1千万套个人导航设备(PND)。依据内部系统架构来说,所有的这些设备都有一定的共性。首先,它们都是由 ...… 查看全部问答> |
|
调试嵌入式系统设计中的串行总线 今天,嵌入式系统几乎遍布在人类社会的每个角落。嵌入式系统可以简单定义为属于大型系统或机器一部分的一种专用计算机系统,其目的是为该系统或机器提供监测和控制服务。典型的嵌入式系统在开机时会开始运行某些专 ...… 查看全部问答> |
|
我们经常利用工控机USB给产品download软件,但是一台工控机给最多只能查10条USB下载线分别给10台产品下软件,如何提升工控机效率,加DDR2都没有效果… 查看全部问答> |
|
我想用一个HINSTANCE类型的全局变量hInst保存在WinMain函数中初始化过的hInstance对象,即:hInst = hInstance,调试的时候发现hInstance有值,而hInst没有,为什么啊?… 查看全部问答> |
|
这个文档是以前在某个地方下的,一直与实践结合学习着。感觉是一篇非常不错的文档。。 里面对UCOSII的每一条语句都进行了解释说明,而且易懂。。 &nbs ...… 查看全部问答> |
|
我现在有一个需求.要做一个RF遥控开关,只有一个控制按键,在欧洲使用,并且能在水下工作.请大家介绍一些这样的RF 传送介绍IC,越便宜越简单的越好.注意:这里的RF只做控制用,无数据传输等需求.谢谢… 查看全部问答> |




