历史上的今天
返回首页

历史上的今天

今天是: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

推荐阅读

史海拾趣

ABLIC公司的发展小趣事

ABLIC的起源可以追溯到精工电子有限公司旗下的精工半导体有限公司(SII Semiconductor Corporation)。在半导体产业蓬勃发展的背景下,日本政府通过政策投资银行对SII进行了注资,使其在原有业务基础上进一步拓展。然而,随着股权结构的变动,SII决定在2018年进行品牌重塑,更名为ABLIC,并专注于模拟半导体业务的发展。这一决策标志着ABLIC踏上了全新的发展道路。

Elpress AB公司的发展小趣事

随着电子技术的不断进步和市场需求的变化,Elpress AB意识到只有不断创新才能保持竞争力。因此,公司加大了对研发的投入,引进了一批先进的研发设备和人才。经过数年的努力,Elpress AB成功推出了一系列具有创新性和领先性的电气连接产品,如高压电缆接头、母线连接器等。这些产品的推出不仅丰富了公司的产品线,也进一步提升了Elpress AB在电气连接领域的地位。

City_Technology公司的发展小趣事

随着业务的不断扩展,City Technology于1990年在英国南海岸的普茨茅斯建立了生产基地,并将办公楼从伦敦中心区迁至该地。这一举措不仅提高了公司的生产效率,也为其进一步拓展国际市场提供了有力支持。此后,公司开始在全球范围内设立销售中心,包括波恩(德国)、苏黎世(瑞士)、上海及芝加哥等地,逐步实现了业务的国际化。

诚润电子(CHEVRON)公司的发展小趣事

诚润电子深知,一个优秀的团队是企业成功的关键。因此,他们一直致力于打造一支高素质、专业化的团队。公司注重员工的培训和发展,为员工提供广阔的职业发展空间和良好的福利待遇。同时,诚润电子还积极营造一种积极向上的企业文化氛围,让员工在工作中感受到归属感和成就感。这种良好的团队建设机制为诚润电子的持续发展提供了有力的保障。

Analogix Semiconductor公司的发展小趣事

在电子行业中,创新是企业持续发展的动力。诚润电子一直保持着对新技术、新产品的敏锐洞察力。他们不断投入研发资金,引进先进的生产设备和技术人才,致力于研发出更加先进、更加符合市场需求的产品。正是这种不断创新的精神,使得诚润电子在电子保护元件领域始终保持领先地位。

EQCOLOGIC公司的发展小趣事

在电子产品行业,品质是企业生存和发展的关键。EQCOLOGIC公司从成立之初就高度重视品质控制,建立了严格的质量管理体系。公司投入大量资金购买先进的检测设备,确保每一批产品都符合质量要求。同时,EQCOLOGIC还注重员工培训和技能提升,提高员工对品质控制的意识和能力。正是对品质的坚守,让EQCOLOGIC在竞争激烈的市场中赢得了良好的口碑。

问答坊 | AI 解惑

zigbee中理lcd液晶驱动程序问题

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是什么意思啊?…

查看全部问答>

求助:嵌入式Linux下如何控制GPIO

1.我买了一块基于ARM9的EP9315开发板,但是没有买JTAG仿真器,请问不用仿真器怎样调试和运行测试程序?是不是一定要有仿真器才行? 2.交叉编译一个控制ARM9的GPIO的程序,开发板上已经有Linux操作系统,但是在板子上运行时出现如下错误: pc : [] ...…

查看全部问答>

求wince5.0 16C550相关驱动

在做毕设,大侠救我!!!…

查看全部问答>

请问一个中断问题

我在oal层OEMInterruptHandler函数中定义 else if(ulVic2Irq & INT2_GPIO)         {         gpioAIntrState=*GPIO_INTSTATUSA;        if(gpioAIntrState & 0x40)   &n ...…

查看全部问答>

windows 下的图片和传真查看器在进程里是以什么显示的?

windows 下的图片和传真查看器在进程里是以什么显示的?…

查看全部问答>

CPLD/FPGA的设计怎么还有原理图式图形设计输入方法?

CPLD/FPGA的设计怎么还有原理图式图形设计输入方法? 现在看的只是VHDL。那是用什么工具设计的?大侠们指点一下,互相交流一下…

查看全部问答>

ez430-RF2500学习

上周就收到汤汤姐寄来的EZ430-RF2500的板子了,包装很细腻,打开后,一个MSP430的仿真器,两个同样的小板,一个带电池的小板(很细致,方便开发)。   焊上插针后 发现引出的IO口中并未引出UART,比较郁闷,因为习惯了用串口进行交互,本想 ...…

查看全部问答>

请教:哪些端口是CMOS兼容口呢?资料上不是很清楚啊

哪些端口是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> 这个也加进去了。找了一天了还没有查出来,烦各位老大们帮帮手。…

查看全部问答>