LPC1768实现网络IAP

嵌入式系统一般都需要实现网络升级功能,方便维护。思路是把LPC1768的512K flash分为5部分:

Bootloader:0X0000 0000 – 0X0000 7FFF 32K 扇区0-7

应用程序:0X0001 0000 – 0X0004 7FFF 224K 扇区16-22

升级程序缓存区:0X0004 8000 – 0X0007 FFFF 224K 扇区23-29

扇区8用来保存升级数据包数量,每个数据包最大1024字节

扇区9用来放初始化标志,因为芯片出厂FLASH值都为0XFF,上电时读扇区9的值,如果不等于初始化标志,那么向扇区9写入初始化标志,并把扇区8保存数据包数量的地址清零。然后跳转到应用程序运行。

升级原理:应用程序运行时,接收到升级程序,把升级程序写入升级程序缓冲区,写完后把升级包的数量写入扇区8的起始位置,然后看门狗复位,开始执行Bootloader程序,升级程序先读取扇区9判断芯片是否初始化过,如果初始化标志正确,读扇区8保存的升级包数量,根据数据包数量读取升级程序缓存区的数据写到应用程序区,每次写一个数据包,即1024字节,写完后,把扇区8的起始位置4字节清零。最后跳转到应用程序,开始执行新的应用程序。升级完成。

LPC1768 FLASH地址分配如下:

clip_image002

LPC1768内部的FLASH读写函数放在地址0x1FFF1FF1处。

IAP函数定义如下:

image

image

clip_image002[5]

定义一个函数指针Iap_Entry,在IAP_EntryInit()中赋值0x1FFF1FF1。

Bootloader中跳转到应用程序使用函数

clip_image004

clip_image006

clip_image008

Bootloader程序的向量表放在0X0000 0000处,MDK设置如下

image

image

不自己定义scatter文件。

应用程序的MDK配置如下:

clip_image002[7]

clip_image004[5]

芯片复位时总是跳到0X0000 0000处执行。应用程序的向量表编译后放在0X0001 0000处。需要对向量表重新映射,发生中断时才能找到正确的中断函数地址。

在system_LPC17xx.c的SystemInit()中,把最后一段代码改为

clip_image006[5]

UserAppSection就是应用程序入口地址0x00010000。

还有一点要注意的是,MDK调试程序时要设置FLASH的擦除编程地址范围,否则在烧写bootloader程序时可能会擦除应用程序,在烧写应用程序时可能会擦除bootloader程序。

Bootloader项目MDK设置如下:

clip_image008[5]

应用程序项目MDK设置如下:

clip_image010

我觉得这种升级方式比较简单,实际测试升级速度也很快。以上所写,目的是提供一种思路,可能细节方面会有所错误。

发表评论

电子邮件地址不会被公开。 必填项已用*标注