bluelucky 发表于 2014-12-29 16:22:33

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

很久没来逛了,今天莫大帮助下找回了密码,贡献一点小菜

可能大家已经发现了,最近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\"下,见压缩包里的说明文档


cu_ice 发表于 2014-12-29 16:34:55

{:lol:}{:lol:}这个不错,收下慢慢看

mypear 发表于 2014-12-29 16:46:42

先下,用STM32弄的产品要增加升级功能。

duxingkei 发表于 2014-12-29 16:47:07

不知MT7681 wifi
ESP8266之类的wifi soc是不是基于此计数,感觉因为单芯片+一片SPIflash ,如果先考到ram再执行就有点效率低咯

bluelucky 发表于 2014-12-29 16:56:07

把对性能要求高的关键代码放到RAM仍然是个好主意。而且LPC18x0/43xx0的RAM比带Flash的型号大128kB,够放代码了
有些SoC就把MCU和SPI Flash的die放在一个package里

linyu0395 发表于 2014-12-29 17:38:04

好文必读洗耳恭听

magicoe 发表于 2014-12-29 17:46:17

我就打个酱油,有空当面请教{:biggrin:}

magicoe 发表于 2014-12-29 17:46:35

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

应该不是的

cwei 发表于 2014-12-29 17:48:32

新奇,不过的单片机支持

bluelucky 发表于 2014-12-29 18:07:55

NXP的LPC18xx/43xx/40xx是支持的

takashiki 发表于 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。

esdart 发表于 2014-12-29 19:11:00

STM32系列的能用此方法吗

dgtg 发表于 2014-12-29 19:56:20

在台系的SOC芯片中看到过很多这种应用,51的都有,在cache miss的时候效率会低很多。

luckroll 发表于 2014-12-29 21:00:08

51外挂spi 拷到ram都用好久了

bluelucky 发表于 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

sun92845166 发表于 2014-12-29 22:14:19

学习 SPIFI接口上外接串行闪存的启动、IAP

hantnt 发表于 2014-12-30 09:50:39

实测 执行代码速度 内部ram大于内部flash大于外部norflash大于spifi flash

huangqi412 发表于 2014-12-30 12:50:24

这样代码保密性呢

dgtg 发表于 2014-12-30 13:51:01

楼主写得这么详细,高手!!

jlhgold 发表于 2014-12-30 20:56:19

luckroll 发表于 2014-12-29 21:00
51外挂spi 拷到ram都用好久了

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

bluelucky 发表于 2014-12-31 00:15:51

huangqi412 发表于 2014-12-30 12:50
这样代码保密性呢

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

zxq6 发表于 2014-12-31 00:28:45

头两天玩adsp才听说的一种启动方式

majialou 发表于 2014-12-31 08:57:01

牛逼,看看

huangqi412 发表于 2014-12-31 09:06:33

bluelucky 发表于 2014-12-31 00:15
需要通过MCU的唯一识别号(UID)来加密,这篇文档里有提过

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

huangqi412 发表于 2014-12-31 09:07:19

ATMEL的ARM9 9260早就有用SPI启动,不过不能直接运行代码。

2fen 发表于 2015-1-24 11:57:47

可以评为精华帖了,支持

shuiluo2 发表于 2015-1-24 12:57:49

用4357试过,运行速度勉强够用,对运行速度有要求的还是得放片内用

GunGun 发表于 2015-1-24 13:25:20

这个不错,收下慢慢看

fei-lai-fei-qu 发表于 2015-1-24 18:14:57

这么好的帖子,谢谢了。长见识了

jiangkehong 发表于 2015-1-31 13:08:16

好帖,感谢楼主分享!不过很早就有在国产51上用RAM+SPI跑代码了,一切都是成本惹的祸{:lol:}

NJ8888 发表于 2015-1-31 13:14:54

感觉快不了啊,想想转移 中断指令跳转很大,怎么快得了呢

marrt.80 发表于 2015-1-31 13:37:40

貌似牛逼,{:smile:}{:smile:}

myxiaonia 发表于 2015-1-31 13:43:07

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

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

hyper320 发表于 2015-1-31 18:15:17

mark,后面慢慢看

blue1025 发表于 2015-3-18 22:33:38

好贴,学习了

magicoe 发表于 2015-3-18 22:53:25

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

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

fuxinaries 发表于 2015-3-18 22:56:35

不错的解决思路,存下来,以后没事仔细看,mark

soosqt 发表于 2015-3-18 22:56:58

不错,技术更新就是快,没有什么是不可能的

blue1025 发表于 2015-3-19 12:26:05

如果对外部Flash的程序加密,可以考虑LPC18S和LPC43S,固件是AES128bit加密的。可惜的是RAM没有,不然就不得了了 为什么要对ram加密,这个实现不难,但为什么就不得了,再下请教了,谢谢!

zhanglongbao 发表于 2016-4-18 14:46:43

谢谢分享

一杯茶2009 发表于 2016-4-22 12:47:38

评判为牛贴,感谢楼主分享

kupier 发表于 2017-10-29 17:22:23

谢谢分享,收藏先!

expresschs 发表于 2018-6-20 17:30:56

mark下,慢慢看

love_zjb 发表于 2018-6-20 17:56:31

大神!谢谢分享
页: [1]
查看完整版本: 原创分享-MCU直接在外接1-4线制SPI Flash上执行代码