1. 程式人生 > >在IAR除錯stm32中斷偏移的奇怪現象

在IAR除錯stm32中斷偏移的奇怪現象

今天在做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處取資料,而是偵錯程式告訴了微控制器中斷向量的位置,至於原因暫時我還不懂,先記下來,避免以後再入坑.