<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 利用ST提供的USB例程實現(xiàn)USB IAP功能

          利用ST提供的USB例程實現(xiàn)USB IAP功能

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

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

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

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

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

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

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

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

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

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

          由于我們的目標(biāo)應(yīng)用代碼將是在0x08004000區(qū)域運(yùn)行,因此我們修改為:

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

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

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

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

          4、在開發(fā)包下面找到 /STM32F10xUSBLib/USBLib/demos/Device_Firmware_Upgrade例程,該例程是一個在STM32F10xx系列MCU上實現(xiàn)運(yùn)行在User Flash區(qū)域的IAP自升級代碼,通過STM32自身提供的USB接口實現(xiàn)。在/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 */

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

          同樣這個代碼做如下更改:
          /* 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,安裝后執(zhí)行DfuSe Demonstration程序。

          本文引用地址:http://www.ex-cimer.com/article/201611/317720.htm

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

          部分回帖

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

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



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

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();