通过SPI方式实现LPC17xx的远程升级设计
2014-07-02 21:16
951 查看
我参加 了CSDN2014 博客之星大赛,请大家多多支持(每天都可以投一票哦)。
http://vote.blog.csdn.net/blogstar2014/details?username=woshi_ziyu#content
—————————————————————————————————————————————————————————————
本方案程序由bootloader、低区用户程序,高区用户程序三部分组成。Bootloader实现程序的跳转及IAP程序的烧写。低区程序位于LPC1768的0x1000~0x2FFFF处,高区程序位于LPC1768的0x30000~0x67FFFF处。
待更新的程序放置于外部存储芯片N25Q256的0x00100000处,并占据48个扇区。LPC1768的bootloader通过SPI的方式读取N25Q256的数据并更新程序至高区用户程序,更新成功后,程序复位,运行更新后的程序。
程序流程图如下:
跳转至用户程序时,使用函数指针的形式直接跳转至用户程序的入口地址。
定义函数指针:
定义程序入口地址:
实现跳转:
在分散加载sct文件中,指定存储函数指针入口地址的FLASH空间:
指定函数指针的入口地址
这样用户程序通过调用SBL_APICall就可以实现跳转至bootloader中。
LPC1768通过VTOR写入偏移量来进行中断向量的重映射。
高区的程序版本号位于0x67FFC地址处,烧录代码的同时也会更新程序的版本号。通过分散加载的机制实现。
http://vote.blog.csdn.net/blogstar2014/details?username=woshi_ziyu#content
—————————————————————————————————————————————————————————————
一、设计方案简介
本方案基于NXP的LPC1768微处理器为平台,使用KEIL MDK4.70A为开发工具,通过SPI的方式实现程序的自动更新。本方案程序由bootloader、低区用户程序,高区用户程序三部分组成。Bootloader实现程序的跳转及IAP程序的烧写。低区程序位于LPC1768的0x1000~0x2FFFF处,高区程序位于LPC1768的0x30000~0x67FFFF处。
待更新的程序放置于外部存储芯片N25Q256的0x00100000处,并占据48个扇区。LPC1768的bootloader通过SPI的方式读取N25Q256的数据并更新程序至高区用户程序,更新成功后,程序复位,运行更新后的程序。
二、Bootloader程序流程简介
Bootloader主要完成两个功能,跳转和IAP程序烧写。本程序占用FLASH的最低4K字节。1. 程序跳转
在高区程序的最后四个字节(0x67FFC)存储着程序的版本信息,程序通过判断高区程序的版本信息实现跳转,如果版本信息为0xFFFFFFFF,则认为高区程序无效,程序执行低区用户程序,否则,执行高区程序。#define SBL_SLV_FIRMWARE_ID_ADDR (0x67FFC) Bool upgrade = FALSE; uint32_t*versions; /*Get Version ID */ versions= (uint32_t*)SBL_SLV_FIRMWARE_ID_ADDR; if(*versions== 0xFFFFFFFF) upgrade= TRUE; if(!upgrade) { //Run user code SBL_SlaveRunUserCode(); } else SBL_SlaveRunOldUserCode();
程序流程图如下:
跳转至用户程序时,使用函数指针的形式直接跳转至用户程序的入口地址。
定义函数指针:
typedef void (*USER_ENTRY_PFN)();
定义程序入口地址:
#define SBL_SLV_FIRMWARE_START (0x38000) user_entry = (USER_ENTRY_PFN) *((uint32_t*)(SBL_SLV_FIRMWARE_START + 4));
实现跳转:
(user_entry)();
2. 升级程序
升序程序使用分散加载机制,将升级程序的函数指针存入至程序的低16字节,即0x00000FF0~0x00000FFF处。用户程序接收到升级指令后,使用函数指针跳转到入口地址。在分散加载sct文件中,指定存储函数指针入口地址的FLASH空间:
LR_SBL_CODE 0x00000FF0 0x00000010{ ;SBL-API ER_SBL0x00000FF0 0x00000010 { ; sbl_slave.o("sbl_call", +First) } }
指定函数指针的入口地址
void SBL_APICall(uint32_t API, uint8_t*pData) __attribute__((section("sbl_call")));
这样用户程序通过调用SBL_APICall就可以实现跳转至bootloader中。
3 使用IAP更新程序
IAP的相关函数及操作流程都可以参考NXP的例程文件,不作修改。三、用户程序
用户程序需要进行中断向量的重映射。LPC1768通过VTOR写入偏移量来进行中断向量的重映射。
#defineVTOR_OFFSET (0x00038000) __disable_irq(); SCB->VTOR = VTOR_OFFSET; __enable_irq();
高区的程序版本号位于0x67FFC地址处,烧录代码的同时也会更新程序的版本号。通过分散加载的机制实现。
四、参考资料
1. AN11257: SPI secondary boot loader相关文章推荐
- 基于linux的数字电视机顶盒几种升级方式的设计与实现
- IAP 远程升级设计实现
- 通过网页去实现远程控制软件的上线!博客,贴吧,云盘等等网页方式实现上线原理解析,绕过域名拦截
- 在海思3512平台实现通过3G网络远程升级程序
- 远程服务调用框架设计与实现
- 利用WebRequest来实现模拟浏览器通过Post方式向服务器提交数据
- xml应用(2): 通过向xsl传递参数+数据岛方式,实现在客户端单个xml的分框架显示
- C#实现通过程序自动抓取远程Web网页信息
- 通过Socket套接字实现对计算机的远程监控
- 远程屏幕监视软件的设计与实现
- C#实现通过程序自动抓取远程Web网页信息
- 单态设计模式在 PHP5 中的实现方式
- [设计模式]DAO的实现方式探讨_Part I
- [设计模式]DAO的实现方式探讨_Part II
- 远程线程嵌入方式 实现DLL的隐藏
- C#实现通过程序自动抓取远程Web网页信息
- 通过证书方式实现ssh的无密码登陆
- C#实现通过程序自动抓取远程Web网页信息的代码
- 利用WebRequest来实现模拟浏览器通过Post方式向服务器提交数据
- 嵌入式远程视频采集系统的设计与实现