1樓:匿名使用者
有一種方法(我自己驗證過的):還是從片內flash啟動,啟動後將程式從外部spi介面的flash(容量比較大,我用的是4m的**)將程式拷貝到片外ram,最後將**重定位到片外的ram上執行。
過程比較麻煩,而且需要有外部spi介面的flash,和片外ram,但好處也顯而易見,那就是**長度將不受片內flash的限制。
2樓:
你這是把stm32當arm9用呀,你可以看看arm9,a8,a9的啟動過程呀,你看看stm32有哪些功能麼?就不要想這些,就算能那速度慢成渣了,本來主頻就慢,還在外部執行,又浪費一些匯流排週期。之前我也想過,要在外部執行都是需要初始化外部儲存器的,以模擬arm9,a8,a9的啟動過程,首先從stm32內部flash啟動,裡面寫個uboot,出初始化stm32的fmc或者fsmc介面上的norflash或者sram或者sdram,如果程式存在nandflash上,還要初始化nand,然後把nand拷貝到sdram或者norflash或者sram;然後uboot跳到拷貝程式的地方執行;stm32還要設定mpu,讓匯流排可以訪問到fmc或者fsmc的位址空間;這還是理論,更本沒法實施,所有的位址控制都要自己手動操作,我想著都頭痛了,而且自己又不對cortex-m3或者cortex-m4了解的很透徹,中間遇見的問題可想而知,你有足夠的時間可以想想,但是那樣還不如直接用cortexa系列,別人硬體就支援這些外部啟動。。。
stm32程式裡定義的陣列是存到flash裡還是sram
3樓:
arm晶元復位後都是從0x0000 0004位址啟動。stm32會轉入一段自己的bootloader。然後根據boot引腳,選擇啟動位置。
如果是flash則跳轉到0x0800 0000(不知道位址有沒記錯)執行。
程式一般指定flash的位址是鏈結位址(arm使用絕對位址,執行和鏈結位址必須一致)。
陣列分2類,用const標示的常量陣列,普通陣列。
const陣列一般位於flash中的乙個特定位置。
普通陣列位於堆,一般是ram的低位址往上生長。
陣列的初值存在flash中,即rodata段,開機時通過一段程式(通常是彙編) ,拷貝到位址的ram中。
如果陣列沒給初值,會通過bss段全部清成0。
如果是用keil、iar等不用關心這些。因為這些設定建立工程時候都已經做好了(鏈結位址&啟動檔案)。
從初學者使用的角度建議,陣列要賦初值,即使是0。
stm32學習困惑,stm32 學習困惑 30
正點原子的iap例程,應該能幫到你一點。stm32的內部快閃記憶體 flash 地址起始於0x08000000,一般情況下,程式檔案就從此地 址開始寫入。此外stm32是基於cortex m3核心的微控制器,其內部通過一張 中斷向量表 來響應中斷,程式啟動後,將首先從 中斷向量表 取出復位中斷向量執...
對於stm32為什麼,對於STM32,為什麼 GPIOA CRH 0X0F0FFFFF 的意思是PA13,15設定成輸入,線上等
認真看下手冊,下面是我引用的一段,應該能助你理解了 埠低配置暫存器暫存器的復位值為0x4444 4444,復位值其實就是配置埠為浮空輸 入模式。stm32的crl控制著每個io埠 a g 的低8位的模式。每 個io埠的位占用crl的4個位,高兩位為cnf,低兩位為mode。這裡我們可以記住幾個 常用...
stm32復位問題,STM32微控制器的復位問題
stm32復位腳有內部上拉電阻,執行是沒什麼問題,只是沒辦法手動復位而且上電覆位不可靠,最好接個104左右的電容到復位腳,確保上電時可靠復位。 這個疏忽不應該,但也可以理解。軟體復位是指程式執行過程中,通過向控制暫存器寫入特定資料,實現復位。現在你沒有硬體復位電路,程式啟動都成問題,怎麼實行軟體復位...