您的位置 首页 技术

使用ST供给的USB例程完成USB IAP功用

我们知道ST推出的Cortex-M3平台STM32内部有两个Flash区域,一是SystemFlash,ST官方保留的一个区域,用于存放IAP代码。该区域不对用户开…

咱们知道ST推出的Cortex-M3渠道STM32内部有两个Flash区域,一是System Flash,ST官方保存的一个区域,用于寄存IAP代码。该区域不对用户敞开,仅供给UART的通讯接口用于IAP晋级;另一个区域是User Flash,这一部分是供用户自在运用的。STM32自带USB 2.0 Device接口,假如需求经过USB接口来完成IAP功用需求怎么做呢?这儿介绍怎么使用ST STM32xx USB Development Kit供给的DFU代码来完成上述功用。我用STM3210EVB来演示这个功用。

下列过程将介绍怎么经过ST官方的USB晋级代码完成程序的下载更新的功用(IAP)。

1、翻开STM3210B-EVAL demonstration software压缩包,在STM3210B-EVAL demonstration software/Demo/source下翻开main.c文件,找到void InterruptConfig(void) 函数

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

这儿咱们需求修正代码的中止矢量开端地址,这样做的意图是为了处理IAP代码在Flash寄存的区域与Application Code部分的寄存空间不会产生地址抵触。这儿咱们假定IAP寄存在User Flash的0x08000000~0x08003FFF区域,Application code寄存在User Flash的0x08004000~0x0801FFFF区域。因为Application code的开端地址是由0x08004000开端,这样咱们需求为使用代码的中止向量地址做一个重映射。因而咱们修正该代码为:

/* 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

在编译的时分请保证Project->Options->Linker->Config标签下的链接指令文件挑选的是上述lnkarm_flash.xcl文件;

3、使用部分改好,现在咱们修正USB固件晋级部分的代码,翻开STM32F10xxx USB developer kit开发包。

4、在开发包下面找到 /STM32F10xUSBLib/USBLib/demos/Device_Firmware_Upgrade例程,该例程是一个在STM32F10xx系列MCU上完成运转在User Flash区域的IAP自晋级代码,经过STM32本身供给的USB接口完成。在/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 */

这段代码的功用是对使用部分的代码开端地址做判别,这儿的地址与咱们之前的过程1、2都是对应的。

相同这个代码做如下更改:
/* 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的网站中找到USB IAP的PC端用于程序DfuSe USB Device Firmware Upgrade,装置后履行DfuSe Demonstration程序。

CortexM3的中止向量表处理比ARM7方便了许多,它能够设定中止向量表的开端方位,而ARM7假如要完成IAP,则必须用“两级跳”的方法来完成中止处理,即中止到来时先跳到0地址为开端地址的相应中止进口,这个进口实践又是一个跳转,它跳转到RAM中的中止向量表(体系发动后需求注册相关中止向量到此方位),从而进入ISR。所以说CortexM3体系能够有N个中止向量表,只需修正一下开端地址就能够了。

部分回帖

.ApplicationAddress对应着你的使用程序”stm32f10x_vector.c”这个文件中的__vector_table
*(__IOuint32_t*)ApplicationAddress与__vector_table[0]是相同的
*(__IOuint32_t*)(ApplicationAddress+4)与__vector_table[1]是相同的
__vector_table[0]是使用程序栈的顶
__vector_table[1]是使用程序的发动地址

(X&0x2FFE0000)==0x20000000意思是说X是不是在0x20000000与0x2001FFFF之间,即栈顶是不是在以0x20000000开端的128K 的范围内,这儿就是STM32的RAM区域,尽管现在最大的只要64k

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/276741.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部