作者:m7w
来自:http://www.stmfans.com/bbs/viewthread.php?tid=1446&extra=page%3D1
豆皮 - STM32开发板入门教程(十七) - IAP 之串口篇 (原创)
豆皮 - STM32开发板入门教程(十七) - IAP 之串口篇 (原创) 版权所有 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是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。 通常在用户需要实现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 文件,如下图所示: 第七步:编译工程文件: 在 \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 文件 第五步:如图配置 LIST 文件 第六步:编译工程文件。 \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 下载到豆皮开发板中去。 程序 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 打开文档后按照文档中的教程配置一个超级终端程序。 配置好 115200 的超级终端服务程序之后,按下 SW4 后给豆皮上电,即可在超级终端中看到下图的信息: 按下 PC 机器键盘上面的 1 ,进行 Download 应用程序。 这时候超级终端会显示: “Waiting for the file to be sent ... (press 'a' to abort)” 并且另起一行定时输出"C" ,这说明下位机已经响应,等待传输文件。 在超级终端中鼠标右键选择发送文件,在文件名中选择前面编译好的 LED.bin,协议选择 Ymodem,点击“发送”。 文件正常传输结束后会输出正常的结果。 到这里我们可以看结果了。 |
给豆皮重新上电,我们会看到和跑马灯一样的结果。即应用程序 IAP 成功了。 如果是按下 SW4 再上电的仍然会进入到 IAP 程序中。 |
教程结束了,当然大家要真正的掌握还是需要练习才能理解它的内涵。希望大家勤于练习,如学习过程中遇到问题可以在论坛中发帖,我们会给于你一定的帮助。 |
完整工程在附件里 敬请继续关注 豆皮的的教程会逐步推出 |