keil中设置的flash(irom)的起始地址为0x08000000,这个0x08000000的意义------stm32地址映射图解析
STM32的存儲映射是靠基地址和地址偏移實現的。
32位的M3有4GB的尋址空間(程序員編程使用的編程地址),其中用于片上外設的有512MB,基地址為0x40000000
M3各外設基地址,包括片上外設、片上靜態RAM和FLASH。特別要注意的是所有外設都是掛載在總線上,有AHP、APB1、APB2總線。從各外設基地址定義就可以很清楚知道該外設是掛在哪個總線上。
左邊是實際的外設物理地址(flash也屬于外設),右邊是虛擬的地址,對應32位的M3的4GB的尋址空間
上圖是STM32的存儲器地址映射圖,地址范圍為:0x0000_0000-0xFFFF_FFFF;其中代碼區的地址是從0x0800_0000開始的,結束于0x0800_0000+芯片的Flash的大小,RAM的起始地址是0x2000_0000,結束于0x2000_0000+芯片的RAM大小。
支持位帶操作的兩個內存區的范圍是: 0x2000_0000‐0x200F_FFFF( SRAM 區中的最低 1MB) 0x4000_0000‐0x400F_FFFF(片上外設區中的最低 1MB)
其中對于SRAM位帶區的某個比特位,假設它的地址為Addr,位序號為n(0<=n<=7),則該比特在別名區的地址為: Bit_Addr=0x22000000+((Addr-0x20000000)*8+n)*4=0x22000000+(Addr-0x20000000)32+n4;
對于片上外設位帶區的某個比特位,假設它的地址為Addr,位序號為n(0<=n<=7),則該比特在別名區的地址為: Bit_Addr=0x42000000+((Addr-0x40000000)*8+n)*4=0x42000000+(Addr-0x40000000)32+n4;
原文鏈接:https://blog.csdn.net/struct_1/article/details/54576120
從庫函數解析STM32地址映射
https://blog.csdn.net/acelit/article/details/100945938?ops_request_misc=&request_id=&biz_id=102&utm_term=stm32%E5%9C%B0%E5%9D%80%E6%98%A0%E5%B0%84%E5%9B%BE&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-4-100945938.pc_search_result_control_group&spm=1018.2226.3001.4187
STM32內部Flash讀寫問題
https://blog.csdn.net/qq_40147893/article/details/107423621?ops_request_misc=&request_id=&biz_id=102&utm_term=%E4%B8%BA%E4%BB%80%E4%B9%88ram%E7%9A%84%E8%B5%B7%E5%A7%8B%E5%9C%B0%E5%9D%80%E4%B8%BA0x08000000&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-107423621.pc_search_result_control_group&spm=1018.2226.3001.4187
1.先熟悉所用MCU的Flash存儲大小以及扇區地址
2MB分成 2個塊:Bank1和 Bank2,每個塊有8個128K的用戶扇區和1個128K的系統扇區,所以用戶可用的Flash大小為2×8×128=2048KB,也就是2MB。
閃存模塊組織表:
從下圖看flash的實際物理地址
為什么STM32從Flash地址0x08000000的啟動重映射
https://blog.csdn.net/a514371309/article/details/77972199?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164100766816780366519524%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164100766816780366519524&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-77972199.pc_search_result_control_group&utm_term=%E4%B8%BA%E4%BB%80%E4%B9%88flash%E7%9A%84%E8%B5%B7%E5%A7%8B%E5%9C%B0%E5%9D%80%E4%B8%BA0x80000000&spm=1018.2226.3001.4187
在初寫STM32程序時,遇到一個困惑,STM32的Flash在MDK里被設置為起始地址0x0800 0000,而CM3手冊規定芯片復位時要從0x0000 0000地址開始取出中斷向量 ,那STM32怎么樣執行代碼呢?地址重映射?或者在0x0000 0000里有對應有實際存儲器?
仔細閱讀手冊,發現這件事是因為STM32設計的Flash起始地址是在0x0800 0000位置開始的。全部代碼都只能從這里開始存儲。詳見STM32 referenc manual手冊第54頁。
那既然從這里才能存儲代碼,就必須在MDK里設置Flash地址為0x0800 0000,下面是MDK設置頁面,這個應該都看到過。
這樣就還有一個問題,理論上,CM3中規定上電后CPU是從0地址開始執行,但是這里中斷向量表卻被燒寫在0x0800 0000地址里,那啟動時不就找不到中斷向量表了?既然CM3定下的規矩是從0地址啟動,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函數都還沒進,看起來中斷向量的重映射位置還是夠早的。
總結
以上是生活随笔為你收集整理的keil中设置的flash(irom)的起始地址为0x08000000,这个0x08000000的意义------stm32地址映射图解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第1章 持续交付2.0
- 下一篇: 为现代服务业注入高新技术“密码”