<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è) > 嵌入式系統 > 設計應用 > 利用ST提供的USB例程實(shí)現USB IAP功能

利用ST提供的USB例程實(shí)現USB IAP功能

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏
我們知道ST推出的Cortex-M3平臺STM32內部有兩個(gè)Flash區域,一是System Flash,ST官方保留的一個(gè)區域,用于存放IAP代碼。該區域不對用戶(hù)開(kāi)放,僅提供UART的通訊接口用于IAP升級;另一個(gè)區域是User Flash,這一部分是供用戶(hù)自由使用的。STM32自帶USB 2.0 Device接口,如果需要通過(guò)USB接口來(lái)實(shí)現IAP功能需要如何做呢?這里介紹如何利用ST STM32xx USB Development Kit提供的DFU代碼來(lái)實(shí)現上述功能。我用STM3210EVB來(lái)演示這個(gè)功能。

下列步驟將介紹如何通過(guò)ST官方的USB升級代碼實(shí)現程序的下載更新的功能(IAP)。

1、打開(kāi)STM3210B-EVAL demonstration software壓縮包,在STM3210B-EVAL demonstration software/Demo/source下打開(kāi)main.c文件,找到void InterruptConfig(void) 函數

/* Set the Vector Table base address at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);

這里我們需要修改代碼的中斷矢量起始地址,這樣做的目的是為了處理IAP代碼在Flash存放的區域與Application Code部分的存放空間不會(huì )發(fā)生地址沖突。這里我們假設IAP存放在User Flash的0x08000000~0x08003FFF區域,Application code存放在User Flash的0x08004000~0x0801FFFF區域。因為Application code的開(kāi)始地址是由0x08004000開(kāi)始,這樣我們需要為應用代碼的中斷向量地址做一個(gè)重映射。因此我們修改該代碼為:

/* Set the Vector Table base address at 0x08004000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);

請注意這里NVIC_SetVectorTable函數的型參送入的是相對偏移地址,而不是絕對地址;

2、在STM3210B-EVAL demonstration software/Demo/project/EWARM下找到lnkarm_flash.xcl文件,在XCL文件中找到下面的配置,該配置用于定制應用代碼在Flash區域的存放空間和代碼運行是RAM可以提供的空間。

// Code memory in FLASH
-DROMSTART=0x8000000
-DROMEND=0x803FFFF

// Data in RAM
-DRAMSTART=0x20000000
-DRAMEND=0x20004FFF

由于我們的目標應用代碼將是在0x08004000區域運行,因此我們修改為:

// Code memory in FLASH
-DROMSTART=0x8004000
-DROMEND=0x801FFFF

// Data in RAM
-DRAMSTART=0x20000000
-DRAMEND=0x20004FFF

在編譯的時(shí)候請確保Project->Options->Linker->Config標簽下的鏈接命令文件選擇的是上述lnkarm_flash.xcl文件;

3、應用部分改好,現在我們修改USB固件升級部分的代碼,打開(kāi)STM32F10xxx USB developer kit開(kāi)發(fā)包。

4、在開(kāi)發(fā)包下面找到 /STM32F10xUSBLib/USBLib/demos/Device_Firmware_Upgrade例程,該例程是一個(gè)在STM32F10xx系列MCU上實(shí)現運行在User Flash區域的IAP自升級代碼,通過(guò)STM32自身提供的USB接口實(shí)現。在/STM32F10xUSBLib/USBLib/demos/Device_Firmware_Upgrade/source路徑下找到main.c文件,在56行:

if (DFU_Button_Read() != 0x00)
{ /* Test if user code is programmed starting from address 0x8003000 */
if (((*(vu32*)0x8003000) & 0x2FFF0000 ) == 0x20000000)
{ /* Jump to user application */

JumpAddress = *(vu32*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user applications Stack Pointer */
__MSR_MSP(*(vu32*) ApplicationAddress);
Jump_To_Application();
}
} /* Otherwise enters DFU mode to allow user to program his application */

這段代碼的功能是對應用部分的代碼開(kāi)始地址做判斷,這里的地址與我們之前的步驟1、2都是對應的。

同樣這個(gè)代碼做如下更改:
/* Test if user code is programmed starting from address 0x8004000 */
if (((*(vu32*)0x8004000) & 0x2FFF0000 ) == 0x20000000)

5、hw_config.h中定義:
#define ApplicationAddress 0x08003000
改為
#define ApplicationAddress 0x08004000

編譯代碼,下載到STM3210 Evaluation Board。

6、在ST的網(wǎng)站中找到USB IAP的PC端用于程序DfuSe USB Device Firmware Upgrade,安裝后執行DfuSe Demonstration程序。

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

CortexM3的中斷向量表處理比ARM7方便了很多,它可以設定中斷向量表的起始位置,而ARM7如果要實(shí)現IAP,則必須用“兩級跳”的方式來(lái)實(shí)現中斷處理,即中斷到來(lái)時(shí)先跳到0地址為起始地址的相應中斷入口,這個(gè)入口實(shí)際又是一個(gè)跳轉,它跳轉到RAM中的中斷向量表(系統啟動(dòng)后需要注冊相關(guān)中斷向量到此位置),進(jìn)而進(jìn)入ISR。所以說(shuō)CortexM3系統可以有N個(gè)中斷向量表,只要修改一下起始地址就可以了。

部分回帖

.ApplicationAddress對應著(zhù)你的應用程序"stm32f10x_vector.c"這個(gè)文件中的__vector_table
*(__IOuint32_t*)ApplicationAddress與__vector_table[0]是一樣的
*(__IOuint32_t*)(ApplicationAddress+4)與__vector_table[1]是一樣的
__vector_table[0]是應用程序棧的頂
__vector_table[1]是應用程序的啟動(dòng)地址

(X&0x2FFE0000)==0x20000000意思是說(shuō)X是不是在0x20000000與0x2001FFFF之間,即棧頂是不是在以0x20000000開(kāi)始的128K 的范圍內,這里便是STM32的RAM區域,雖然現在最大的只有64k



關(guān)鍵詞: STUSB例程IAP功

評論


技術(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>