微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LPC1768 IAP升级解析及例程分享

LPC1768 IAP升级解析及例程分享

时间:11-21 来源:互联网 点击:

5、串口IAP升级

本例程是根据官方提供的串口IAP更新图片进行修改而来,直接使用官方的IAP.c文件,该文件中提供了如上图IAP命令的各种函数,其具体参数可以参考IAP命令。根据官方例程里面将bmp图片经过串口采用Xmodem1K协议发送到开发板存放在地址0x00010000,如下图是LPC1768Flash分配地址,第16~21扇区为应用程序存放空间。这里我们将要传送的bmp图片改为传输应用程序bin文件

?体;q?kr?Sx?S255,255,255); mso-shading:rgb(255,255,255); " >扇区查空、读器件ID、读boot版本、比较、重新调用ISP等。

?体; ????Sx?S??的外部硬件请求。假定在/RESET引脚上出现上升沿时,电源引脚出现正确的信号,那么在采样P2.10之前有3ms的时间决定是执行用户代码还是ISP处理程序。如果P2.10为低电平且看门狗溢出标志置位,那么忽略启动ISP命令处理器的外部硬件请求。在没有ISP命令处理器的请求(硬件复位后P2.10引脚为高电平)时,将搜索有效的用户程序。若发现有效的用户程序,执行控制权就被转移给用户程序。若没有找到有效的用户程序,就将调用自动波特率程序。这里不讨论ISP下载及命令,有兴趣的朋友可以查看LPC1768技术手册第三十二章ISP命令。

在IAP升级中,程序正常执行即用户代码(这里的用户代码是我们所说的IAP引导程序),如下是IAP升级流程图,程序将预留端口(这里提供有串口和CAN总线接口两种)接收到的APP程序bin文件,将接收到的数据写入到指定的Flash区域(例程APP地址为0x00010000),程序通过IAP命令将数据写入到Flash里面,LPC1768提供了一系列IAP命令对片内Flash进行擦除编写等。在IAP升级中,程序正常执行即用户代码(这里的用户代码是我们所说的IAP引导程序),如下是IAP升级流程图,程序将预留端口(这里提供有串口和CAN总线接口两种)接收到的APP程序bin文件,将接收到的数据写入到指定的Flash区域(例程APP地址为0x00010000),程序通过IAP命令将数据写入到Flash里面,LPC1768提供了一系列IAP命令对片内Flash进行擦除编写等。

5、串口IAP程序分析

例程通过按键对开发板进行控制,INT0键擦除Flash,确认键等待串口IAP,向上键显示菜单,向下键执行应用程序,使用LCD来开发板状态,其主函数如下

intmain(void)

{

uint32_tints[4];

SystemClockUpdate();

LCD_BSP_Init(); //LCD初始化

LCD_Clear(Black);

LCD_SetBackColor(Black);

LCD_SetTextColor(White);

cmd=MENU; //命令状态初始化,显示菜单

while(1)

{

switch(cmd)

{

caseREADY:

if (!(LPC_GPIO2->FIOPIN&(1<10)))

{

Screen_Fresh("ErasingImages...");

cmd=ERASE_FLASH;

}

elseif(!(LPC_GPIO1->FIOPIN&(1<29)))

{

cmd=MENU;

}

elseif(!(LPC_GPIO1->FIOPIN&(1<25)))

{

Screen_Fresh("WaitingforXMODEMXfer...");

cmd=FLASH_IMG;

}

elseif(!(LPC_GPIO1->FIOPIN&(1<26)))

{

Screen_Fresh("Executeprogram");

cmd=SHOW;

}

break;

caseMENU:

if(u32IAP_ReadBootVersion(&ints[0],&ints[1])==IAP_STA_CMD_SUCCESS)

{

snprintf((char*)string[0],MAX_STRING_SIZE,"BootCodeversion%d.%d",ints[0],ints[1]);

}

if(u32IAP_ReadPartID(&ints[0])==IAP_STA_CMD_SUCCESS)

{

snprintf((char*)string[1],MAX_STRING_SIZE,"PartID:%d(%#x)",ints[0],ints[0]);

}

u32IAP_ReadSerialNumber(&ints[0],&ints[1],&ints[2],&ints[3]);

snprintf((char*)string[2],MAX_STRING_SIZE,"Serial#:X:X:X:X",ints[0],ints[1],ints[2],ints[3]);

Screen_Fresh("Menu");

cmd=READY;

break;

caseERASE_FLASH:

if((u32IAP_PrepareSectors(16,20)==IAP_STA_CMD_SUCCESS)&&

(u32IAP_EraseSectors(16,20)==IAP_STA_CMD_SUCCESS))

Screen_Fresh("EraseDone");

else

Screen_Fresh("EraseFAIL");

cmd=READY;

break;

caseFLASH_IMG:

received_data=0;

vXmodem1k_Client(&load_image);

Screen_Fresh("UpdataComplete");

cmd=READY;

break;

caseSHOW:

Boot();

cmd=READY;

break;

}

}

}

当串口接收到数据后将数据写入到Flash,其写入步骤是:发送准备写扇区命令,执行RAM内容复制到Flash最后比较复制内容,其代码如下:

staticuint32_tload_image(uint8_t*data,uint16_tlength)

{

if(length>0){

if(u32IAP_PrepareSectors(16,20)==IAP_STA_CMD_SUCCESS)

{

if(u32IAP_CopyRAMToFlash(IMG_START_SECTOR+received_data,(uint32_t)data,length)==IAP_STA_CMD_SUCCESS)

{

if(u32IAP_Compare(IMG_START_SECTOR+received_data,(uint32_t)data,length,0)==IAP_STA_CMD_SUCCESS)

{

received_data+=length;

return1;

}

}

}

Screen_Fresh("FAIL(RESET&ERASEIMAGE)");

return0;

}

else

return

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top