1樓:匿名使用者
正點原子的iap例程,應該能幫到你一點。
stm32的內部快閃記憶體(flash)地址起始於0x08000000,一般情況下,程式檔案就從此地
址開始寫入。此外stm32是基於cortex-m3核心的微控制器,其內部通過一張“中斷向量表”
來響應中斷,程式啟動後,將首先從“中斷向量表”取出復位中斷向量執行復位中斷程式完成
啟動,而這張“中斷向量表”的起始地址是0x08000004,當中斷來臨,stm32的內部硬體機
制亦會自動將pc指標定位到“中斷向量表”處,並根據中斷源取出對應的中斷向量執行中斷
服務程式。
在圖53.1.1中,stm32在復位後,先從0x08000004地址取出復位中斷向量的地址,並跳
轉到復位中斷服務程式,如圖示號①所示;在復位中斷服務程式執行完之後,會跳轉到我們的
main函式,如圖示號②所示;而我們的main函式一般都是一個死迴圈,在main函式執行過程
中,如果收到中斷請求(發生重中斷),此時stm32強制將pc指標指回中斷向量表處,如圖
標號③所示;然後,根據中斷源進入相應的中斷服務程式,如圖示號④所示;在執行完中斷服
務程式以後,程式再次返回main函式執行,如圖示號⑤所示。
2樓:匿名使用者
因為stm32設計的flash起始地址是在0x0800 0000位置開始的。全部**都只能在從這裡開始儲存。詳見stm32 referenc manual手冊第54頁。
這樣就還有一個問題,理論上,cm3中規定上電後cpu是從0地址開始執行,但是這裡中斷向量表卻被燒寫在0x0800 0000地址裡,這是因為stm32的flash是從0x0800 0000開始才有。但smt32也不能破壞arm定下的“規矩”,所以它做了一個啟動對映的過程,就是和晶片上總能見到的boot0和boot1有關了,當選擇從主flash啟動模式後,晶片一上電,flash的0x0800 0000地址被對映到0地址處,不影響cm3核心的讀取,所以這時的cm3既可以在0地址處訪問中斷向量表,也可以在0x0800 0000地址處訪問中斷向量表,而**還是在0x0800 0000地址處儲存的。這就是最難理解的地方,其實,這是基本上所有arm晶片採用的啟動對映方法。
arm7,arm9沒有內部flash的通常都是這樣做的。這個過程出自stm32 referenc manual手冊,裡面是有說明的:
還要注意,這個中斷向量表是可以在程式中再次被對映的。控制它的就是cm3已經規定的nvic暫存器scb->vtor。在stm32庫中給出的啟動**裡,startup_stm32f10x_hd.
s檔案裡,第146行,是上電後讀取中斷向量表中的復位中斷位置,並執行復位中斷處理**,**如下:
; reset handler
reset_handler proc
export reset_handler [weak]
import __main
import systeminit
ldr r0, =systeminit
blx r0
ldr r0, =__main
bx r0
endp
注意復位後第一個被執行的是systeminit**,這個**在庫目錄下的system_stm32f10x.c檔案裡,它初始化了時鐘,nvic等一系列操作,這裡摘要與中斷向量有關的**:
void systeminit (void)
#ifdef vect_tab_sram
scb->vtor = sram_base | vect_tab_offset; /* vector table relocation in internal sram. */
#else
scb->vtor = flash_base | vect_tab_offset; /* vector table relocation in internal flash. */
#endif
}可以看出中斷向量重對映是一個選擇性編譯,通常巨集定義vect_tab_sram都沒有被定義,所以這裡執行結束後,scb->vtor就是flash_base了,值為0x0800 0000。以後cm3再取中斷向量裡,就會根據scb->vtor的設定,從這裡取向量執行了。中斷向量自此終於轉正。
注意這時連__main函式都還沒進,看起來中斷向量的重對映位置還是夠早的。
對於stm32為什麼,對於STM32,為什麼 GPIOA CRH 0X0F0FFFFF 的意思是PA13,15設定成輸入,線上等
認真看下手冊,下面是我引用的一段,應該能助你理解了 埠低配置暫存器暫存器的復位值為0x4444 4444,復位值其實就是配置埠為浮空輸 入模式。stm32的crl控制著每個io埠 a g 的低8位的模式。每 個io埠的位占用crl的4個位,高兩位為cnf,低兩位為mode。這裡我們可以記住幾個 常用...
stm32復位問題,STM32微控制器的復位問題
stm32復位腳有內部上拉電阻,執行是沒什麼問題,只是沒辦法手動復位而且上電覆位不可靠,最好接個104左右的電容到復位腳,確保上電時可靠復位。 這個疏忽不應該,但也可以理解。軟體復位是指程式執行過程中,通過向控制暫存器寫入特定資料,實現復位。現在你沒有硬體復位電路,程式啟動都成問題,怎麼實行軟體復位...
stm32f767採用什麼核心,stm32f767可以達到多快的速度?
雌高中生酶 我也沒學過核心,一樣能控制stm32。但是,沒有這些知識,你只會執行主管的要求,卻很難做到設計。想進一步提高,必須要學習這些基礎知識。這些我遲早也要花時間去了解下的。stm32f767可以達到多快的速度? 核心可以達到216mhz 長瀨綿秋 32的用原子的可以,隨便選擇一款,微控制器用吳...