您的位置:首页 > 其它

关于 STM32 的 IAP 概念和应用笔记

2013-02-22 13:50 337 查看


版权所有 STMFANS 原创,转载请保留出处

http://www.stmfans.com/bbs/viewthread.php?tid=1446&extra=page%3D1
关于 STM32 的 IAP 概念和应用笔记

STM32的ISP方式和IAP方式下载程序有什么区别

都可以通过串口来下载啊,(也可以通过USB来下载,敬请留意 IAP 之USB篇。)

ISP方式:需要将BOOT管脚配置成上电从System Memory启动,System Memory中有一段BOOTLOADER来接收串口来的数据,把它们烧写到FLASH中。

IAP方式:是用户自己写一段烧写程序,通过ISP或者仿真器事先烧写到用户FLASH中,使用时通过某种方式触发这段程序,再来从串口接收数据,然后烧到相应的FLASH中,不需要改变BOOT管脚配置。

ISP 就是 IAP 的一种特殊的应用。

这里给出两份周立功公司的基于 LPC ARM7 IAP 两份教程作为大家的学习资料参考:


IAP在应用中编程及其应用PPT.rar

(2008-12-11 13:02:18, Size: 307 KB, Downloads: 373)


IAP在应用中编程及其应用.pdf

(2008-12-11 13:02:18, Size: 544 KB, Downloads: 365)

IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的
4000
通信口对产品中的固件程序进行更新升级。

通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:

1)检查是否需要对第二部分代码进行更新

2)如果不需要更新则转到4)

3)执行更新操作

4)跳转到第二部分代码执行

第一部分代码必须通过其它手段,如JTAG或ISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一道烧入,以后需要程序更新是再通过第一部分IAP代码更新。

对于STM32来说,因为它的中断向量表位于程序存储器的最低地址区,为了使第一部分代码能够正确地响应中断,通常会安排第一部分代码处于Flash的开始区域,而第二部分代码紧随其后。

在第二部分代码开始执行时,首先需要把CPU的中断向量表映像到自己的向量表,然后再执行其他的操作。

如果IAP程序被破坏,产品必须返厂才能重新烧写程序,这是很麻烦并且非常耗费时间和金钱的。针对这样的需求,STM32在对Flash区域实行读保护的同时,自动地对用户Flash区的开始4页设置为写保护,这样可以有效地保证IAP程序(第一部分代码)区域不会被意外地破坏。

ST的网站上有使用USART实现IAP的例子,各位可以参考这个例子和相应的手册。

应用笔记 AN2557 - STM32F10xxx in-application programming using the USART

例程:AN2557 - STM32F10xxx in-application programming using the USART

http://www.stmicroelectronics.com.cn/stonline/mcu/STM32_AN.htm
学习了概念之后,接下来我们需要做一些前期的准备工作,
(1)下载官方的例程:AN2557 - STM32F10xxx in-application programming using the USART
(2)下载豆皮的跑马灯的程序:WORM_LED.rar 
      http://www.stmfans.com/bbs/viewthread.php?tid=1031&extra=page%3D1
(3)安装 ISP 程序:STM32ISP.rar
      http://www.stmfans.com/bbs/viewthread.php?tid=1178&extra=page%3D1

(4)安装 IAR5.20 和 IAR4.22 两个版本的软件。
这时我们的准备工作已经差不多了。

修改 Bootload 程序:

由于官方的例子中是基于官方的开发板的,其中使用的触发条件为上电检测一个按键。
用 IAR5.20 打开 AN2557 中的工程。

第一步:因为我们的豆皮上的MCU为STM32F103VBT6,因此选择工程STM3210B-EVAL。

第二步:我们需要把这个触发条件修改为豆皮上面的按键 SW4
             将 platform_config.h 中的       #define GPIO_PIN_KEY_BUTTON             GPIO_Pin_9 
               修改为                            #define GPIO_PIN_KEY_BUTTON             GPIO_Pin_15

第三步:将 common.h中的                #define ApplicationAddress 0x8002000
                   修改为                             #define ApplicationAddress 0x8003000
         因为我们修改的程序接近于2000字节,稍微修改一下就可能超过2000,所以修改为3000作为bootload程序大小。

第四步:修改自己的公司版权信息
SerialPutString("\r\n**************************Copyright (c)*******************************");

SerialPutString("\r\n*                   思 蜕 盟 豆 皮 开 发 小 组                       *");

SerialPutString("\r\n*                            stmfans 论坛                                      *");

SerialPutString("\r\n*                                                                                     *");

SerialPutString("\r\n* In-Application Programming Application   (Version 1。00)   *");

SerialPutString("\r\n*                                                                                     *"); 

SerialPutString("\r\n*              QQ 群: 65081316   StmFans思蜕盟 1组             *"); 

SerialPutString("\r\n*              QQ 群: 68584951   StmFans思蜕盟 2组             *");

SerialPutString("\r\n*                                                                                     *");    

SerialPutString("\r\n*                http://www.stmfans.com/bbs/                  
      *");

SerialPutString("\r\n*                                                                                     *");

SerialPutString("\r\n************************************************************************");

SerialPutString("\r\n\r\n");          

第五步:如果你使用仿真器下载程序,那么需要把 stm32f10x_config.h 中的 DEBUG 打开。
/* #define DEBUG 1*/

#ifndef DEBUG

#define DEBUG 1

#endif

如果你使用 ISP 下载 bootload 程序这一步可以不做。

第六步:配置生成   hex 文件,如下图所示:



IAP3.jpg

第七步:编译工程文件:

   在 \IAP_AN\project\EWARMv5\STM3210B-EVAL\Exe 文件夹下取得 STM32F10x_IAP.hex 文件。

经过如上七部,我们 IAP Bootload 部分做好了。
修改应用程序:

用 IAR 4.22 打开跑马灯程序,WORM_LED 工程。
先将 stm32f10x_nvic.h 和  lnkarm_flash.xcl 的只读属性去掉。

第一步:将 main.c 中的   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
         修改为             NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);

第二步:将 stm32f10x_nvic.h 中的 #define NVIC_VectTab_FLASH           ((u32)0x08000000) 
         修改为                            #define NVIC_VectTab_FLASH           ((u32)0x08003000)

第三步:将 lnkarm_flash.xcl 中的 -DROMSTART=0x8000000
         修改为                            -DROMSTART=0x8003000             

第四步:如图配置出 LED.bin 文件



IAP1.jpg

第五步:如图配置 LIST 文件



IAP2.jpg

第六步:编译工程文件。

\WORM_LED\WORM_LED\Debug\Exe   文件夹下面将会生成 LED.bin 。这个就是我们修改好的应用程序。

\WORM_LED\WORM_LED\Debug\List   文件夹下面将会城成 LED.map。打开这个文件我们确认下我们修改的程序是否正确。

   DEFINED ABSOLUTE ENTRIES

*************************************************************************

   DEFINED ABSOLUTE ENTRIES

   PROGRAM MODULE, NAME : ?ABS_ENTRY_MOD

   Absolute parts

          ENTRY                       ADDRESS       REF BY

          =====                          =======       ======

          _HEAP_SIZE          00000200 

          _CSTACK_SIZE        00000400 

          RAMEND                    2000FFFF 

          RAMSTART             20000000 

          ROMEND                0807FFFF 

         ROMSTART             08003000 

*************************************************************************

这时如果如上面所示那样的话即表示我们修改的程序 ok 了。
调试:

使用 STM32ISP.exe 将 STM32F10x_IAP.hex 下载到豆皮开发板中去。



IAP6.JPG

程序 Download 成功之后把 Boot0 和 Boot1 设置到正常程序模式下面。即 Boot0 = 0 , Boot1 = 0。

下载 应用笔记 AN2557 - STM32F10xxx in-application programming using the USART 或者 MXCHIP 的译文版本。
http://www.stmicroelectronics.com.cn/stonline/mcu/STM32_AN.htm


20071151511160.pdf

(2008-12-11 12:58:56, Size: 458 KB, Downloads: 231)


AN2557
STM32F10xxx通过USART在程序中编程 (2008年6月).pdf


(2008-12-11 12:58:56, Size: 276 KB, Downloads: 151)

打开文档后按照文档中的教程配置一个超级终端程序。

配置好 115200 的超级终端服务程序之后,按下 SW4 后给豆皮上电,即可在超级终端中看到下图的信息:



IAP4.JPG

按下 PC 机器键盘上面的 1 ,进行 Download 应用程序。
这时候超级终端会显示:
“Waiting for the file to be sent ... (press 'a' to abort)”
并且另起一行定时输出"C" ,这说明下位机已经响应,等待传输文件。

在超级终端中鼠标右键选择发送文件,在文件名中选择前面编译好的 LED.bin,协议选择 Ymodem,点击“发送”。



IAP7.JPG

文件正常传输结束后会输出正常的结果。



IAP5.JPG

到这里我们可以看结果了。

给豆皮重新上电,我们会看到和跑马灯一样的结果。即应用程序 IAP 成功了。

如果是按下 SW4 再上电的仍然会进入到 IAP 程序中。
教程结束了,当然大家要真正的掌握还是需要练习才能理解它的内涵。希望大家勤于练习,如学习过程中遇到问题可以在论坛中发帖,我们会给于你一定的帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: