搜索
bottom↓
回复: 44

原创分享-MCU直接在外接1-4线制SPI Flash上执行代码

  [复制链接]

出0入0汤圆

发表于 2014-12-29 16:22:33 | 显示全部楼层 |阅读模式
很久没来逛了,今天莫大帮助下找回了密码,贡献一点小菜

可能大家已经发现了,最近SPI接口的Flash芯片价格很便宜,容量也大。最新的更是2线乃至4线的SPI接口也慢慢流行开来。
现在,4线的SPI Flash一般可以做到120MHz的时钟,算下来读取速度可以到60MB/s,和一个硬盘差不多了;32Mbit (4MB)的容量也只是中等配置。

这些1/2/4线SPI Flash器件在存储程序和只读数据上都有很大的优势,在价格和尺寸上的更加比并行Flash明显。尤其是4线SPI(简称QSPI)的器件,设计用于直接在上面run代码,也就是所谓的就地执行(eXecute In Place)。注意了,XIP和之前从SPI拷贝代码到RAM再执行有本质的区别,它是把SPI闪存直接映射到memory map,就像并行Flash或片上Flash一样。

这种器件在电脑主板上已经有很多应用。但在MCU中的应用还是最近。NXP是最早在Cortex-M系列的MCU中支持这种用法的,在LPC18x0/43x0和LPC40xx系列的MCU中内置名为"SPIFI(SPI Flash Interface)"的外设来实现。

有意思的是,NXP的LPC18x0和LPC43x0系列没有内部Flash,主推SPI Flash XIP的方法。相比一个内置4MB的MCU而言,无Flash LPC18x0 + 4MB SPI Flash的组合要便宜得多。

这里就借莫大的神坛开个帖给兄弟姐妹们分享一下使用的笔记。

在这里,我会从介绍SPIFI及其外接闪存的基础开始,叙述了在其上进行在应用中编程(IAP),从而实现自我更新的方法。
其中涉及了因初始化和擦除、编程导致SPIFI外设不可读取数据的问题,对于此期间需要执行的代码,介绍了其构成成分,散布性,以及如何不遗漏地找出它们并转移到RAM中。
对于在SPIFI中调试时初始化SPIFI外设的方法本文也有涉及。
最后,以SPIFI IAP为基础,介绍了利用LPC MCU的唯一身份识别码(UID)对代码映像做一些标记的方法,使每个MCU个体的程序映像都不同,从而无法通过复制映像的办法来剽窃。
包括保护的思路,以及不使用IAP时标记的方法。作为内容的补充,本文还介绍了在SPIFI外接闪存上调试的注意事项,以及批量生产时的编程方法

以下使用笔记,中文版的,

这个笔记篇辐较长,既包括了深入的技术细节,也以配套的示例程序介绍了快速上手的实践指南,还包括一些SPIFI使用的基础。为帮助不同需求的读者高效使用本文,有如下建议:
•        必读章节
个别小节有“(必读)”标记,它们非常重要,建议阅读。
•        选读章节
如果只是为使用本文配套的示例程序,或以此程序为起点继续开发,大部分技术细节是并不需要掌握的,这些章节均注明“(选读)”标记。对于希望通过阅读此文迅速上手SPIFI使用的读者,可以跳过选读章节。
•        无特殊说明的章节
首次阅读本文或距离上次阅读后遗忘较多时建议阅读,或读者依据自己的需要决定是否阅读。


下面是配套的示例程序。这个程序用的库比较旧,只用来演示,如果用NXP的产品开发还请下载官方的LPCOpen库啊

注意:运行这个程序要使用KEIL 4.x/5.x,还要先把压缩包里的"SPIFI_18N43.FLM"拷贝到"<KEIL安装目录>\ARM\Flash\"下,见压缩包里的说明文档


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-12-29 16:34:55 | 显示全部楼层
这个不错,收下慢慢看

出0入0汤圆

发表于 2014-12-29 16:46:42 | 显示全部楼层
先下,用STM32弄的产品要增加升级功能。

出0入0汤圆

发表于 2014-12-29 16:47:07 | 显示全部楼层
不知MT7681 wifi
ESP8266之类的wifi soc是不是基于此计数,感觉因为单芯片+一片SPIflash ,如果先考到ram再执行就有点效率低咯

出0入0汤圆

 楼主| 发表于 2014-12-29 16:56:07 | 显示全部楼层
把对性能要求高的关键代码放到RAM仍然是个好主意。而且LPC18x0/43xx0的RAM比带Flash的型号大128kB,够放代码了
有些SoC就把MCU和SPI Flash的die放在一个package里

出0入0汤圆

发表于 2014-12-29 17:38:04 | 显示全部楼层
好文必读  洗耳恭听

出0入0汤圆

发表于 2014-12-29 17:46:17 | 显示全部楼层
我就打个酱油,有空当面请教

出0入0汤圆

发表于 2014-12-29 17:46:35 | 显示全部楼层
duxingkei 发表于 2014-12-29 16:47
不知MT7681 wifi
ESP8266之类的wifi soc是不是基于此计数,感觉因为单芯片+一片SPIflash ,如果先考到ram再 ...

应该不是的

出0入4汤圆

发表于 2014-12-29 17:48:32 来自手机 | 显示全部楼层
新奇,不过的单片机支持

出0入0汤圆

 楼主| 发表于 2014-12-29 18:07:55 | 显示全部楼层
NXP的LPC18xx/43xx/40xx是支持的

出0入93汤圆

发表于 2014-12-29 18:35:22 | 显示全部楼层
duxingkei 发表于 2014-12-29 16:47
不知MT7681 wifi
ESP8266之类的wifi soc是不是基于此计数,感觉因为单芯片+一片SPIflash ,如果先考到ram再 ...

XIP应该是新唐的专利,我最早认识它是若干年前的ARM7 NUC501。
先拷到RAM再执行的效率比XIP高一个数量级,差异极其巨大。以NUC501为例,内核108MHz,SPI为72MHz*2(双倍速),在RAM中运行可以达到90DMIPS,而XIP则只能达到7~8DMIPS。

出0入0汤圆

发表于 2014-12-29 19:11:00 | 显示全部楼层
STM32系列的能用此方法吗

出10入0汤圆

发表于 2014-12-29 19:56:20 来自手机 | 显示全部楼层
在台系的SOC芯片中看到过很多这种应用,51的都有,在cache miss的时候效率会低很多。

出0入10汤圆

发表于 2014-12-29 21:00:08 | 显示全部楼层
51外挂spi 拷到ram都用好久了

出0入0汤圆

 楼主| 发表于 2014-12-29 21:43:07 | 显示全部楼层
直接从QSPI执行代码效率肯定远不如内部Flash,所以实际上闪存接口一般都会带有一些自己控制的cache来加速。以NXP的"SPIFI"为例,可以达到不分频时1.6CoreMark/MHz, 分频时1.2CoreMark/MHz。内部Flash一般能做到2.0CoreMark/MHz以上。RAM一般在2.2CoreMark/MHz

出0入0汤圆

发表于 2014-12-29 22:14:19 | 显示全部楼层
学习 SPIFI接口上外接串行闪存的启动、IAP

出0入0汤圆

发表于 2014-12-30 09:50:39 来自手机 | 显示全部楼层
实测 执行代码速度 内部ram大于内部flash大于外部norflash大于spifi flash

出0入0汤圆

发表于 2014-12-30 12:50:24 来自手机 | 显示全部楼层
这样代码保密性呢

出10入0汤圆

发表于 2014-12-30 13:51:01 | 显示全部楼层
楼主写得这么详细,高手!!

出0入0汤圆

发表于 2014-12-30 20:56:19 | 显示全部楼层
luckroll 发表于 2014-12-29 21:00
51外挂spi 拷到ram都用好久了

直接在ram里跑?这要虚拟么?还是芯片支持IAP啊?

出0入0汤圆

 楼主| 发表于 2014-12-31 00:15:51 | 显示全部楼层
huangqi412 发表于 2014-12-30 12:50
这样代码保密性呢

需要通过MCU的唯一识别号(UID)来加密,这篇文档里有提过

出0入22汤圆

发表于 2014-12-31 00:28:45 来自手机 | 显示全部楼层
头两天玩adsp才听说的一种启动方式

出0入0汤圆

发表于 2014-12-31 08:57:01 | 显示全部楼层
牛逼,看看

出0入0汤圆

发表于 2014-12-31 09:06:33 | 显示全部楼层
bluelucky 发表于 2014-12-31 00:15
需要通过MCU的唯一识别号(UID)来加密,这篇文档里有提过

SPI FLASH固件不用开盖就能免费拿,如果只是简单的读ID,别人找到读ID代码直接替换掉。  如果再加上别的花样阻止简单的屏蔽读ID代码,破解难度才会提高。

出0入0汤圆

发表于 2014-12-31 09:07:19 | 显示全部楼层
ATMEL的ARM9 9260早就有用SPI启动,不过不能直接运行代码。

出0入0汤圆

发表于 2015-1-24 11:57:47 | 显示全部楼层
可以评为精华帖了,支持

出130入20汤圆

发表于 2015-1-24 12:57:49 | 显示全部楼层
用4357试过,运行速度勉强够用,对运行速度有要求的还是得放片内用

出0入0汤圆

发表于 2015-1-24 13:25:20 | 显示全部楼层
这个不错,收下慢慢看

出0入0汤圆

发表于 2015-1-24 18:14:57 | 显示全部楼层
这么好的帖子,谢谢了。长见识了

出0入0汤圆

发表于 2015-1-31 13:08:16 | 显示全部楼层
好帖,感谢楼主分享!不过很早就有在国产51上用RAM+SPI跑代码了,一切都是成本惹的祸

出0入0汤圆

发表于 2015-1-31 13:14:54 | 显示全部楼层
感觉快不了啊,想想转移 中断指令跳转很大,怎么快得了呢

出0入0汤圆

发表于 2015-1-31 13:37:40 | 显示全部楼层
貌似牛逼,

出0入0汤圆

发表于 2015-1-31 13:43:07 | 显示全部楼层
huangqi412 发表于 2014-12-31 09:06
SPI FLASH固件不用开盖就能免费拿,如果只是简单的读ID,别人找到读ID代码直接替换掉。  如果再加上别的花 ...

像这种flash完全外露的一点办法都没有,如果有一点点flash不外露的就问题不大了,可以让boot程序解密

出0入0汤圆

发表于 2015-1-31 18:15:17 | 显示全部楼层
mark,后面慢慢看

出0入0汤圆

发表于 2015-3-18 22:33:38 | 显示全部楼层
好贴,学习了

出0入0汤圆

发表于 2015-3-18 22:53:25 | 显示全部楼层
myxiaonia 发表于 2015-1-31 13:43
像这种flash完全外露的一点办法都没有,如果有一点点flash不外露的就问题不大了,可以让boot程序解密 ...

如果对外部Flash的程序加密,可以考虑LPC18S和LPC43S,固件是AES128bit加密的。可惜的是RAM没有,不然就不得了了

出0入0汤圆

发表于 2015-3-18 22:56:35 | 显示全部楼层
不错的解决思路,存下来,以后没事仔细看,mark

出0入0汤圆

发表于 2015-3-18 22:56:58 来自手机 | 显示全部楼层
不错,技术更新就是快,没有什么是不可能的

出0入0汤圆

发表于 2015-3-19 12:26:05 | 显示全部楼层
如果对外部Flash的程序加密,可以考虑LPC18S和LPC43S,固件是AES128bit加密的。可惜的是RAM没有,不然就不得了了
为什么要对ram加密,这个实现不难,但为什么就不得了,再下请教了,谢谢!

出0入0汤圆

发表于 2016-4-18 14:46:43 | 显示全部楼层
谢谢分享

出0入10汤圆

发表于 2016-4-22 12:47:38 | 显示全部楼层
评判为牛贴,感谢楼主分享

出0入0汤圆

发表于 2017-10-29 17:22:23 | 显示全部楼层
谢谢分享,收藏先!

出0入0汤圆

发表于 2018-6-20 17:30:56 | 显示全部楼层
mark下,慢慢看

出0入0汤圆

发表于 2018-6-20 17:56:31 来自手机 | 显示全部楼层
大神!谢谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 17:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表