利用ST提供的USB例程实现USB IAP功能

[STM32入门]---利用ST提供的USB例程实现USB IAP功能

 我们知道ST推出的Cortex-M3平台STM32内部有两个Flash区域,一是System FlashST官方保留的一个区域,用于存放IAP代码。该区域不对用户开放,仅提供UART的通讯接口用于IAP升级;另一个区域是User Flash,这一部分是供用户自由使用的。STM32自带USB 2.0 Device接口,如果需要通过USB接口来实现IAP功能需要如何做呢?这里介绍如何利用ST STM32xx USB Development Kit提供的DFU代码来实现上述功能。我用STM3210EVB来演示这个功能。

    
阅读前请下下载下列代码压缩包和应用软件:
1
STM3210B-EVAL demonstration software v1.1.zip
 STM3210B-EVAL demonstration software v1.1..zip(文件大小
:2.15M) 

   ST官方的下载路径:
   http://www.st.com/stonline/products/support/micro/files/um0435.zip

2
STM32F10xxx USB developer kit v1.0.zip
 STM32F10xxx USB developer kit v1.0.zip (文件大小
:461K) 

   ST官方的下载路径:
   http://www.st.com/stonline/products/support/micro/files/um0424.zip

3
DfuSe USB Device Firmware Upgrade v2.2.zip
 DfuSe USB Device Firmware Upgrade v2.2.zip (文件大小
:7.85M) 

   ST官方的下载路径:
   http://www.st.com/stonline/products/support/micro/files/um0412.zip

    
上述文档对于的用户参考手册,请自行到ST MCU网站下载。
    http://www.st.com/mcu/familiesdocs-110.html#Application%20Note


    
下列步骤将介绍如何通过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 Flash0x080000000x08003FFF区域,Application code存放在User Flash0x080040000x0801FFFF区域。因为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 application's Stack Pointer */
               __MSR_MSP(*(vu32*) ApplicationAddress);
              Jump_To_Application();
               }    
  } /* Otherwise enters DFU mode to allow user to program his application */

    
这段代码的功能是对应用部分的代码开始地址做判断,这里的地址与我们之前的步骤12都是对应的。

    
同样这个代码做如下更改:
        /* 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 IAPPC端用于程序DfuSe USB Device Firmware Upgrade,安装后执行DfuSe Demonstration程序。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值