一、设计方案简介
本方案基于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
上一篇:LPC1768 SPI模式下SD卡FatFs文件系统移植
下一篇:在船舶共轨实验平台上使用Mbed LPC1768
推荐帖子
- TI 今天上午十点开播【甘为 AI 大脑的顺风耳】,解析语音识别技术!
- 这二场邂逅总算是到了,精彩的事情总是在我们的盼望中到来!亲爱的你,倒一杯喝的,坐好,干货马上开始!直播已结束……直播时间:2017年8月23日(今天)上午10:00-11:30直播主题:甘为AI大脑的顺风耳观看方式一:点击“我要观看”按钮,填写表单后即可观看。“我要观看”观看方式二:长按或扫描下方二维码,填写表单后进入直播间(直播前半小时开放直播入口)。注意!注意!注意!预报名过的网友在填写表单时请一定要填写预报名时留下的邮箱,以便我
- EEWORLD社区 TI技术论坛
- 储能系统之电池管理系统(BMS)
- 电池管理系统(BMS)完整的电化学储能系统主要由电池组、电池管理系统(BMS)、能量管理系统(EMS)、储能变流器(PCS)以及其他电气设备构成。在储能系统中,电池组将状态信息反馈给电池管理系统BMS,BMS将其共享给能源管理系统EMS和储能变流器PCS;EMS根据优化及调度决策将控制信息下发至PCS与BMS,控制单体电池/电池组完成充放电等。电池管理系统BMS:担任感知角色,主要负
- 火辣西米秀 汽车电子
- 嘿!上班第一件事就是逛论坛
- 嘿!上班第一件事情就是逛论坛,我好象得了论坛综合症,不知道大家时候有同感?嘿!上班第一件事就是逛论坛有点同感Re:嘿!上班第一件事就是逛论坛上网就是吸毒,你只喜欢在固定的地方吸而已。。。Re:嘿!上班第一件事就是逛论坛有,我也是,如果有一天没有了网络,我们要怎么活啊!Re:嘿!上班第一件事就是逛论坛不上电子工程世界的论坛,我的生命就失去了意义。。。Re:嘿!上班第一件事就是逛论坛
- fuza FPGA/CPLD
- 开关稳压电源(2007电子设计竞赛 E题)(内附论文和PCB图)
- 本帖最后由paulhyde于2014-9-1503:28编辑这是我去年作的,还请多多指教~!开关稳压电源(2007电子设计竞赛E题)(内附论文和PCB图)本帖最后由paulhyde于2014-9-1503:28编辑看上去不错本帖最后由paulhyde于2014-9-1503:29编辑不会吧?这也要收钱扣分。本帖最后由paulhyde于2014-9-1503:29编辑本帖最后由pau
- 歹匕示申 电子竞赛
- 【ST MEMS防水气压传感器LPS27HHW测评】+例程存在的问题
- 在前面的介绍中,对例程进行了相应的分析并介绍了在STM32F411开发板的基础上进行程序移入的处理方法。在程序移入后,借助串口已能把模拟值按原程序的输出出来,且为其配置了OLED屏来辅助检测值的输出。原指望在短时间内解决驱动的问题,从而能将例程顺利地放到STM32F411开发板上来进行功能检测。但是,这里有关键的问题没有解决,就是原程序缺少一个关键的定义,即语句dev_ctx.handle=&hi2c1;会因为找不到hi2c1而无法完成编译。后来添加了下面的语
- jinglixixi MEMS传感器
- “玩板”+ 共享单车控制板-GPS模块ublox MAX-M8Q
- 这种板子上的GPS模块有两种,一种是ublox的MAX-M8Q,还有一种是LYNQ的N10,调试的时候我还是选择的ublox的MAX-M8Q。.测试的时候使用串口透传模式,打通UART2---UART3,GPS模块是接在UART3上,波特率是9600.上位机使用u-box的u-center软件,还是挺方便的。接下来将考虑一下,如何解析这些数据,继续加油。上传一些MAX-M8Q的参考资料:此内容由EEWORLD论坛网友chenzhufly原创,如
- chenzhufly 测评中心专版
- 热门资源推荐
- 热门放大器推荐
设计资源 培训 开发板 精华推荐
- 技小新ESP8266开发板Type-C自动下载版
- 使用 ON Semiconductor 的 LV5781 的参考设计
- MC78M05BDTRKG 5V 电流升压稳压器的典型应用
- DI-199 - 40W 标准笔记本适配器
- LTC2945IMS-1 在 -48V 恶劣环境中进行电源监控的典型应用,使用 INTVCC 并联稳压器来承受 200V 瞬态
- 使用 ON Semiconductor 的 LA4631 的参考设计
- LTC4307 的典型应用 - 具有卡住总线恢复功能的低偏移热插拔 2 线总线缓冲器
- 【涂鸦智能】IOT物联网
- LDK130M-R 的典型应用可调版本电路,300 mA 低静态电流极低噪声 LDO
- 使用 NXP Semiconductors 的 TDA8927J 的参考设计
- 首都医科大学王长明:针对癫痫的数字疗法已进入使用阶段
- 非常见问题解答第223期:如何在没有软启动方程的情况下测量和确定软启动时序?
- 兆易创新GD25/55全系列车规级SPI NOR Flash荣获ISO 26262 ASIL D功能安全认证证书
- 新型IsoVu™ 隔离电流探头:为电流测量带来全新维度
- 英飞凌推出简化电机控制开发的ModusToolbox™电机套件
- 意法半导体IO-Link执行器电路板为工业监控和设备厂商带来一站式参考设计
- Melexis采用无磁芯技术缩小电流感测装置尺寸
- 千丘智能侍淳博:用数字疗法,点亮“孤独症”儿童的光
- 数药智能冯尚:ADHD数字疗法正为儿童“多动症”提供更有效便捷服务
- Vicor高性能电源模块助力低空航空电子设备和 EVTOL的发展