豆皮
- 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
在应用中编程及其应用
PPT.rar
(2008-12-11 13:02:18, Size: 307 KB, Downloads: 373)
IAP
在应用中编程及其应用
(2008-12-11 13:02:18, Size: 544 KB, Downloads: 365)
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*
群
: 65081316
StmFans
思蜕盟
1
组
*");
SerialPutString("\r\n*
群
: 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
文件