历史上的今天
今天是:2024年08月24日(星期六)
2021年08月24日 | 通过SPI方式实现LPC17xx的远程升级设计
2021-08-24 来源:eefocus
一、设计方案简介
本方案基于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
史海拾趣
|
INT8U ContrastValue = 0x38; INT8U BT_State; void ClearScreen(void); void Print(INT8U y, INT8U x, INT8U ch[], INT16U yn); void Print6(INT8U xx,INT8U yy,INT8U ch1[],INT8U yn); 上述程序中INT8U 或着16U是什么意思啊?… 查看全部问答> |
|
1.我买了一块基于ARM9的EP9315开发板,但是没有买JTAG仿真器,请问不用仿真器怎样调试和运行测试程序?是不是一定要有仿真器才行? 2.交叉编译一个控制ARM9的GPIO的程序,开发板上已经有Linux操作系统,但是在板子上运行时出现如下错误: pc : [] ...… 查看全部问答> |
|
CPLD/FPGA的设计怎么还有原理图式图形设计输入方法? 现在看的只是VHDL。那是用什么工具设计的?大侠们指点一下,互相交流一下… 查看全部问答> |
|
上周就收到汤汤姐寄来的EZ430-RF2500的板子了,包装很细腻,打开后,一个MSP430的仿真器,两个同样的小板,一个带电池的小板(很细致,方便开发)。 焊上插针后 发现引出的IO口中并未引出UART,比较郁闷,因为习惯了用串口进行交互,本想 ...… 查看全部问答> |
|
哪些端口是CMOS口呢?资料上不是很清楚啊,资料中把IO口分为TTL 兼容口和CMOS兼容 口,TTL又有一部分是FT,可是CMOS是哪些呢? … 查看全部问答> |
|
#errorclnkDebugmouse.lkf:1symbol_cosnotdefined(Debugmain.o) 请问各位老大,这个问题怎么解决? #error clnk Debug\\mouse.lkf:1 symbol _cos not defined (Debug\\main.o ) #include <math.h> 这个也加进去了。找了一天了还没有查出来,烦各位老大们帮帮手。… 查看全部问答> |




