打印
[LPC]

LPC1768 IAP升级

[复制链接]
17104|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1IAP介绍
IAP即“in applicatin programming”在应用编程的缩写,指MCU可以在系统中获取新代码并对自己重新编程,即改变应用程序。它与我们所熟悉的ISP编程不同,        LPC1768        的ISP编程接口为串口1,如果使用其他的串口或其他总线则不能对其进行编程。而我们这里所说的IAP通过下载一段引导程序Bootloader程序,如果我们想要从串口2或网口更新应用程序,在Bootloader中初始化相应的串口或网口,使其接收应用程序,将接收到的应用程序写入到Flash里面,IAP完成后跳转到应用程序入口执行应用程序。所以现在的IAP程序涉及到两个概念:Bootloader和应用程序。
BootloaderBootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。这里我们所说的Bootloader也是系统开机前的一段小程序,其主要任务是用来初始化串口和IAP端口(网口CAN接口等)的,通过判断状态是否需要从IAP端口进行更新应用程序,若需要更新则从端口接收应用程序,并存放到指定的Flash里面,更新完成后则跳入到指定的Flash里面执行应用程序。
应用程序:即我们需要开发板实现功能的程序,其中应用程序主要分为两种:hex文件和bin文件。在我们经常使用的KEIL中默认编译生成的可执行文件(应用程序)为hex格式的,若需要编译生成bin格式需要做如下修改,加入“D:\Keil\ARM\ARMCC\bin\fromelf.exe --bin --output ./Obj/Can_Updata.bin ./Obj/test.axf”,重新编译生成的Can_Updata.bin文件存放在Obj文件夹下。

2bin格式文件与hex格式文件的区别
bin格式文件是纯粹的二进制文件,使用下载其将其下载到开发板时其内容完全不变,所以对于IAP下载使用bin格式文件是比较方便的,如下图是bin文件的内容与写入到开发板后使用仿真器观察到Flash存放的内容(这段程序当然是可以执行的)。

Hex格式文件:Hex全称(Intel HEX)文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制数数字组成。如下图是hex文件的部分数据,其组成由“:CCAAAARR...ZZ ”,CC=10代表长度为16字节,AAAA=0000本条记录中的数据在存储区中的起始地址,RR=00,数据区,ZZ=38为校验,这里就不做仔细说明了。

3LPC1768 IAP原理
LPC1768复位后开始执行Boot代码,Boot代码可以执行ISP程序或用户的应用代码。发生硬件复位后,P2.10 引脚为低电平,这就被当作启动ISP命令处理器的外部硬件请求。假定在/RESET 引脚上出现上升沿时,电源引脚出现正确的信号,那么在采样P2.10 之前有3ms的时间决定是执行用户代码还是ISP 处理程序。如果P2.10 为低电平且看门狗溢出标志置位,那么忽略启动ISP 命令处理器的外部硬件请求。在没有ISP 命令处理器的请求(硬件复位后P2.10引脚为高电平)时,将搜索有效的用户程序。若发现有效的用户程序,执行控制权就被转移给用户程序。若没有找到有效的用户程序,就将调用自动波特率程序。这里不讨论ISP下载及命令,有兴趣的朋友可以查看LPC1768技术手册第三十二章ISP命令。
IAP升级中,程序正常执行即用户代码(这里的用户代码是我们所说的IAP引导程序),如下是IAP升级流程图,程序将预留端口(这里提供有串口和CAN总线接口两种)接收到的APP程序bin文件,将接收到的数据写入到指定的Flash区域(例程APP地址为0x0001 0000),程序通过IAP命令将数据写入到Flash里面,LPC1768提供了一系列IAP命令对片内Flash进行擦除编写等
[size=14.0000pt]4、IAP命令
LPC1768通过IAP函数对片内Flash进行操作,IAP函数是固化在0x1FFF1FF1处的一个有传入参数和返回参数的一个函数,在LPC1768技术手册第三十二章IAP命令中有有详细的说明。主要提供有如下命令:准备下操作扇区、将RAM内容复制到Flash、清除扇区、扇区查空、读器件ID、读boot版本、比较、重新调用ISP等。
[size=14.0000pt]5、串口IAP升级
本例程是根据官方提供的串口IAP更新图片进行修改而来,直接使用官方的IAP.c文件,该文件中提供了如上图IAP命令的各种函数,其具体参数可以参考IAP命令。根据官方例程里面将bmp图片经过串口采用Xmodem1K协议发送到开发板存放在地址0x0001 0000,如下图是LPC1768 Flash分配地址,第16~21扇区为应用程序存放空间。这里我们将要传送的bmp图片改为传输应用程序bin文件
[size=14.0000pt]6、串口IAP程序分析
例程通过按键对开发板进行控制,INT0键擦除Flash,确认键等待串口IAP,向上键显示菜单,向下键执行应用程序,使用LCD来开发板状态

当程序全部写入到Flash后,按下向下按键,跳转到应用程序,首先修改中断向量表然后进入应用程序
void Boot( void )
{
        SCB->VTOR = IMG_START_SECTOR & 0x1FFFFF80;        //修改中断向量表
        JMP_Boot(IMG_START_SECTOR);
}
堆栈地址更新,PC地址更新
__asm void JMP_Boot( uint32_t address ){
   LDR SP, [R0]                ;堆栈地址更新
   LDR PC, [R0, #4]        ;进入应用程序
}
7、操作步骤及实验现象
1、下载“宝马开发板串口IAP升级”例程,插上USB转串口线,打开超级终端,复位开发板。
2、按下按键INT0按键--擦除扇区
3、按下方向键确认键(即向下按)--等待接收串口程序
4、串口打印’C’字符等待接收数据
5、串口发送文件,选择“1K Xmodem”协议,选择要下载的应用程序bin文件,这里使用DAC例程作为测试。

6、点击“发送”,发送文件
7、发送完成
8、按下方向键向下键开始执行应用程序,这时我们可以使用示波器测试P0.26口输出正弦波信号
bin文件生成方法及设置:
打开要更新应用程序工程,这里使用“IAP升级DAC转换”程序,设置ROM空间地址(程序下载到Flash的地址),这里也是我们应用程序的入口地址0x10000
打开User选项,利用Keil自带的fromelf.exe生成bin文件,bin文件保存在Obj文件夹中,如下图添加“D:\Keil\ARM\ARMCC\bin\fromelf.exe --bin --output ./Obj/app.bin ./Obj/app.axf”,输入文件为app.axf,所以工程编译生成输出文件名设置为app,命令执行生成app.bin文件
打开Asm选项,定义“NO_CRP”,我们可以打开启动文件,当定义了“NO_CRP”后,那么我们后面的代码也就不起作用了,所以在需要加密的时候前面就一定不能再定义了代码读保护,也就是加密的关键字,经过加密后芯片再也无法擦除,由于我们这里程序需要使用到IAP升级,因此添加此定义

编译即可生成app.bin


【02】宝马1768_串口IAP升级.rar (220.52 KB)
【01】宝马1768_CAN IAP升级.rar (374.19 KB)


2.png (4.83 KB )

2.png

图片14.png (23.2 KB )

图片14.png

RTC.png (28.46 KB )

RTC.png

1.png (25.04 KB )

1.png
评分
参与人数 1威望 +3 收起 理由
szopenmcu + 3 很给力!

相关帖子

沙发
samuelhu| | 2014-6-5 10:13 | 只看该作者
good

使用特权

评论回复
板凳
z00| | 2014-6-5 11:07 | 只看该作者
正好用到 不过我采用的是SPI方式的

使用特权

评论回复
地板
jeansonm|  楼主 | 2014-6-5 13:00 | 只看该作者
z00 发表于 2014-6-5 11:07
正好用到 不过我采用的是SPI方式的

嗯 原理都一样

使用特权

评论回复
5
beyond696| | 2014-6-5 13:16 | 只看该作者
z00 发表于 2014-6-5 11:07
正好用到 不过我采用的是SPI方式的

你可以用纬图的Ginkgo USB-SPI试试

使用特权

评论回复
6
dong_abc| | 2014-6-6 00:55 | 只看该作者
恩,我也做了个串口升级https://bbs.21ic.com/icview-733624-1-1.html

使用特权

评论回复
7
szopenmcu| | 2014-6-6 15:31 | 只看该作者
楼主这写的也太详细了:)

使用特权

评论回复
8
szopenmcu| | 2014-7-17 11:23 | 只看该作者
上次忘记了,这次回来看看

使用特权

评论回复
9
samuelhu| | 2014-7-18 12:39 | 只看该作者
资料很详细实用

使用特权

评论回复
10
qzroger| | 2014-7-18 14:04 | 只看该作者
楼主 大好人啊 给力

使用特权

评论回复
11
qzroger| | 2014-7-21 11:44 | 只看该作者
楼主,我想问下有没有实现过把程序运行在SDRAM中啊

使用特权

评论回复
12
zhf0964| | 2014-7-22 19:55 | 只看该作者
写得不错。先mark下。

使用特权

评论回复
13
fcgmqty| | 2015-1-8 22:02 | 只看该作者
请教一下楼主:我的程序想生成起始于0x1000位置的bin文件,总是生成X.bin文件夹  ,如果从0起生成就正常生成bin,为什么?

使用特权

评论回复
14
lzyyoumuren| | 2015-1-9 09:25 | 只看该作者
各位有没有用过1768以太网的,用过路虎开发板的最好

使用特权

评论回复
15
szopenmcu| | 2015-3-14 14:18 | 只看该作者
:handshake:handshake你大爷,写的也大详细了吧:lol

使用特权

评论回复
16
罗William| | 2015-6-1 20:21 | 只看该作者
楼主写的很详细,是否考虑写一个用以太网通信方式的?

使用特权

评论回复
17
jeansonm|  楼主 | 2015-6-25 17:49 | 只看该作者
罗William 发表于 2015-6-1 20:21
楼主写的很详细,是否考虑写一个用以太网通信方式的?

这个只不过是通信方式改一下的问题,ST的官方有以太网升级的历程

使用特权

评论回复
18
zz102| | 2015-9-2 17:55 | 只看该作者
谢谢分享

使用特权

评论回复
19
zzzzzzzzz2| | 2015-12-4 09:57 | 只看该作者
LPC17xx IAP,mark!

使用特权

评论回复
20
kimirak| | 2015-12-31 11:19 | 只看该作者
感谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

29

帖子

2

粉丝