网站导航:首页 > 论坛 > USB > 帖子浏览
   您正在浏览第 579 号帖子 收藏该帖

楼主 作者:强强  发表时间:2009-9-9 16:09:05

转贴,根据ST提供的 USB 例程实现 USB 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来演示这个功能。

  请先下载下列代码压缩包和应用软件:

1、STM3210B-EVAL demonstration software v1.1.zip

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

2、STM32F10xxx USB developer kit v1.0.zip

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

3、DfuSe USB Device Firmware Upgrade v2.2.zip

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. /* Set the Vector Table base address at 0x08000000 */       
  2.    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);     
  
  这里我们需要修改代码的中断矢量起始地址,这样做的目的是为了处理IAP代码在Flash存放的区域与Application Code部分的存放空间不会发生地址冲突。这里我们假设IAP存放在User Flash的0x08000000~0x08003FFF区域,Application code存放在User Flash的0x08004000~0x0801FFFF区域。因为Application code的开始地址是由0x08004000开始,这样我们需要为应用代码的中断向量地址做一个重映射。因此我们修改该代码为:

  1. /* Set the Vector Table base address at 0x08004000 */    
  2.     NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);     
  
  请注意这里NVIC_SetVectorTable函数的型参送入的是相对偏移地址,而不是绝对地址;

2、在STM3210B-EVAL demonstration software\Demo\project\EWARM下找到lnkarm_flash.xcl文件,在XCL文件中找到下面的配置,该配置用于定制应用代码在Flash区域的存放空间和代码运行是RAM可以提供的空间。

  1. // Code memory in FLASH    
  2. -DROMSTART=0x8000000    
  3. -DROMEND=0x803FFFF    
  4.   
  5. // Data in RAM    
  6. -DRAMSTART=0x20000000    
  7. -DRAMEND=0x20004FFF    
  由于我们的目标应用代码将是在0x08004000区域运行,因此我们修改为:

  1. // Code memory in FLASH    
  2. -DROMSTART=0x8004000    
  3. -DROMEND=0x801FFFF    
  4.   
  5. // Data in RAM    
  6. -DRAMSTART=0x20000000    
  7. -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行:

  1. if (DFU_Button_Read() != 0x00)    
  2. {    
  3.     /* Test if user code is programmed starting from address 0x8003000 */    
  4.                if (((*(vu32*)0x8003000) & 0x2FFF0000 ) == 0x20000000)    
  5.                {    
  6.       /* Jump to user application */    
  7.                 JumpAddress = *(vu32*) (ApplicationAddress + 4);    
  8.                  Jump_To_Application = (pFunction) JumpAddress;    
  9.   
  10.                  /* Initialize user application's Stack Pointer */    
  11.                  __MSR_MSP(*(vu32*) ApplicationAddress);    
  12.                 Jump_To_Application();    
  13.                }        
  14.   } /* Otherwise enters DFU mode to allow user to program his application */    
  这段代码的功能是对应用部分的代码开始地址做判断,这里的地址与我们之前的步骤1、2都是对应的。

  同样这个代码做如下更改:

  1. /* Test if user code is programmed starting from address 0x8004000 */    
  2. if (((*(vu32*)0x8004000) & 0x2FFF0000 ) == 0x20000000)  
5、hw_config.h中定义:
  1. #define ApplicationAddress 0x08003000   
改为

  1. #define ApplicationAddress 0x08004000   
编译代码,下载到STM3210 Evaluation Board。

6、在ST的网站中找到USB IAP的PC端用于程序DfuSe USB Device Firmware Upgrade,安装后执行DfuSe Demonstration程序。



7、改变STM3210 Evaluation Board的Boot选项为user Flash启动,启动时PC端Dfu中可以看到找到了开发板。




   如果提示需要找到新的设备,需要安装驱动,请将路径指向Dfu的安装路径下driver目录。如果Dfu中无法看到找到开发板,请按住Reset键再松开;如果按下Key键,STM32中运行的Dfu程序将退出IAP状态,PC跳到事先设置的应用程序的入口。

  Dfu提示找到STM3210EVB,显示需要编程的区域,一个是SPI Flash,另一个是STM32内部的Flash。



  SPI Flash的内容主要是提供LCD演示的图象和语言数据,需要写入的文件在STM3210B-EVAL demonstration software开发包的目录\STM3210B-EVAL_Demo\images下的STM3210B-EVAL_SPIFlash.dfu文件。

  STM32内部Flash需要写入的目标代码是前面修改的应用代码而不是USB IAP代码。这里需要注意的是IAR编译后的文件格式可以是S19、hex、bin,但Dfs烧写需要的文件是dfu格式,该格式可以通过安装的dfu文件下的DFU File Manager程序来转换得到。
 
8、上述的解释同样适用于STM32F10x系列在User flash区域的IAP代码操作流程,如UART BootLoader。需要注意的是这里介绍的UART IAP与STM32本身固化在System Flash区域通过UART升级的IAP不是完全相同的,尽管实现的功能一样。

9、执行玩上述步骤以后,确认STM3210EVB的Boot跳线为User Flash启动。Reset后你就可以看到在STM3210EVB上出现漂亮的GUI啦。

补充:
  在ST官方提供的USB IAP例程中我们可以在main.c中找到:

  1. if (DFU_Button_Read() != 0x00)    
  2. {    
  3.   …………    
  4. }    
  通过该函数我们可以知道,USB IAP是通过判断PB.09端口的高低电平实现地址跳转的,对于其它形式的STM32电路板,我们可以仅仅简单的修改一下这个判断方式,即可利用ST提供的现成代码简单快速的实现USB IAP下载功能。



回复楼主
第1楼 作者:guiziliu  发表时间:2009-11-26 17:30:13

楼主确实强,非一般人



回复楼主    回复第1楼

 
 
本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4