搜索
bottom↓
回复: 116

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

  [复制链接]

出0入8汤圆

发表于 2008-4-2 15:38:26 | 显示全部楼层 |阅读模式
我们知道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
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 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 application's 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程序。

  

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中找到:
if (DFU_Button_Read() != 0x00)
{
…………
}

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


本文PDF格式:
利用ST提供的USB例程实现USB IAP功能.pdf(文件大小:254K)

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2008-4-2 16:10:18 | 显示全部楼层
不错.但是这个bootloader太大了吧.还是串口的好用点.自己写也不要多少代码的.

出0入8汤圆

 楼主| 发表于 2008-4-2 16:17:13 | 显示全部楼层
要是有512K的空间我要不这样用,着实有些浪费了它。ST也有提供在User Flash运行的通过UART下载的Bootloader,不是System Flash的那个。在ST的网站上可以下载到应用笔记和对应的参考代码。我的小黑上没有UART接口,我没有试过这个应用代码。

定义使用0x4000空间只是告诉如何直接修改ST的代码,并非说这个代码就要占用掉这么大的空间。如果说要真的想节省空间最好的办法就是使用UART的口线控制Boot和Reset引脚,安装ST提供的Bootloader的通讯协议写一个上位机的程序,直接利用STM32固化的IAP来升级,用户空间零占用。

只是不好的一点如果你需要在升级的时候加点什么加密的功能,估计就没有自己在User Flash里面做的要方便了。

出0入0汤圆

发表于 2008-4-2 16:26:05 | 显示全部楼层
过两天我来贴个stm32的串口bootloader程序吧.尽量写的短一点.

出0入0汤圆

发表于 2008-4-2 19:28:05 | 显示全部楼层
顶你! heky


过两天我来贴个stm32的串口bootloader程序吧.尽量写的短一点.



期待!

出0入0汤圆

发表于 2008-4-2 21:36:00 | 显示全部楼层
我留个记号先

出0入0汤圆

发表于 2008-4-2 23:25:30 | 显示全部楼层
Cortex-M3很强大,很有前途!
头像被屏蔽

出0入0汤圆

发表于 2008-4-3 00:44:45 | 显示全部楼层
谢谢共享。

出0入0汤圆

发表于 2008-8-1 22:43:41 | 显示全部楼层
最近关注SMt32的紧,好贴不怕藏的深,挖!

出0入0汤圆

发表于 2008-8-2 00:28:57 | 显示全部楼层
为什么不用USB接口实现CDC串口,在这个串口上实现STM32的ISP协议,使用起来感觉更加方便

出0入0汤圆

发表于 2008-8-2 09:17:10 | 显示全部楼层
这个不顶不行,开始进军STM!!

出0入0汤圆

发表于 2008-8-2 21:03:01 | 显示全部楼层
顶.

出0入0汤圆

发表于 2008-8-10 21:58:54 | 显示全部楼层
以下蓝色文字由版主:bluelucky 于:2008-08-10,21:58:54 加入。
<font color=black>请发贴人注意:
本贴放在这分区不合适,即将移走
原来分区:[1032]ARM技术论坛
即将移去的分区:[3011]Cortex-M3技术讨论区
移动执行时间:自本贴发表0小时后

任何的疑问或咨询,请可随时联系站长。谢谢你的支持!
</font>

出0入0汤圆

发表于 2008-8-29 12:17:57 | 显示全部楼层
学习~

出0入0汤圆

发表于 2008-9-8 00:48:26 | 显示全部楼层
学习中

出0入0汤圆

发表于 2008-11-3 03:10:00 | 显示全部楼层
好好!

出0入0汤圆

发表于 2008-11-3 09:08:35 | 显示全部楼层
标签&nbsp;&nbsp;期待串口IAP教程

出0入0汤圆

发表于 2008-11-11 22:16:28 | 显示全部楼层
谢谢共享!!!

出0入0汤圆

发表于 2008-11-11 23:05:51 | 显示全部楼层
好贴!

出0入0汤圆

发表于 2008-11-18 14:17:40 | 显示全部楼层
我下载时出错,读写地址不一致.是什么问题啊~~

出0入0汤圆

发表于 2009-2-18 13:55:09 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-2-24 08:49:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-2-25 15:08:09 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-2-26 16:48:25 | 显示全部楼层
非常不错

出0入0汤圆

发表于 2009-3-13 23:53:41 | 显示全部楼层
IAP和ISP有啥区别

出0入0汤圆

发表于 2009-3-25 21:23:24 | 显示全部楼层
非常不错

出0入0汤圆

发表于 2009-4-9 09:43:56 | 显示全部楼层
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();
               }     
可以讲解一下这段程序吗?
第一个问题:((*(vu32*)0x8003000) & 0x2FFF0000 )这个不是始终都等于0x0800 0000吗?什么时候会等于0x2000 0000。那么程序怎么跳到应用区里面呢?
第二个问题:__MSR_MSP(*(vu32*) ApplicationAddress);在cortexm3_macro.s 找到__MSR_MSP函数,但是怎么会有(*(vu32*) ApplicationAddress)参数的呢?
第三个问题:找不到Jump_To_Application()这个函数的?

出0入20汤圆

发表于 2009-4-9 10:05:55 | 显示全部楼层
正想用这个东西

出0入0汤圆

发表于 2009-9-8 01:40:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-27 15:18:00 | 显示全部楼层
马克兔

出0入0汤圆

发表于 2009-11-23 17:05:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-12 20:30:01 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-12-20 13:50:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-8 18:13:09 | 显示全部楼层
不错,但是费空间

FLASH容量大的用还差不多

产品中好像有一种通过U盘升级的

将要下载的代码放到U盘,再插入设备中,通过界面来选择。

不知道这样做,代码会不会被人抄出来

出0入0汤圆

发表于 2010-1-14 11:56:21 | 显示全部楼层
make

出0入0汤圆

发表于 2010-1-15 17:26:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-24 11:59:09 | 显示全部楼层
马可

出0入0汤圆

发表于 2010-1-25 10:11:56 | 显示全部楼层
多谢楼主的资料,我也应用成功

发出学习笔记,共享一下

STM32的IAP应用(串口和USB方式)
http://blog.ednchina.com/liu_xf/371575/message.aspx

出0入0汤圆

发表于 2010-2-3 20:41:06 | 显示全部楼层
强悍!

出0入0汤圆

发表于 2010-4-13 02:01:11 | 显示全部楼层
不错。标记一下,正在接触STM32

出0入0汤圆

发表于 2010-7-31 14:23:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-31 15:15:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-4 17:43:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-4 22:46:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-4 23:08:00 | 显示全部楼层
记号!非常不错!帮顶。

出0入0汤圆

发表于 2010-8-11 19:20:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-18 21:09:55 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-8-18 23:37:08 | 显示全部楼层
mark

出0入85汤圆

发表于 2010-8-19 08:29:23 | 显示全部楼层
标记一下

出0入0汤圆

发表于 2010-10-26 17:00:30 | 显示全部楼层
make

出350入8汤圆

发表于 2010-10-26 17:33:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-2 16:20:37 | 显示全部楼层
很好,学习了

出0入0汤圆

发表于 2010-12-2 18:53:12 | 显示全部楼层
正需要这个哈。

出0入0汤圆

发表于 2010-12-9 09:33:39 | 显示全部楼层
记录参考。在线更新真的很重要。

出0入0汤圆

发表于 2010-12-17 12:43:01 | 显示全部楼层
谢谢楼主的分享,这么好的东西怎能不顶呢!

出0入0汤圆

发表于 2010-12-17 18:04:37 | 显示全部楼层
有用

出0入0汤圆

发表于 2011-1-10 11:32:52 | 显示全部楼层
强啊

出0入0汤圆

发表于 2011-3-8 11:13:21 | 显示全部楼层
支持啊!

出0入0汤圆

发表于 2011-3-25 16:27:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-27 22:42:30 | 显示全部楼层
留个脚印

出0入0汤圆

发表于 2011-6-6 08:23:37 | 显示全部楼层
很好的资料!MARK

出0入0汤圆

发表于 2011-6-6 10:27:22 | 显示全部楼层
hao .....好东西

出0入0汤圆

发表于 2011-6-8 14:00:49 | 显示全部楼层
很好,还在期待!

出0入0汤圆

发表于 2011-7-9 19:15:48 | 显示全部楼层
即将用到,先MARK。

出0入0汤圆

发表于 2011-7-12 18:51:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-24 22:10:26 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-8-1 17:30:57 | 显示全部楼层
mark!
!

出0入0汤圆

发表于 2011-8-2 08:00:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-2 08:27:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-5 21:09:14 | 显示全部楼层
mark!

出10入12汤圆

发表于 2011-8-6 12:57:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-22 13:19:21 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-8-29 21:25:58 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-9-5 10:40:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-7 09:09:50 | 显示全部楼层
mark stm32 usb iap

出0入0汤圆

发表于 2011-11-21 16:47:55 | 显示全部楼层
楼主,请问你用keil做过吗?我是用keil做的,但是下载后无法运行应用程序,USB IAP倒是还在。

出0入0汤圆

发表于 2011-11-21 17:39:09 | 显示全部楼层
Mark一下,以后升级软件可以直接用usb了

出0入0汤圆

发表于 2011-12-2 09:11:12 | 显示全部楼层
谢谢共享。

出0入0汤圆

发表于 2012-1-9 19:22:46 | 显示全部楼层
真是好东西,正在做这方面的

出0入0汤圆

发表于 2012-2-9 15:11:27 | 显示全部楼层
USB IAP mark

出0入0汤圆

发表于 2012-2-20 17:02:46 | 显示全部楼层
这个USB IAP如果在程序升级的过程中断电或者出现错误等其它问题,还能接着更新吗?

出0入0汤圆

发表于 2012-3-6 21:46:57 | 显示全部楼层
Mark

出0入0汤圆

发表于 2012-6-12 10:06:52 | 显示全部楼层
楼主。串口的出来了吗???

出0入0汤圆

发表于 2012-6-13 10:07:26 | 显示全部楼层
MARK!!!!!!!...谢谢分享

出0入0汤圆

发表于 2012-6-13 11:16:43 | 显示全部楼层
我也正在做这个,现在就是跳转不到用户程序中,老是出现引导程序的复位的情况,不知道怎么回事?

出0入0汤圆

发表于 2012-6-13 11:17:59 | 显示全部楼层
太诱人了!

出0入0汤圆

发表于 2012-6-18 16:10:53 | 显示全部楼层
调试成功,谢谢

出0入0汤圆

发表于 2012-8-21 00:05:45 | 显示全部楼层
收集一下iap帖子。

出0入0汤圆

发表于 2012-8-21 14:57:55 | 显示全部楼层

出0入0汤圆

发表于 2012-9-5 11:25:29 | 显示全部楼层
mark!

出0入0汤圆

发表于 2012-10-22 14:47:29 | 显示全部楼层
楼主,首先你写了那么多辛苦了,但是我想问下你,一些细节问题,你的DFU驱动是怎么装上去的,是不是要先下载一个IAP程序进懂啊板子里面,还是一些引脚设置也没有说清楚,USB的连接引脚
DFU 模式引脚,求回复,我的邮箱是506062608@qq.com;

出0入0汤圆

发表于 2012-10-22 19:27:02 来自手机 | 显示全部楼层
记号标记!

出0入0汤圆

发表于 2012-12-14 00:37:35 | 显示全部楼层
mark 回来再来看

出0入0汤圆

发表于 2013-1-14 19:44:02 | 显示全部楼层
mark 下 可能用的到

出0入46汤圆

发表于 2013-1-24 18:04:55 | 显示全部楼层
其实我一直有点好奇,这两段程序既然是完全独立的,那么ram的地址为何还要重新分配呢,反正跳至用户程序区,iap的ram也不需要了,楼主可以解答一下吗?

出0入0汤圆

发表于 2013-2-26 15:54:41 | 显示全部楼层
mark,收藏学习

出0入0汤圆

发表于 2013-7-11 23:10:15 | 显示全部楼层
期待串口的bootload

出0入0汤圆

发表于 2014-1-3 16:24:14 | 显示全部楼层
用STM32F103VET6 Internal flash显示怎么也是128K???

出0入0汤圆

发表于 2014-1-4 16:51:40 来自手机 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2014-4-20 00:52:18 | 显示全部楼层
好帖子,谢谢分享;
最近才开始研究IAP,落后太多啦。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 00:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表