LPC1768 IAP升级解析及例程分享
(2014-09-17 23:29:31)
标签:
it |
分类: STM32、LPC1768及其他单片机版 |
1、IAP介绍
IAP即“in
Bootloader:BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。这里我们所说的Bootloader也是系统开机前的一段小程序,其主要任务是用来初始化串口和IAP端口(网口CAN接口等)的,通过判断状态是否需要从IAP端口进行更新应用程序,若需要更新则从端口接收应用程序,并存放到指定的Flash里面,更新完成后则跳入到指定的Flash里面执行应用程序。
应用程序:即我们需要开发板实现功能的程序,其中应用程序主要分为两种:hex文件和bin文件。在我们经常使用的KEIL中默认编译生成的可执行文件(应用程序)为hex格式的,若需要编译生成bin格式需要做如下修改,加入“D:\Keil\ARM\ARMCC\bin\fromelf.exe
2、bin格式文件与hex格式文件的区别
3、LPC1768 IAP 原理
LPC1768复位后开始执行Boot代码,Boot代码可以执行ISP程序或用户的应用代码。发生硬件复位后,P2.10
在IAP升级中,程序正常执行即用户代码(这里的用户代码是我们所说的IAP引导程序),如下是IAP升级流程图,程序将预留端口(这里提供有串口和CAN总线接口两种)接收到的APP程序bin文件,将接收到的数据写入到指定的Flash区域(例程APP地址为0x0001
4、IAP命令
LPC1768通过IAP函数对片内Flash进行操作,IAP函数是固化在0x1FFF1FF1处的一个有传入参数和返回参数的一个函数,在LPC1768技术手册第三十二章IAP命令中有有详细的说明。主要提供有如下命令:准备下操作扇区、将RAM内容复制到Flash、清除扇区、扇区查空、读器件ID、读boot版本、比较、重新调用ISP等。
�体'; ����Sx�S��的外部硬件请求。假定在/RESET
5、串口IAP升级
本例程是根据官方提供的串口IAP更新图片进行修改而来,直接使用官方的IAP.c文件,该文件中提供了如上图IAP命令的各种函数,其具体参数可以参考IAP命令。根据官方例程里面将bmp图片经过串口采用Xmodem1K协议发送到开发板存放在地址0x0001
�体';q�kr�Sx�S255,255,255); mso-shading:rgb(255,255,255); " >扇区查空、读器件ID、读boot版本、比较、重新调用ISP等。
�体'; ����Sx�S��的外部硬件请求。假定在/RESET
在IAP升级中,程序正常执行即用户代码(这里的用户代码是我们所说的IAP引导程序),如下是IAP升级流程图,程序将预留端口(这里提供有串口和CAN总线接口两种)接收到的APP程序bin文件,将接收到的数据写入到指定的Flash区域(例程APP地址为0x0001
5、串口IAP程序分析
例程通过按键对开发板进行控制,INT0键擦除Flash,确认键等待串口IAP,向上键显示菜单,向下键执行应用程序,使用LCD来开发板状态,其主函数如下
int
{
uint32_t
SystemClockUpdate();
LCD_BSP_Init(); //LCD初始化
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
cmd
while(1)
{
switch(cmd)
{
case
if
(!(LPC_GPIO2->FIOPIN
{
Screen_Fresh("Erasing
cmd
}
else
{
cmd
}
else
{
Screen_Fresh("Waiting
cmd
}
else
{
Screen_Fresh("Execute
cmd
}
break;
case
if(u32IAP_ReadBootVersion(&ints[0],&ints[1])==IAP_STA_CMD_SUCCESS)
{
snprintf((char
}
if(u32IAP_ReadPartID(&ints[0])
{
snprintf((char
}
u32IAP_ReadSerialNumber(&ints[0],
snprintf((char
Screen_Fresh("Menu");
cmd
break;
case
if
Screen_Fresh("Erase
else
Screen_Fresh("Erase
cmd
break;
case
received_data
vXmodem1k_Client(&load_image);
Screen_Fresh("Updata
cmd
break;
case
Boot();
cmd
break;
}
}
}
当串口接收到数据后将数据写入到Flash,其写入步骤是:发送准备写扇区命令,执行RAM内容复制到Flash最后比较复制内容,其代码如下:
static
{
if(length
if(u32IAP_PrepareSectors(16,
{
if(u32IAP_CopyRAMToFlash(IMG_START_SECTOR
{
if(u32IAP_Compare(IMG_START_SECTOR
{
received_data
return
}
}
}
Screen_Fresh("FAIL
return
}
else
return
}
当程序全部写入到Flash后,按下向下按键,跳转到应用程序,首先修改中断向量表然后进入应用程序
void
{
SCB->VTOR
JMP_Boot(IMG_START_SECTOR);
}
堆栈地址更新,PC地址更新
__asm
}
7、操作步骤及实验现象
1、下载“宝马开发板串口IAP升级”例程,插上USB转串口线,打开超级终端,复位开发板。
2、按下按键INT0按键--擦除扇区
3、按下方向键确认键--等待从串口接收程序
4、串口打印‘C’字符等待接收数据
5、串口发送文件,选择“1K Xmodem”协议,选择要下载的应用程序bin文件,这里使用DAC例程作为测试。
6、发送文件
7、按下方向键向下键开始执行应用程序,可以用示波器测试P0.26输出正弦波信号
bin文件生成方法及设置:
打开要更新应用程序工程,这里使用“IAP升级DAC转换”程序,设置ROM空间地址(程序下载到Flash的地址),这里也是我们应用程序的入口地址0x10000
打开User选项,利用Keil自带的fromelf.exe生成bin文件,bin文件保存在Obj文件夹中,如下图添加“D:\Keil\ARM\ARMCC\bin\fromelf.exe
打开Asm选项,定义“NO_CRP”,我们可以打开启动文件,当定义了“NO_CRP”后,那么我们后面的代码也就不起作用了,所以在需要加密的时候前面就一定不能再定义了代码读保护,也就是加密的关键字,经过加密后芯片再也无法擦除,由于我们这里程序需要使用到IAP升级,因此添加此定义
8、CAN 总线
CAN
1)网络各节点之间的数据通信实时性强
2)缩短了开发周期
3)已形成国际标准的现场总线
4)最有前途的现场总线之一
9、CAN IAP 升级
关于LPC1768