历史上的今天
返回首页

历史上的今天

今天是:2025年04月27日(星期日)

正在发生

2019年04月27日 | LPC1788 IAP的实现及遇见的问题

2019-04-27 来源:eefocus

参考网上的资料先学习了IAP实现的基本原理,结合自己板子的实际硬件资源,把芯片自带的512K内部Flash分为两部分,一部分为BootLoader实现IAP和应用程序的加载(跳转),另一部分是应用程序,升级的固件文件存放在外置的NandFlash系统中。为了把BootLoader做的更通用和漂亮一些,启用了RTX操作系统和Emwin,代码量大概在130K左右,因此,BootLoader放在了0~0x30000,应用放在了0x30000~0x80000。



芯片启动时首先运行BootLoader,BootLoader启动NandFlash文件系统,检查是否需要更新固件,NandFlash中放置了一个needup.bin文件,内容为空,只要存在needup.bin文件就说明需要升级,固件放在文件名为firmware.bin中。如果需要升级固件,启动固件升级进程,利用LPC1788的IAP功能,擦除扇区,将firmware.bin文件内容编程到0x30000开始的地方,然后跳转到0x8 0000运行APP。


如果不需要升级固件(没有needup.bin),则直接跳转到0x8 0000运行APP。


在跳转到0x8 0000开始运行APP前,首先判断一下0x80000处的数据(堆栈指针)是否在0x1000 0000~0x1000 FFFF,如果在范围里则为正确的APP,否则没有有效的APP,则不跳转到APP,直接进入到BootLoader程序。


为了防止在将固件文件写到内部Flash过程中出现问题,或固件本身就有问题,导致下载完成后不能正常运行,需要有一种直接进入BootLoader程序的方法,本系统有个按键,就设计为如果开机时按键被按下则直接进入到BootLoader而不加载APP应用,在BootLoader程序下启动USB、串口等进行固件的重新下载。


在实际编程的过程中出现了两个特殊的问题,经过努力查找问题最终得到了解决,下面将两个问题做个总结。


第一个问题是BootLoader程序调用LPC1788的IAP程序代码出现HardFault,在百度、Google各种查找,有一个人也出现类似的问题,但是并没有解决。最后不得已从main函数第一行开始防止IAP的测试代码,发现刚进main函数时调用IAP代码是不出错的,这就给我们一个启示,肯定是程序的某个地方触发了此问题。把IAP的测试代码往后放,放到while(1)前发现出现了HardFault,对这两个地方用仿真器进行跟踪,发现当代码停到两个调用代码前时,IAP所在(0x1FFF1FF0)的程序代码竟然不同。在后面停下时的代码明显的不对,好多mov r0, r0。为了找出来到底是哪句代码出了问题,从上到下一行一行的测试,最终找到了问题,原来在初始化EMC时修改了LPC_SC->MARB,是为了提高LCD占用总线的权限,设置LCD刷新拥有做高权限,数据访问次之,程序再次,其余最低。把这句话屏蔽后,采用缺省的总线仲裁设置后,能够正常的调用IAP。也许出现这种情况的可能性不高,但自己趟过的坑能告诉别人,让别人免走弯路也是一件好事。


第二个问题是从BootLoader跳转到APP时,APP并不能正常的运行。代码也是按照正常的跳转处理的,读取0x30000处的4个字节设置MSP(堆栈指针),将把0x30004的4个字节装入PC进行跳转,APP程序也正确设置了终端向量到0x30000。由于在BootLoader程序中看不到跳转后的源代码,但结合APP的map文件大致能知道程序运行到了哪个函数,用仿真器一直跟踪跳转后的汇编代码,发现程序也是最终停在了HardFault。用仿真器直接调试APP程序,要设置仿真器的初始化文件,如下图所示。其中runflash.ini文件内容如下:


SP = _RDWORD(0x00030000);           // Setup Stack Pointer

 

PC = _RDWORD(0x00030004);           // Setup Program Counter


其实就是设置仿真器进入调试状态是把MCU的SP和PC从哪里装载值,这个从BootLoader跳转的代码作用是一样的。进入调试状态,整个APP能够正常运行。这就说明我们在跳转到APP时,由于BootLoader本身已经设置了很多寄存器,导致APP的初始化过程和现有的寄存器设置有冲突。网上资料显示一定要关闭中断,在跳转前加了关全局中断的代码,不管用。又说要把RCC和NVIC复位,做了也不太管用。后来经过思考,最好的解决方法是BootLoader跳转到APP时把MCU做软复位,然后在执行尽量少的代码的情况下进行跳转,这样BootLoader的影响就很小,几乎等同于直接运行APP程序,能够尽早的把控制权交给APP程序。



软复位的代码还是比较好做的,如下:


__set_FAULTMASK(1);

 

NVIC_SystemReset();

 

while(1);


经测试也好用,现在的问题是等MCU重新启动后,如何判断是为了进APP的软重启还是用户断电后的硬启动,这个可以通过读取复位源标识寄存器(RSID—0x400F C180) 确定,如果此寄存器的第4位SYSRESET置位,说明处理器由于系统请求复位而被复位。但是在BootLoader的界面中也有一个复位按钮,也是通过这个方式重启的,这样就不能完全区分出来了。


为了解决这个问题,就在思考有哪些信息能够重启而不会丢失呢?写文件肯定是可以的,但为了让BootLoader尽快进入APP不能加载文件系统。写EEPROM肯定也是可以的,但是EEPROM被APP用了。还有个能用的就是RTC的通用寄存器,LPC1788有4个RTC通用寄存器(GPREG0~GPREG4–地址 0x4002 4044~0x4002 4054),这类寄存器可在主电源断开时保存重要的信息。芯片复位时,不会影响到这些寄存器中的值。而我们的APP正好也没有用到这四个寄存器,就选用其中的GPREG0保存重启的原因。


剩下的工作就简单了,需要跳转到APP时将GPREG0的值置为1,然后软重启。BootLoader程序在SystemInit函数(MCU启动后执行的第一段代码)中加入判断GPREG0的值的代码,如果GPREG0的值为0正常继续启动BootLoader,如果值为1直接跳转到APP。


经过测试发现此方法可行,能够很顺利的从BootLoader跳转到APP。

推荐阅读

史海拾趣

DeLorme公司的发展小趣事

DeLorme公司成立于20世纪80年代初,当时正值全球定位系统(GPS)技术快速发展的时期。创始人XXX和XXX看到了GPS技术在户外导航领域的巨大潜力,于是决定投身这一领域。然而,创业初期他们面临了资金短缺、技术瓶颈和市场接受度低等多重挑战。他们通过不断的技术创新、优化产品设计和积极的市场推广,逐渐赢得了消费者的认可,并在行业内树立了良好的口碑。

China Semiconductor Corp公司的发展小趣事

随着公司的发展,CSC逐渐意识到技术创新是立足之本。于是,公司加大了研发投入,引进了一批高端人才,建立了完善的研发体系。通过不懈的努力,CSC在多个领域取得了重大突破,如高性能处理器、存储器等关键技术的研发,使公司在国际市场上逐渐获得了话语权。

Forge Europa Ltd公司的发展小趣事

在全球化布局的同时,Forge Europa Ltd公司也注重在中国市场的本土化深耕。公司在中国设立了研发中心和生产基地,以更好地服务中国市场并融入本土产业链。通过深入了解中国市场的需求和特点,Forge Europa不断调整产品策略,推出了一系列符合中国市场需求的LED灯带产品。此外,公司还积极与中国本土企业合作,共同推动LED照明技术的发展和应用。

European Crystal Org公司的发展小趣事

ECO始终将产品质量视为公司发展的生命线。公司建立了严格的质量管理体系,对生产过程中的每一个环节进行严格把关。此外,ECO还注重品牌形象的塑造,通过广告宣传、客户案例分享等方式提升品牌知名度和美誉度。这些努力使ECO在行业内树立了良好的口碑,吸引了越来越多的优质客户。

风华(FH)公司的发展小趣事

在光伏胶膜领域取得显著成就的同时,福斯特半导体也在不断探索新技术和新应用。公司在0BB(无边框背接触)技术方面取得了重大突破,并率先实现了商业化供货。0BB技术能够显著提升光伏组件的发电效率和可靠性,是光伏行业的重要创新之一。福斯特半导体在这一领域的成功不仅展示了公司的技术实力和市场敏锐度,也为公司赢得了更多高端客户的青睐和市场份额。

Amveco Toroidal Power Products公司的发展小趣事

为了进一步扩大市场份额,Amveco公司积极寻求与行业内外的合作伙伴建立战略合作关系。公司与多家知名的电子设备制造商建立了长期稳定的合作关系,为其提供定制化的环形变压器解决方案。此外,公司还通过参加国际电子展会、建立海外销售网络等方式,积极开拓国际市场,实现了业务的全球化布局。

问答坊 | AI 解惑

紧急求助!

我现在需要将5兆方波转成5兆正弦波?那位大哥做过?最好有现成的电路图,采用教材上滤波的方式,理论上可以实际操作很难的。谢谢,感激不尽! 我的QQ:739467432 新箱:sujianfeng6601@yahoo.com…

查看全部问答>

基于AT89C52控制的寻迹小车设计

基于AT89C52控制的寻迹小车设计…

查看全部问答>

WIFI连接的问题

将设备移出AP覆盖范围,重新再移入AP覆盖范围后,微软的连接程序(netui)如何做到自动重新连接的?是定时器吗?…

查看全部问答>

求救?我在PB定制WINCE内核的时候出现了一个错误

我在PB4.2下定制WINCE,build时出现1个错误,系统提示参考WINCE420目录下的build.err文件,文件的内容如下: Starting sysgen phase for project ( common ) Found localized resources for Languages ( 0404 0407 040C 0410 0411 0412 0413 041 ...…

查看全部问答>

串口不能进中断?但是查询模式正常

现象:使用查询模式能够实现正常收发,使用串口中断时,没有中断时,在主程序循环中正常运行,如果收到字符,不是跳到USART1_IRQHandler,而是跳到了 HardFaultException中断,可能是哪里的原因,如果说硬件有问题,可查询模式很正常。请高手 ...…

查看全部问答>

计算机电源

  电源作为计算机的唯一动力来源,对计算机运行的稳定性和可靠性起着重要的作用。由于电源的质量问题,使PC出现故障、甚至导致配件损毁的事件却屡见不鲜。  …

查看全部问答>

关于G2553的SPI模块的疑问

新生有不解之处:之前使用SPI,IIC这些协议都是通过软件处理模拟IO口做的 这次MSP430硬件集成了这些模块,是不是说,不用CPU干预就可以使用SPI和其他器件交换数据了?相应的IIC也是吗…

查看全部问答>

易电源心得体会--易电源果然是“易”

易电源给我的初次印象就是易用性。这一点在相关资料里已经映证了。通过学习,我发现易电源性能还是非常不错的,而其微小的封装却是一大亮点,非常适合微小解决方案的应用。易电源模块让工程师们用最少的原件来设计和优化可靠的电源,凸显“易”字。 ...…

查看全部问答>

开箱体验~~FPGA(cyclone4)开发板

板子到啦。比想象的还有好,黑色显得特高端。…

查看全部问答>