<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32啟動(dòng)模式及API

STM32啟動(dòng)模式及API

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏
我們玩ARM9,一般都是在內存里調試程序,速度飛快。STM32下也可以這樣,雖說(shuō)現在的flash壽命已經(jīng)很長(cháng)了,但flash中調試燒錄程序還是一個(gè)很慢的過(guò)程,有時(shí)候程序上一個(gè)小小的改動(dòng)要花上幾倍的時(shí)間下載代碼,這確實(shí)是不能忍受的。

  我們也可以在開(kāi)發(fā)STM32時(shí),在內存中調試程序。
  {
STM32這顆Cortex-M3控制器,與其他許多ARM一樣,提供了BOOT0和BOOT1兩個(gè)管腳用于啟動(dòng)選擇。
BOOT1=x BOOT0=0 從用戶(hù)閃存啟動(dòng),這是正常的工作模式。
BOOT1=0 BOOT0=1 從系統存儲器啟動(dòng),這種模式啟動(dòng)的程序功能由廠(chǎng)家設置。(用于串口ISP)
BOOT1=1 BOOT0=1 從內置SRAM啟動(dòng),這種模式可以用于調試。
  在芯片上電復位時(shí),BOOT0和BOOT1兩個(gè)管腳的狀態(tài)將決定芯片從何處啟動(dòng)。

1.當BOOT0和BOOT1均設置為邏輯1時(shí),系統將從內置SRAM中啟動(dòng),這是代碼內存調試的第一個(gè)條件。
}
經(jīng)多次確認,BOOT0和BOOT1狀態(tài)與內存中調試無(wú)直接聯(lián)系

2.然后,我們需要在代碼中設置正確的中斷向量表位置。中斷向量表通常被放置在用戶(hù)程序的開(kāi)始,所以flash中運行時(shí),向量表位于0x08000000處,而當代碼被放置在SRAM中運行時(shí),他的位置就成了0x20000000。在初始化NVIC時(shí),我們可以放置如下代碼,定義向量表的位置

NVIC_SetVectorTable(0x20000000 , 0x0);

NVIC_SetVectorTable(0x08000000 , 0x0);

3. 在編譯器中,要進(jìn)行正確的設置。這里以IAR 5.4為例說(shuō)明。
3.1. 工程選項中Linker項,Config選項卡中,指定Linker Configuration File為stm32f10x_ram.icf, 該文件在FWLIB安裝包中可以獲得,IAR4和5分別有不同的配置文件。
3.2. 同樣是工程選項中Debug項,Download選項卡中,去掉所有鉤子,不下載代碼到flash

  經(jīng)過(guò)以上步驟,代碼就可以在內存中調試,下載速度飛快,調試速度也比f(wàn)lash中快了不少!

本文引用地址:http://dyxdggzs.com/article/201611/317721.htm

IAP在線(xiàn)升級

1.boot程序

(1)IROM1 起始地址:0x8000000

(2)關(guān)鍵代碼

#define ApplicationAddress0x8003000

if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user applications Stack Pointer */
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}


1,JumpAddress=*(vu32*)(ApplicationAddress+4);是把用戶(hù)代碼的復位地址賦值給JumpAddress。

2,__MSR_MSP(*(vu32*)ApplicationAddress);是把用戶(hù)代碼的堆棧地址寫(xiě)入堆棧指針

3,Jump_To_Application()是把用戶(hù)代碼的復位地址付給PC指針

if(((*(vu32*)ApplicationAddress)&0x2FFE0000)==0x20000000)
這句話(huà)的意思是把用戶(hù)代碼的首地址里面的數據拿出來(lái),看看是不是以0x20000000開(kāi)頭。

(X & 0x2FFE0000 ) == 0x20000000 意思是說(shuō)X是不是在0x20000000與0x2001FFFF之間,即棧頂是不是在以0x20000000開(kāi)始的128K
前面說(shuō)了用戶(hù)代碼的首地址放的是堆棧指針,而堆棧應該指向RAM,而RAM的首地址是0x20000000,所以這句話(huà)用來(lái)判斷是不是已經(jīng)有一個(gè)正確的堆棧指針地址寫(xiě)在了用戶(hù)代碼的首地址,進(jìn)一步可以推測是不是有一個(gè)正確的用戶(hù)代碼寫(xiě)在了用戶(hù)代碼區,如果已經(jīng)寫(xiě)入了,就可以跳過(guò)去運行,如果沒(méi)有寫(xiě)入,就不跳過(guò)去。這是DEMO程序的判斷邏輯,可以這樣用,也可以不這樣用。

2.APP程序

(1)IROM1 起始地址:0x8003000

(2)關(guān)鍵代碼

#define VECT_TAB_OFFSET 0x3000 (修改地方) //NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000); //中斷向量表映射



關(guān)鍵詞: STM32啟動(dòng)模式AP

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>