即偏移了64kb,前64kb用於放置bootloader程式.編譯連線最後生成map,檢視也沒出錯
竟然可以找到復位函式的入口,全速執行,程式正常執行.
按照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中斷優先順序 STM32中斷系統
stm32 中斷非常強大,幾乎每個外設都可以產生中斷,因此這裡我們單獨使用一章來介紹它,為後面介紹外設中斷做鋪墊。學習本章可以參考 stm32f10x中文參考手冊 9 中斷和事件章節,cortex m3 權威指南 中文 chpt08 nvic與中斷控制章節。中斷概念 在學習 51 微控制器時,我們就...
STM32中斷巢狀
cortex m3核心支援256個中斷,其中包括16個核心中斷和240個外部中斷,且具有256級的可程式設計中斷設定,而stm32只用了其中一部分。stm32有84個中斷,包括16個核心中斷和68個可遮蔽中斷,具有16級可程式設計中斷優先順序。而我所使用的103系列只有60個可遮蔽中斷。優先順序的判...
STM32 中斷使用
stm32中斷有時候用多了容易亂,特此記錄一下,因為之前一直是m3 m0交叉用,韌體庫有些區別容易弄混,這裡說一下m3外部中斷的配置 步驟 1.將對應的io配置為輸入 2.將io對應的中斷的優先等級用nvic配置好 3.設定好對應io的中斷模式和觸發方式 4.將io所屬的中斷線設為中斷輸入源 1 以...