NOR Flash

业界领先的半导体器件供应商兆易创新GigaDevice(股票代码 603986)今日宣布,在由盖世汽车主办的2023第五届“金辑奖”颁奖盛典中,凭借旗下车规级GD25/55 SPI NOR Flash和GD5F SPI NAND Flash系列产品荣获“金辑奖2023中国汽车新供应链百强”奖项。 

1.png

“金辑奖”由盖世发起,旨在“发现好公司·推广好技术·成就汽车人”, 2023第五届金辑奖围绕着“中国汽车新供应链百强”这个主题进行展开,重点聚焦在智能驾驶、智能座舱、软件、芯片、人工智能、动力总成电气化、智能底盘、车身及内外饰、低碳新材、热管理领域,进行优秀企业发掘和先进技术解决方案的评选,向行业内外展示和报道这些优秀的创新科技企业和行业领军人物,共同推动行业的发展和进步。本届金辑奖历时近200天,约100万人参与投票评选,最终由专家评委会商定出评选结果。

随着汽车智能化的加速推进,行业对于高性能、高可靠性的芯片需求不断增长,这为汽车半导体带来广阔空间的同时,也使行业面临层层挑战。一方面,汽车芯片的结构性短缺严重制约着行业创新,在此背景下,企业需要对供应链进行重新审视和调整来满足供应挑战;另一方面,车规级芯片对质量、可靠性、使用寿命等方面的高要求与严标准导致其开发和生产的难度大幅增加。针对这一情形,企业需要加强质量管理、提高芯片的可靠性和安全性,并加大研发投入以应对技术挑战。

打响车规级芯片“升级战”

兆易创新以技术实力突破挑战

面对汽车供应中的多重挑战,兆易创新创建了完善的汽车芯片管理体系。在质量监控方面,兆易创新遵循严格的质量标准,将零缺陷质量管控的理念贯穿至每一个环节,以提高产品的安全性与可靠性;在供应方面,兆易创新具有多元化的供应链管理体系,与众多晶圆厂、封测厂建立了长期合作伙伴关系,能灵活地满足客户需求。并且,兆易创新也已通过ISO26262:2018汽车功能安全最高等级ASIL D流程认证,进一步验证了高标准的车规级芯片研发实力,以及为顶级的汽车厂商所需的功能安全目标与要求提供匹配的产品和服务能力。

此次获奖的车规级GD25/55 SPI NOR Flash和GD5F SPI NAND Flash具有丰富的产品选择,如2Mb~4Gb全容量覆盖、高达400MB/s的数据吞吐率、保障安全的RPMC功能、提升可靠性的ECC算法和CRC校验、延长产品寿命的10万次擦写和20年数据保持能力、适应空间受限的紧凑型封装等,可以满足智能驾舱、智能网联、锂电池、电机驱动、充电桩等多种应用领域的需求。GD25/55 SPI NOR Flash和GD5F SPI NAND Flash全系列车规级存储产品已累计出货1亿颗,得到了充分的验证并深受客户认可。

持续研发、深耕市场

全面助推汽车产业高质量发展

兆易创新自2015年开始进入汽车行业,并围绕着“存储和控制”两大领域深耕布局。除了本次获奖的存储产品外,旗下GD32A503系列微控制器符合车规级标准和设计理念,并且拥有主流型配置和优异特性、以及配套的产品级软件,可为客户提供一站式Turnkey解决方案,被广泛应用于车身控制、车用照明、智能座舱、辅助驾驶及电机电源等多种场景的开发与设计。未来,公司还将继续发力车规芯片,以先进的技术与产品赋能汽车市场。

*兆易、兆易创新、GigaDevice,及其标志均为兆易创新科技集团股份有限公司的商标或注册商标,其他品牌和注册商标归各自所有者持有。

来源:兆易创新GigaDevice

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 9

全球半导体存储解决方案领导厂商华邦电子今日宣布推出Serial NOR Flash的首款产品 8Mb 3V W25Q80RV。该产品具备更强的读取性能,尺寸更小,尤其可满足工业与消费类应用场景中边缘设备需求。

1.png

该款8Mb容量Serial Flash 由华邦电子自有的12寸晶圆厂生产,采用最新一代58nm工艺制造,与采用90nm的前代产品相比,尺寸显著减小。该款产品的KGDWLCSP版本非常适合用于各种小型物联网设备。

独立市场调研公司Web-Feet Research总裁 Alan Niebel表示:“到2023年,物联网将拓展到500亿个连接设备。华邦的3V 8Mb Serial NOR Flash 非常适用于汽车和物联网领域。总体而言,物联网有望在新的互联世界中继续增长,到2027年,全球Serial Flash的出货量将达到129亿。”

华邦电子在过去多年都以W25QxxDV系列产品支持客户对8Mb Serial Flash的需求,应用领域包括仪器仪表、联网设备、PC、打印机、车用及游戏设备。如今,W25QxxRV的推出能够支持更多的新兴应用及用例。例如在先进技术中,利用KGDWLCSP解决方案实现无线连接性,并采用更小的引框架封装。

华邦电子供应KGD解决方案已超十年,KGD产品已相当成熟且历经严格测试,与封装产品具备同样的可靠性水平,并且非常适合与需要高速闪存的MCUSoC进行堆叠。华邦电子本次推出的8Mb闪存产品具备更高的读取速度,能够提高系统性能,还为固件OTA和工业应用带来了更快的编程与擦除速度。此外,该款产品更小的外形尺寸和系统内封装(SiP)为各种嵌入式系统带来了更大的价值。

W25Q80RV支持所有主流的单//四通道QPI命令和读取模式。W25Q80RV支持直接从双/四通道SPI XIP)执行代码以及到RAM代码映射。该产品采用 2.7V - 3.6V 单电源供电,关断电流低至 1μA。此外,闪存还被整理为4KB的小扇区,在需要代码、数据和参数存储的应用中能够提供更大的灵活性与存储效率。同时能够支持高达133MHz单通道传输和66MHz双通道传输的SPI 时钟频率。读取命令绕行模式(Read Command Bypass Mode)还允许更快的内存读取,从而实现真正的片上执行(XIP)操作。

华邦电子闪存产品市场副总裁Jackson Huang表示:“华邦致力于通过设计我们的Serial Flash KGDWLCSP解决方案来实现创新和差异化,我们以此为豪。Serial Flash KGDWLCSP适用于需要MCUSoC的小尺寸与非易失性存储的特殊应用。华邦未来将继续与客户密切合作,为下一代嵌入式解决方案带来更多价值。”

W25Q80RV现已上市,后续将会有该产品系列的多个容量版本推出。欲了解更多信息,敬请访问www.winbond.com

关于华邦

华邦电子为全球半导体存储解决方案领导厂商,主要业务包含产品设计、技术研发、晶圆制造、营销及售后服务,致力于提供客户全方位的利基型内存解决方案。华邦电子产品包含利基型动态随机存取内存、行动内存、编码型闪存和TrustME® 安全闪存,广泛应用在通讯、消费性电子、工业用以及车用电子、计算机周边等领域。华邦电子总部位于中国台湾中部科学园区,在台中与高雄设有两座12寸晶圆厂,未来将持续导入自行开发的制程技术,为合作伙伴提供高质量的内存产品。此外,华邦在中国大陆及香港地区、美国、日本、以色列、德国等地均设有子公司,负责营销业务并为客户提供本地支持服务。

围观 28

业界领先的半导体器件供应商兆易创新GigaDevice(股票代码 603986)今日宣布,率先推出采用3mm×3mm×0.4mm FO-USON8封装的SPI NOR Flash——GD25LE128EXH,其最大厚度仅为0.4mm,容量高达128Mb,是目前业界在此容量上能实现的最小塑封封装产品,可在应对大容量代码存储需求的同时,提供极大限度的紧凑型设计自由。

近年来,随着物联网、可穿戴、健康监护、网通等应用的快速发展,市场需求变化多样,不仅要在精致小巧的产品形态中提供丰富的功能,还要具有极低功耗,以保障产品的长时间工作。而SPI NOR Flash作为这些设备中重要的代码存储单元,需提供更小、更薄、更轻的产品选择来满足这些不断变化的应用需求。

1.png

GD25LE系列SPI NOR Flash是兆易创新旗舰型低功耗产品,此次新推出的3mm×3mm×0.4mm FO-USON8 GD25LE128EXH产品延续了LE系列的优异性能,其最高时钟频率133MHz,数据吞吐量高达532Mbit/s,极大提升了客户的系统访问速度和开机效率,同时在4通道133MHz时,读功耗仅为6mA,与行业同类产品相比,降低了45%的功耗,有效延长设备的续航时间。并且,更为重要的是GD25LE128EXH实现了128Mb容量产品上的超小尺寸,此前,业界128Mb容量产品的主流封装为6mm×5mm×0.8mm WSON8,而GD25LE128EXH采用的3mm×3mm×0.4mm超小尺寸的新型封装,面积缩小达70%,厚度减薄50%,能够显著节省85%的空间体积,并节省材料成本。

除了尺寸优势显著提升之外,3mm×3mm×0.4mm FO-USON8 GD25LE128EXH与64Mb及以下容量的3mm×4mm×0.6mm USON8封装产品引脚兼容,无需调整PCB布局即可快速升级容量至128Mb,对于不同容量需求的方案,进一步简化了其兼容性要求的设计。

兆易创新存储事业部执行总监陈晖先生表示:“作为业界领先的Fabless芯片供应商,兆易创新不仅是创新技术的提倡者,同时也是先进技术的践行者。此次率先推出超小尺寸3mm×3mm×0.4mm FO-USON8封装的128Mb SPI NOR Flash,完美匹配了业界对小型化和高集成度的要求,并且基于此封装技术落地的首款产品GD25LE128EXH所具备的低功耗特性也使其适用于任何以电池供电的产品设计中。未来随着智能设备的不断升级,兆易创新预见大容量、小尺寸、低功耗的SPI NOR Flash产品将持续被业界需要。针对这一趋势,公司正在规划通过先进封装和存储技术开发其它容量、更小尺寸的存储产品,为客户提供更多样化的选择。” 

GD25LE128EXH现已量产,客户可联络销售代表或授权代理商了解相关信息。另外,同系列3mm×2mm×0.4mm FO-USON8封装产品GD25LE64E也即将在5月底提供样片,具体详情请联络销售代表。

来源:兆易创新GigaDevice

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 20

NOR FLASH是很常见的一种存储芯片,数据掉电不会丢失,读取速度快,且支持可擦除写入。NOR FLASH支持Execute OnChip,及程序可以自接在FLASH中运行。

作为初始代码的载体,NOR被广泛应用于各个智能化领域。主板BIOS、数字机顶盒、家庭网关、路由器、loT、汽车电子、穿戴式设备、安防监控、人工智能等领域的代码存储媒介中都有NOR。其中,智能穿戴、AMOLED屏、手机摄像、loT设备、汽车电子、5G基站、增强现实、虚拟现实具备较大增长空间。

1.png

航顺芯片作为国内知名的芯片设计公司,量产基于全球最高工艺40nm NOR FLASH芯片HK25Q20和HK25Q16,目前已批量进入市场应用于各种场景,HK25Q20具有工艺制程高、性能强、成本优势明显等优点,可以PIN TO PIN完美替代目前主流的25Q40等小容量的NOR FLASH应用市场。其他基于以前55nm工艺量产之HK25Q40、HK25Q80、HK25Q32、HK25Q64、HK25Q128等全系列产品正常供货的同时正在加速迭代至40nm中!

欢迎广大客户联系我们或代理商,诚招有实力资深NOR Flash代理商洽谈合作!

GENERAL DESCRIPTIONS

The HK25Q20 (2M-Bit) serial flash supports the standard Serial Peripheral Interface (SPI),and supports the Dual SPI: Serial Clock, Chip Select, Serial Data I/O0 (SI), I/O1 (SO),I/O2 。The Dual I/O & Dual output data is transferred with Maximum speed of 208Mbits/s。

FEATURES

✦ SPI Flash Memories

 – Densities: 2Mbit

 – Standard SPI: SCLK, /CS, SI, SO

 – Dual SPI: SCLK, /CS, IO0, IO1
✦ Highest Performance Serial Flash

 – 104MHz for fast read

 – Dual I/O Data transfer up to 208Mbits/s  – Minimum 100,000 Program/Erase Cycles

 – More than 20-year data retention
✦ Low Power Consumption

 – Single 2.3V to 3.6V supply

 – 0.4μA standby current

 – 0.2μA deep power down current

 – 1.5mA active read current at 33MHz

 – 3.0mA active program or erase current
✦ Flexible Architecture

 – Uniform 256-byte Page Erase

 – Uniform 4K-byte Sector Erase  

– Uniform 32/64K-byte Block Erase

– Program 1 to 256 byte per programmable page

✦ Fast Program and Erase Speed

 – 2ms page program time

 – 15ms page erase time

 – 15ms 4K-byte sector erase time

 – 15ms 32K/64K-byte block erase time
✦ Advanced Security Features

 – 128-Bit Unique ID for each device

 – 1*256-Byte Security Registers with OTP Locks
✦ Package Information

 – SOP8

 – USON8 (3x2 mm)

 – USON8(1.5x1.5mm)

 – USON6(1.2x1.2mm)

 – TSSOP8

 – KGD

来源:航顺芯片

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 35

“应需而生!兆易创新推出突破性1.2V超低功耗SPI

兆易创新今日宣布,推出突破性的1.2V超低功耗SPI NOR Flash产品——GD25UF系列。该系列在数据传输速度、供电电压、读写功耗等关键性能指标上均达到国际领先水平,在针对智能可穿戴设备、健康监测、物联网设备或其它单电池供电的应用中,能显著降低运行功耗,有效延长设备的续航时间。

“”

随着物联网技术的发展,新一代智能可穿戴设备需要拥有更丰富的功能来满足消费者的需求,这种空间敏感型产品对系统功耗提出了更严苛的要求,希望进一步提升产品的续航能力。

从系统设计层面来看,一些先进工艺器件的工作电压已低至1.2V,如果所需的Flash可支持1.2V的电压操作,这对于主控而言,将能够有效简化电源设计并优化系统成本。

应此需求,兆易创新推出了GD25UF产品系列,该系列工作电压可扩展至1.14~1.6V,具有单通道、双通道、四通道、和DTR四通道的SPI模式,支持不同容量选择,能够满足智能设备所需的代码存储要求。

在读写性能方面

GD25UF最高时钟频率STR 120MHz,DTR 60MHz,拥有10万次的擦写寿命,数据有效保存期限可达20年。

在安全性方面

该产品具有128bit Unique ID来实现加密效果,为应用带来高安全保障。

同时,为进一步满足低功耗的需求,GD25UF产品系列特别提供了Normal Mode和Low Power Mode两种工作模式。在Normal Mode下,器件读取电流在四通道120MHz的频率下低至6mA;在Low Power Mode下,器件读取电流在四通道1MHz频率下低至0.5mA,擦写电流低至7mA,睡眠功耗低至0.1uA。

相比于1.8V供电的SPI NOR Flash,1.2V GD25UF系列在Normal Mode下,相同电流情况下的功耗降低了33%,而在Low Power Mode下,相同频率下的功耗降低了70%,有效延长了设备的续航时间。

另外GD25UF系列产品的供电电压支持1.14~1.6V的宽电压范围,可显著延长单电池供电应用的使用寿命。并且该系列产品支持SOP8、WSON8、USON8、WLCSP封装,全温度工作范围覆盖-40℃~85℃、-40℃~105℃、-40℃~125℃。

兆易创新存储器事业部执行总监陈晖先生表示:

“GD25UF系列产品进一步丰富了兆易创新的Flash Memory产品线。其具备的1.2V低电压和超低功耗模式可以帮助小容量电池供电设备提高续航能力,即使在不可避免的电池衰减过程中,也可以保持出色且稳定的运行状态,增加应用的可靠性。如今,电池续航能力已经成为消费者选购产品的重要指标,GD25UF系列产品的问世会是下一代可穿戴设备的理想选择。作为国内外鲜少拥有1.2V SPI NOR Flash产品线的企业,兆易创新走在了需求前端,为下一代应用的设计开发缓解了压力,从一定程度上缩短了客户的研发成本,让他们能够在日益激烈的市场竞争中保持领先地位。”

目前,兆易创新GD25UF系列可提供64Mb容量样品,更多容量产品将陆续推出,客户可联络销售代表或授权代理商了解相关的信息。

来源:兆易创新GigaDevice
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 33

兆易创新今天宣布,推出GD25WDxxK6 SPI NOR Flash产品系列,采用1.2mm×1.2mm USON6超小型塑封封装,最大厚度仅为0.4mm,在如此紧凑、轻薄的空间内,其功耗、电压范围等方面均实现了进一步提升,为消费电子、可穿戴设备、物联网以及便携式健康监测设备等对电池寿命和紧凑型设计有着严苛需求的应用提供了理想选择。

“兆易创新GD25WDxxK6

如今,随着5G、物联网、AI等技术的不断迭代,在笔记本摄像头、智能遥控器、智能健康手环等采用电池供电的应用场景中,兆易创新对“小而精”的追求从未停止,这对应用其中的存储产品提出了更高的要求。

一方面,需要提供足够的代码存储空间来满足设备正常运行需求;

另一方面,也需要在尺寸和功耗方面追求精益求精,以适应电子设备日益小型化的趋势。

针对这一市场需求,兆易创新推出的GD25WDxxK6 SPI NOR Flash产品系列采用仅为1.2mm×1.2mm的超小型USON6封装,相比于前一代1.5mm×1.5mm USON8封装产品,缩小了高达36%的占板面积,为空间受限的产品提供了更大的设计自由度。

在低功耗设计方面,兆易创新将GD25WDxxK6系列的功耗控制在极低水平内,在待机状态下,电流仅为0.1μA,可显著延长电子设备的电池寿命。

此外,为满足便携式电子产品的存储需求,GD25WDxxK6提供单通道、双通道SPI模式,具有1.65V~3.6V宽电压工作范围,支持512Kb~4Mb不同容量的选择,最高时钟频率可达104MHz,拥有10万次的擦写寿命,数据有效保存期限可达20年,且全系列支持-40℃~85℃, -40℃~105℃, -40℃~125℃温度范围。

兆易创新存储事业部执行总监陈晖先生表示:“随着万物互联时代下的数据狂潮席卷而来,电子设备对于存储产品不断发出挑战,而兆易创新要做的就是从挑战中寻求突破。此次推出的1.2mm×1.2mm的超小型USON6 GD25WDxxK6 SPI NOR Flash,在方寸之间实现了优异性能。从小尺寸到低功耗,兆易创新从用户需求出发,不断推陈出新,再次将我们‘创新’的DNA发挥得淋漓极致。”

目前兆易创新GD25WDxxK6系列中512Kb~1Mb容量产品已全面量产;2Mb~4Mb容量产品可提供样片,预计在8月中旬实现量产,客户可联络销售代表或授权代理商了解相关的信息。

来源:兆易创新GigaDevice
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 24

在上一篇文章“i.MX RT1170上串行NOR Flash双程序可交替启动设计”里,详细介绍了i.MX RT11xx 系列上的双程序启动设计,本质上就是在双备份程序启动基础上增加了 image版本控制,所以两份image可以按版本优先级来灵活选择启动,而不是死板地靠物理地址高低来定启动顺序。

i.MX RTxxx 系列上(RT500/600)也有双程序可交替启动特性,其主体设计逻辑基本上跟i.MX RT1170是差不多的,只是一些细节处略有差异(比如可启动image 结构不同、otp 配置地址不同、签名实现不同、非易失性寄存器暂存状态设计不同、image 版本判断逻辑略有不同等),除此之外i.MX RTxxx上在验证image完整性方面除了签名外,还有一种相对平民化的CRC32校验可供选择,这也是今天本文要介绍的重点:

一、与i.MX RT11xx系列双程序启动细节差异

本文不打算从头开始完整介绍 i.MX RTxxx 上双程序可交替启动特性,这里只讲和 i.MX RT11xx 上的差异点,其余流程直接参考“i.MX RT1170上串行NOR Flash双程序可交替启动设计”一文。

1.1 恢复启动的接口外设不同

第一点不同其实与本文要讨论的 FlexSPI 双程序启动特性无关,因为我们要聊的还是在一片挂载在 FlexSPI 上的串行 NOR Flash 里做双程序设计,就是下图中的 image 0 和 image 1,不涉及 Flexcomm SPI 接口 Flash B 里的 image 2(在 i.MX RT1170 上这个外设是 LPSPI)。

在介绍 i.MX RT1170 双程序启动一文里我们用了 image L/H 来表示 image 0/1,这里还是恢复使用 image 0/1 来表示,因为后面我们要看的i.MX RT500/600 参考手册启动流程图里就是用 image 0/1来表达的,避免表达混乱。

“i.MX

1.2 可启动 image 结构不同

i.MX RT1170上最简易可启动image结构比较复杂(包含 FDCB、img_ver、IVT、BD、App),而 i.MX RTxxx上就比较简单了(仅需 FDCB、img_ver、App),但是好在两者关于 image version 头结构定义以及偏移位置是完全一致的(0x600)。

typedef struct
{
    uint16_t version;     // 版本值
    uint16_t inversion;   // version值的取反(~version)
} img_ver_t;

此外i.MX RT1170上第一个FlexSPI 的 AHB 映射地址是 0x3000_0000,而 i.MX RTxxx 上第一个 FlexSPI 的 AHB 映射地址是0x0800_0000,这是系统设计差异,需要注意。

注:下图中示意地址均是 Flash 偏移地址,没有包含 AHB 映射地址,另外这里假设第二份 image 偏移地址在 0x400000(具体是由 otp 配置值来决定的)。

“i.MX

1.3 使能双程序启动的otp配置地址不同

i.MX RTxxx 上关于使能双程序启动的 otp 配置定义与i.MX RT1170 上是一致的,只是因为两者 otp 空间设计不同,所以具体配置地址不同。i.MX RTxxx 上具体配置在 otp BOOT_CFG2/3 上面:

Remap功能的ADDR_START寄存器固定设为Flash 起始映射地址。

otp 0x188[31:28] - FlexSPI remap size, App的最大长度,标识了第一份App的结束地址,该值加上ADDR_START后被填入Remap功能的ADDR_END寄存器。

otp 0x18C[31:22] - Second image offset,标识了第二份App的起始地址(在Flash中偏移位置),即填入Remap功能的ADDR_OFFSET寄存器的值。

“i.MX

这次我们要在 MIMXRT595-EVK 板卡上实测,这个板子 FlexSPI0 上挂了两片 Flash,默认连接64MB OctalFlash,还有一片 8MB QuadSPI Flash(需要做板子改动才能使能)。为了跟之前测试保持一致,还是借助 MCUBootUtility 工具将 Second image offset 烧录为 0x10,FlexSPI remap size 保持默认 0,即第二份 image 偏移地址在Flash 0x400000(4MB)处,最大 image 长度也是 4MB。

“i.MX

1.4 暂存状态的非易失寄存器有差异

i.MX RT1170 是用非易失寄存器 SRC_GPR10 其中 2bit 来记录当前启动状态的,而 i.MX RTxxx 上则复杂得多,它采用了 SYSCTL0 外设里的一个非易失寄存器的全部 32bit 来暂存启动状态。

// Load redundant boot options stored in specific register
#define LOAD_REDUNDANT_BOOT_OPTIONS() (*(volatile uint32_t *)(SYSCTL0_BASE + 0x384))

// Store redundant boot options in specific register before system reset
#define SET_REDUNDANT_BOOT_OPTIONS(val) ((*(volatile uint32_t *)(SYSCTL0_BASE + 0x384)) = val

这个32bit寄存器功能原型如下,它不单纯是用做双程序启动的状态记录了,还糅合了 ROM API 功能。具体用法可以在芯片参考手册 ROM API 小节找到,这里不具体展开了,不是本文重点。

typedef struct _user_app_boot_invoke_option
{
    union
    {
        struct
        {
            uint32_t reserved : 8;
            uint32_t boot_image_index : 4;
            uint32_t instance : 4;
            uint32_t boot_interface : 4;
            uint32_t mode : 4;
            uint32_t tag : 8;
        } B;
        uint32_t U;
    } option;
} user_app_boot_invoke_option_t;

1.5 image 版本判断逻辑不同

在 i.MX RT1170 上 image version 头有效的条件一定是其高低16bit符合取反关系,而 i.MX RTxxx 上除了这个条件外,其认定 0xFFFFFFFF 也是一个有效版本(被定为最低版本)。

芯片参考手册里有比较详细的 version 判断逻辑如下,这个逻辑跟 i.MX RT1170 上差异还是比较大的,i.MX RTxxx 上 BootROM 只会启动包含有效版本号的 image,版本有效性是 image 能被启动的一个必要条件,不像 i.MX RT1170 上版本信息只是单纯用来判断启动顺序,不作为 image 是否有效的标准。

“i.MX

在MIMXRT595-EVK开发板上对 image 版本设置情况也做了比较全面的实测,测试结果如下:

“i.MX

二、测试CRC32校验双程序启动

现在来到本文的重头戏了,如何使能 image 的 CRC32 检验启动?这个设计其实最早可追溯到 Kinetis 系列,我有一篇旧文 "Kinetis BOOT特性(完整性检测)",文章很详细地介绍了 Kinetis 系列 BootROM 里是如何支持 CRC32 校验的。

2.1 启动头CRC32参数存储位置

i.MX RTxxx BootROM 关于 CRC32 校验的设计与 Kinetis 非常类似,最大的区别就在于存储 CRC32 三大参数(起始地址,校验长度,校验值)的位置。i.MX RTxxx 上也是放在了 App 默认中断向量表里的保留空间里(offset 0x20, 0x28, 0x34),共 12 个字节。

offset 0x34 - imageLoadAddress: App加载后中断向量表首地址,也决定CRC校验起始地址

- 对于XIP image,一般固定为0x08001000(App无需加载)

- 对于Non-XIP image,App加载前存储起始地址是0x08001000,加载后到指定链接的RAM 地址,CRC计算和校验是发生在App加载后。

offset 0x20 - imageLength: 决定CRC校验总长度,一般是App 的长度(从中断向量表首地址开始到代码体结束)

offset 0x28 - crcChecksum: CRC校验值,[imageLoadAddress : imageLoadAddress + imageLength] 范围内数据的正确CRC32 结果

“i.MX

2.2 使能CRC32校验的条件

当App 默认中断向量表里 offset 0x24 处的imageType[7:0] 类型为 0x02 或者 0x05,且 offset 0x20 处的 imageLength 不为 0 时,CRC32 校验的功能就会被使能。BootROM 在做 CRC32 计算时主要有如下两个注意事项:

Note1: 指定的CRC计算范围如果包含crcChecksum这4bytes的话,在计算CRC时会自动跳过这4bytes。

Note2: 指定的CRC计算长度如果不是4字节对齐,CRC数据计算到最后会自动补0对齐。

2.3 具体CRC32算法选项

关于CRC32 算法的具体实现有很多分支,BootROM 中使用的比较主流的 MPEG2 分支,其在计算 image 具体 CRC 时主要借助了芯片内部的 CRC 模块(这个模块也常见于恩智浦 LPC 系列芯片上),这个 CRC 模块支持三种固定的 CRC 算法多项式(多项式系数不是可自由配置的),BootROM 用得就是最后一个模式选项 CRC-32:

“i.MX

BootROM中对 CRC 模块的配置代码如下:

#include "fsl_crc.h"
void crc32_init(void)
{
    crc_config_t crcUserConfigPtr;
    CRC_GetDefaultConfig(&crcUserConfigPtr);
    crcUserConfigPtr.seed = 0xffffffffU;
    crcUserConfigPtr.polynomial = kCRC_Polynomial_CRC_32;
    crcUserConfigPtr.reverseIn = false;
    crcUserConfigPtr.reverseOut = false;
    crcUserConfigPtr.complementIn = false;
    crcUserConfigPtr.complementOut = false;
}

2.4 利用工具自动添加CRC校验参数

对CRC32 校验启动的原理了解差不多了,我们现在在 MIMXRT595-EVK 开发板上实测一下,跟前面测试一样,先使用\SDK_2.10.1_EVK-MIMXRT595\boards\evkmimxrt595\driver_examples\gpio\led_output\iar\flash_debug例程生成两个闪灯间隔时间不同的程序镜像文件:image 0 -gpio_led_output_delay200ms.bin 和 image 1 -gpio_led_output_delay2s.bin。

然后借助MCUBootUtility 工具(需要 v3.5.0 版本及以上),在 Secure Boot Type 里选择 Plain CRC ImageBoot,点击 All-In-One 下载按钮(两个文件分别做两次同样的下载流程),工具会自动在 image 相应地方填充进所需的 CRC32 参数并下载进 Flash。

“i.MX

这时候在工具通用编程器模式(Boot Device Memory)里我们再读回 image 保存就可以得到两个含 CRC32 校验的程序镜像文件 image 0 -gpio_led_output_delay200ms_crc.bin 和 image 1 -gpio_led_output_delay2s_crc.bin。

以image 0 为例,根据 0x08001020 处的imageLength 信息显示,image 0 App 本身长度为 0x36e8 字节,而 App 起始偏移是 0x1000,所以我们直接是从偏移 0 地址处开始读回 0x46e8 字节作为gpio_led_output_delay200ms_crc.bin 文件数据。此外 image 0 的 CRC32 校验值已经填好了,是 0x4d8957d8。

“i.MX

2.5 手动验证CRC32校验值的方法

在使用image 0 - gpio_led_output_delay200ms_crc.bin 和 image 1- gpio_led_output_delay2s_crc.bin 做双程序启动前,我们可以先手动地验证下其中的 CRC32 校验值是否正确,痞子衡找到一个在线计算 CRC 的网站:

CRC在线校验网站:http://www.sunshine2k.de/coding/javascript/crc/crc_js.html

在这个网站里把模式选好,然后从 gpio_led_output_delay200ms_crc.bin 文件里仅拷贝出App 部分的数据放到网站 CRC Input Data 框(注意要手动删除 crcChecksum 四个字节,另外还要检查总数据字节长度是否按 4 对齐,如果不对齐,要在数据末尾按格式补上相应的 00),最后点击网站上的 Calculate CRC!按钮可以得到结果,这里我们看到两个结果是一致的:

“i.MX

2.6 含CRC32校验的双程序启动测试

现在可以利用 image 0 - gpio_led_output_delay200ms_crc.bin 和 image 1 - gpio_led_output_delay2s_crc.bin 测试双程序启动了,继续借助 MCUBootUtility 工具的通用编程器模式将其分别下载进 0x0 和 0x400000 地址处,必要时还可以手动调整两个 image 里的版本号,测试过程中也可以稍微修改一下 image 数据再下载或者下载后再擦除一些 image 区域(故意让CRC32校验失败),最终测试结果如下:

“i.MX

三、一些关于image的注意事项

  • Note1:虽然文中所有的测试均是针对 XIP image,但这个双程序可交替启动特性对于 Non-XIP image 也同样适用。

  • Note2:如果是 XIP image,其链接地址要求固定在 Flash 偏移 0x1000 处(如果 Flash 挂在第一个 FlexSPI 上,其 AHB 地址就是 0x08001000)。

  • Note3:如果是 Non-XIP image,在 SDK 包里无法直接生成含启动头的 Non-XIP image binary,这时候可以先使用 MCUBootUtility 主界面的 All-In-One 操作下载一次 image,再通过通用编程器界面 Read 操作读回来便是含启动头的 Non-XIP image binary。

  • Note4:使能 CRC32 校验的双程序可交替启动,也是同时支持 XIP image 和 Non-XIP image 的。

相关阅读
《i.MX RT1060/1010上串行NOR Flash冗余程序启动设计》
《i.MX RT1170上串行NOR Flash双程序可交替启动设计》

来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 38

在前一篇文章 《i.MX RT1060/1010上串行NOR Flash冗余程序启动设计》里,我详细介绍了i.MX RT10xx上的冗余程序启动设计,本质上这就是个双备份程序启动, NORFlash里存两份一样的image,物理地址靠前的image 0启动失效就继续启动后面的image 1,多一层保障。

i.MX RT1170是区别于i.MX RT10xx的第二代架构,性能/功能更加强大,其在继承 i.MX RT10xx冗余程序启动的基础上,新增了双程序可交替启动设计,今天我们就来聊聊这个话题:

一、初识双程序可交替启动

与i.MX RT10xx一样,这里要聊的还是在一片挂载在FlexSPI上的串行NOR Flash里做冗余/双程序设计,就是下图中的image L和image H,不涉及LPSPI接口Flash B里的image 2。

“i.MX

先说跟i.MX RT10xx上一样的冗余程序启动流程,i.MX RT1170上电先启动物理地址靠前的image L,如果image L被破坏了,则继续启动image H。

什么是双程序可交替启动呢?简单说就是物理地址靠前的image L并不总是上电首先启动的image,在i.MX RT1170上新增了如下原型的image version启动头(在固定偏移 0x600 处),芯片上电 BootROM 会尝试判断两个 image L/H 里的 version 头版本,高版本的 image 优先被启动。这种设计方便了 OTA 升级。

Note: 当image L/H中均不含有效version启动头时(img_ver 等于 0xFFFFFFFF,或者高低16bit不符合取反关系),双程序可交替启动特性就不生效,此时等效于冗余程序启动,image L 永远被优先启动。

typedef struct
{
    uint16_t version;     // 版本值
    uint16_t inversion;   // version值的取反(~version)
} img_ver_t;

“i.MX

二、回顾冗余程序启动

在测试双程序可交替启动新特性之前,还是先过一下冗余程序启动。按照文章《i.MX RT1060/1010上串行NOR Flash冗余程序启动设计》第2节里一模一样的方法,在恩智浦官方MIMXRT1170-EVK开发板上做测试,这个板子FlexSPI1上挂了两片Flash,默认连接的16MB QuadSPI Flash,还有一片 64MB OctalFlash(需要做板子改动才能使能)。

在 i.MX RT1170 fuse 里关于冗余程序启动的使能位定义与i.MX RT10xx上差不多,只不过 fuse 地址从 0x6E0 换到了0xC80。还是跟之前测试一样借助MCUBootUtility工具将 FLEXSPI_NOR_SEC_IMAGE_OFFSET 烧录为 0x10,xSPI_FLASH_IMAGE_SIZE 保持默认 0,即第二份 image 偏移地址在 Flash 0x400000(4MB)处,最大 image 长度也是4MB。

“i.MX

继续用\SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\led_blinky\cm7\iar\flexspi_nor_debug例程生成两个稍微不一样的 image,闪灯间隔时间一个是200ms(image L - iled_blinky_cm7_delay200ms.bin),另一个是 2s(image H - iled_blinky_cm7_delay2s.bin)。在 MCUBootUtility 工具主界面下使用 All-In-One 操作将 image L 下载进 Flash(baseaddress 设为 0x30000400),使用通用编程器界面 Write 操作将 image H 也下载进 Flash(Start 设为0x400400)。

现在Flash 里有了两份 image,当第一份 image 启动失败后,i.MX RT1170 BootROM 不是立刻去执行下一份 image ,还是那个取巧的方法,在一个软复位不置位的寄存器里(SRC_GPR10)标记当前状态,然后调用 NVIC_SystemReset() 重新进入 BootROM 执行。不过此时标记位从 GPR10[30] 换到了 GPR10[27:26],虽然是 2bit 状态,但设值 1/2/3 等效于设值 1,因为对于串行 NOR Flash 最多就是两份 image。这时候如果你想挂 J-Link 改写 SRC_GPR10 去做快速验证恐怕无法如愿,原因请看 《i.MX RT1170上用J-Link连接复位后PC总是停在0x223104》

“i.MX

所以在i.MX RT1170上只能老老实实做破坏 image 完整性的动作来验证冗余程序启动,经实测其效果与i.MX RT10xx 是完全一致的。

三、实测双程序可交替启动

现在我们开始实测双程序可交替启动,主要的工作量就是为 image L 和 image H 添加 version 启动头,并且将它们分别下载进 Flash。因为我们想验证物理地址靠后的 image H 比 image L 优先启动(冗余程序启动做不到这点),所以需要将 image H 的 version 头版本设高一点。

3.1 为 image 添加version 启动头

还是在\SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\led_blinky\cm7\iar\flexspi_nor_debug例程基础上,首先在工程链接文件 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 添加如下语句,指定 .img_ver 段的位置。

define symbol m_boot_img_ver_start           = 0x30000600;

place at address mem: m_boot_img_ver_start { section .img_ver };

然后在工程随便一个源文件里添加如下常量 s_bt_img_l_ver 定义,这个 image 闪灯间隔时间是 200ms(image L -iled_blinky_cm7_delay200ms_ver0.bin),版本是 0x0000(注意编译链接工程时为防止 s_bt_img_l_ver 被优化,可以在工程选项 Linker / Input /Keep symbols 里将其添加进去)。

const img_ver_t s_bt_img_l_ver @ ".img_ver" = {
    .version = 0x0000,
    .inversion = ~0x0000,
};

同样的工程,再生成另一个闪灯间隔时间为 2s(image H -iled_blinky_cm7_delay2s_ver1.bin) 的 image 时使用如下常量s_bt_img_h_ver 定义,版本是 0x0001。

const img_ver_t s_bt_img_h_ver @ ".img_ver" = {
    .version = 0x0001,
    .inversion = ~0x0001,
};

当然如果你嫌上述方法繁琐,也可以直接在最终 image binary 文件上做修改(注意 offset 位置一定要找对,i.MX RT1170 SDK XIP binary 文件起始数据对应 Flash 偏移是 0x400,因此文件中 0x200 处才对应 Flash 偏移 0x600):

“i.MX

3.2 下载含 version 头的image 进 Flash

现在需要借助 MCUBootUtility 工具的通用编程器功能分别将两个含 version 头的 image L/H 下载进 Flash。这里需要注意的是此时 image L 无法再通过主界面 All-In-One 操作来下载了,因为工具 v3.4 版本及以下没有对 version 启动头做识别处理,因此会丢掉 version 头数据(这个考虑会在 v4.0 之后加入支持)。

“i.MX

“i.MX

两个 image下载完成,一切工作就结束了,这时候你调整芯片启动模式到 2'b10 - Flash boot,给板卡重新上电,应该可以看到 image H 正在执行。

3.3 BootROM中判断version的逻辑

BootROM中关于 version 启动头是否有效以及版本高低判断逻辑其实是有一点复杂的,这里把具体代码分享给大家,方便大家为 image 设置有效的 version 头以及正确使能这个双程序可交替启动特性。

判断逻辑代码主要意思是仅当 image L 的版本不是 0xFFFFFFFF 且 image H 的版本是有效的(img_ver 高低16bit符合取反关系)情况下,如果 image L 版本无效或者 image L 版本有效但比 image H 版本低,则物理地址靠后的 image H 优先启动。除此以外其余情况,一律是物理地址靠前的 image L 优先启动。

uint32_t image_l_base = FlexSPIx_AMBA_BASE
uint32_t image_h_base = FlexSPIx_AMBA_BASE + FLEXSPI_NOR_SEC_IMAGE_OFFSET

uint32_t get_image_index(void)
{
    uint32_t redundant_boot = ((SRC->GPR[9] & 0x0C000000) >> 26);

    static uint32_t image_index[] = { 0, 0 };
    img_ver_t image_l_version = *(img_ver_t *)(image_l_base + 0x600);
    img_ver_t image_h_version = *(img_ver_t *)(image_h_base + 0x600);
    if ((image_l_version.version != 0xFFFFu || image_l_version.inversion != 0xFFFFu) &&
        ((0xFFFFu & image_h_version.version) == (0xFFFFu ^ image_h_version.inversion)) &&
        ((0xFFFFu & image_l_version.version) != (0xFFFFu ^ image_l_version.inversion) || (image_l_version.version < image_h_version.version)))
    {
        image_index[0] = 1;
    }
    else
    {
        image_index[1] = 1;
    }

    return image_index[redundant_boot];
}

痞子衡在MIMXRT1170-EVK 开发板上对image 版本设置情况也做了比较全面的实测,测试结果如下:

“i.MX

四、一些关于image的注意事项

1)虽然文中所有的测试均是针对 XIP image,但这个冗余程序/双程序可交替启动特性对于 Non-XIP image 也同样适用。

2)如果是 XIP image,其链接地址不一定要固定在偏移 0x2000 处,因为 IVT 的存在,其是可以链接在偏移 0x2000 之后的任意位置的。

3)如果是 Non-XIP image,在 SDK 包里无法直接生成含启动头的 Non-XIP image binary,这时候可以先使用 MCUBootUtility 主界面的 All-In-One 操作下载一次 image,再通过通用编程器界面 Read 操作读回来便是含启动头的 Non-XIP image binary。

相关阅读
《i.MX RT1060/1010上串行NOR Flash冗余程序启动设计》

来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 152

华邦新型 1.2V SpiFlash 产品W25Q64NE提供高存储容量,可满足TWS耳机和健身手环等新一代无线消费类电子设备的内存需求

全球半导体存储解决方案领导厂商华邦电子今日宣布,推出全新SpiFlash® 产品W25Q64NE ,首次将1.2V SPI NOR Flash容量扩展至64Mb。华邦新型W25Q64NE闪存可提供更多代码存储空间并减少设备的运行功耗,充分满足新一代智能可穿戴设备和移动设备的内存需求。

“华邦电子扩展其存储容量,推出全新超低功耗64Mb

华邦是第一家推出 1.2V SPI NOR Flash的闪存制造商,该产品工作电压的扩展范围是1.14V-1.6V,可兼容单节 AA型碱性电池的输出电压。此次将产品容量提升至64Mb,华邦 1.2V NOR Flash系列产品可满足智能设备对代码存储空间的更高要求。目前,新型 W25Q64NE产品已经送样,同时提供符合行业标准封装的USON8-3x4和WLCSP小尺寸封装形式。

产品特点

通常,移动设备和可穿戴设备的总功耗有99%都是在运行模式中产生,与1.8V SpiFlash产品相比,华邦1.2V SPI NOR Flash可将Flash本身的运行功耗减少三分之一。因此,使用华邦的 1.2V NOR Flash可帮助电池容量较小的设备如TWS耳机与健身手环大幅延长产品续航时间。

华邦表示:“如今,电池续航时间已经成为影响消费者购买TWS耳机和智能手表等新产品的关键因素,而华邦新型W25Q64NE闪存正是这些设备制造商的理想选择,可助力提高终端产品竞争力。”

在工作频率为 50MHz 的读取模式下,1.8V SpiFlash 内存的工作电流为 4mA,功耗为 7.2mW。而同样在50MHz时,华邦1.2V SpiFlash内存的工作电流也为4mA,但功耗仅为 4.8mW。使用1.2V SpiFlash替换1.8V产品,可立即节省33%的功耗。

除省电外,1.2V SpiFlash还可简化系统设计并降低成本。随着 SoC工艺向更先进的制程发展,新一代 SoC 的 I/O 电压正在逐步降低,目前已经低于1.8V,因此需要搭配电平转换器才能与传统的 1.8V/3V SPI Flash连接,这将导致额外的成本支出并增加系统设计的复杂性。而采用1.2V 闪存,SoC 无需电平转换器即可直接连接到 SPI Flash,从而降低 BOM 成本和 PCB 占用空间。

华邦W25Q64NE配备性能出色的标准SPI NOR 接口,最大数据传输速率可达 42MB/s。与1.8V/3V SPI Flash操作方式的架构相同,支持最小4KB的可擦除扇区。

欲了解更多产品信息,请访问华邦电子官网:www.winbond.com

关于华邦

华邦电子为全球半导体存储解决方案领导厂商,主要业务包含产品设计、技术研发、晶圆制造、营销及售后服务,致力于提供客户全方位的利基型内存解决方案。华邦电子产品包含利基型动态随机存取内存、行动内存、编码型闪存和TrustME®安全闪存,广泛应用在通讯、消费性电子、工业用以及车用电子、计算机周边等领域。华邦总部位于中国台湾中部科学园区,在美国、日本、以色列、中国大陆及香港地区、德国等地均设有公司服务点。华邦在中科设有一座12寸晶圆厂,目前并于南科高雄园区兴建新厂,未来将持续导入自行开发的制程技术,提供合作伙伴高质量的内存产品。

围观 23

MM32系列微控制器为用户提供了丰富的选择,可适用于工业控制、智能家电、建筑安防、医疗设备以及消费类电子产品等多方位嵌入式系统设计。在某些应用中,需要较大容量的存储空间用于存储数据;这时可以通过SPI 外扩NOR Flash,NAND Flash, 或者通过SDIO扩展SD Card或TF-Card。但有些需要高速存储数据,上述方式还是不够快速,这时可以使用MM32F3270系列的FSMC来外扩并行NOR Flash来实现。

并行NOR Flash与并行SRAM和PSRAM的读写接口大部分相同,但NOR Flash的写入速度与SRAM和PSRAM比较,相对较慢,需要通过NWAIT 信号检查NOR Flash的操作状态,并做一些等待,相应的时序需要根据不同的NOR Flash芯片所规定的参数而做相应的设置即可。

本文接下来就使用MM32F3270外挂S29GL128P NOR Flash芯片来演示FSMC对NOR Flash芯片的设置与读写。

前文已经介绍了MM32F3270的FSMC的接口功能与特色。结合MM32F3270 的FSMC外部接口信号,可使用异步方式访问NOR Flash,可以选用复用或非复用方式扩展NOR Flash,还可以通过配置实现外扩8位总线或16位总线接口的NOR Flash。

“表1:FSMC控制器外部信号"
表1:FSMC控制器外部信号

MM32F3270系列MCU因为封装的原因,导致只有部分MCU产品可以通过硬件复用出全部或部分的FSMC接口的相关GPIO;外扩NOR Flash也只有使用 LQFP144引脚封装MCU芯片才能支持连接地址数据非复用和复用方式外扩并行NOR Flash;而LQFP100引脚封装芯片因地址线缩减,仅支持连接地址数据复用方式外扩并行NOR Flash。LQFP64因为无法引出足够的地址与数据总线,同样不支持外扩并行NOR Flash。

“表2:MM32F3270不同封装芯片与NOR
表2:MM32F3270不同封装芯片与NOR Flash接口

目前市场上非复用型16位数据总线接口的NOR Flash也是较为普遍,下面针对非复用方式,介绍MCU与NOR Flash的硬件原理图设计和软件寄存器配置。

在此用MM32F3270的FSMC接口扩展S29GL128P NOR Flash,其原理框图如下:

“图1:NOR
图1:NOR Flash原理框图

S29GL128P的数据按 16 位的Half Word寻址,容量128M Bit, 16M字节,从芯片手册中可以查询到S29GL128P的引脚功能描述如下:

“表3:NOR
表3:NOR Flash引脚信号

S29GL128P可以通过CS, OE, WR, WP#, RY/BY#控制电路,结合Address与Data I/O实现对NOR Flash的读写操作。

1、FSMC非复用方式控制NOR Flash的硬件设计

“表4:NOR
表4:NOR Flash数据, 地址, 读写信号与MCU接口的引脚说明

外部设备地址映像从FSMC的角度看,FSMC外扩寻址空间用于访问最多4个FSMC地址映射空间,可以用于访问4个NOR闪存或SRAM/PSRAM存储设备,并对应的有4个专用的片选FSMC_NE[4:1]。

外部存储器划分为固定大小为64M字节的四个存储块,见下图。

“使用MM32F3270

存储区块与片选信号对应关系:

“使用MM32F3270

HADDR是需要转换到外部存储器的内部AHB地址线。HADDR[25:0]包含外部存储器地址。HADDR是字节地址,而存储器访问不都是按字节访问,因此接到存储器的地址线依存储器的数据宽度有所不同,如下表:

“使用MM32F3270

对于16位宽度的外部存储器,FSMC将在内部使用HADDR[25:1]产生外部存储器的地址FSMC_A[24:0]。不论外部存储器的宽度是多少(16位或8位),FSMC_A[0]始终应该连到外部存储器的地址线A[0]。

根据外部NOR Flash设计原理图:

“使用MM32F3270

2、FSMC非复用方式控制NOR Flash的程序设计

根据配置的接口电路配置GPIO初始化程序与FSMC初始化程序。

void FSMC_NOR_Init(void)
{
    FSMC_InitTypeDef  FSMC_InitStructure;
    FSMC_NORSRAM_Bank_InitTypeDef  FSMC_BankInitStructure;

    FSMC_NORSRAM_BankStructInit(&FSMC_BankInitStructure);
    FSMC_NORSRAMStructInit(&FSMC_InitStructure);
    RCC_AHB3PeriphClockCmd(RCC_AHB3ENR_FSMC, ENABLE);

    FSMC_BankInitStructure.FSMC_SMReadPipe    = 0;
    FSMC_BankInitStructure.FSMC_ReadyMode     = 0;
    FSMC_BankInitStructure.FSMC_WritePeriod   = 15;
    FSMC_BankInitStructure.FSMC_WriteHoldTime = 3;
    FSMC_BankInitStructure.FSMC_AddrSetTime   = 3;
    FSMC_BankInitStructure.FSMC_ReadPeriod    = 15;
    FSMC_BankInitStructure.FSMC_DataWidth     = FSMC_DataWidth_16bits;
    FSMC_NORSRAM_Bank_Init(&FSMC_BankInitStructure, \
    FSMC_NORSRAM_BANK1);

    FSMC_InitStructure.FSMC_Mode = FSMC_Mode_NorFlash;
    FSMC_InitStructure.FSMC_TimingRegSelect = FSMC_TimingRegSelect_0;
    FSMC_InitStructure.FSMC_MemSize = FSMC_MemSize_64MB;
    FSMC_InitStructure.FSMC_MemType = FSMC_MemType_FLASH;
    FSMC_InitStructure.FSMC_AddrDataMode = FSMC_AddrDataDeMUX;
    FSMC_NORSRAMInit(&FSMC_InitStructure);
}

GPIO初始化

void FSMC_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_StructInit(&GPIO_InitStructure);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB | RCC_AHBENR_GPIOC | \
    RCC_AHBENR_GPIOA | RCC_AHBENR_GPIOD | RCC_AHBENR_GPIOE | \
    RCC_AHBENR_GPIOF | RCC_AHBENR_GPIOG, ENABLE);

    GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_12);  //NOE
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_12);  //NWE
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_12);  //NWAIT
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_12); //A16
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_12); //A17
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_12); //A18
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_12); //D0
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_12); //D1
    //省略部分代码
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource0, GPIO_AF_12);  //A0
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource1, GPIO_AF_12);  //A1
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource2, GPIO_AF_12);  //A2
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource3, GPIO_AF_12);  //A3
    //省略部分代码
    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_All;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_FLOATING;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    //省略部分代码

}

从选择的片选信号与FSMC外扩存储映像空间可以得出Bank2地址为0x64000000,使用该地址作为读写外部NOR Flash的基地址。

#define NOR_FLASH_START_ADDR       ((u32)0x64000000)
#define NOR_FLASH_END_ADDR         ((u32)0x67FFFFFF)
//读一个半字
u16 FSMC_NOR_ReadHalfWord(u32 ReadAddr)
{
    NOR_WRITE(ADDR_SHIFT(0x00555), 0x00AA);
    NOR_WRITE(ADDR_SHIFT(0x002AA), 0x0055);
    NOR_WRITE((NOR_FLASH_START_ADDR + ReadAddr), 0x00F0 );
/* exit autoselect (write reset command) */
    return (*(vu16*)((NOR_FLASH_START_ADDR + ReadAddr)));
}
//连续读一块半字数据
void FSMC_NOR_ReadBuffer(u16* pBuffer, u32 ReadAddr, u32 NumHalfwordToRead)
{
    NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA);
    NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055);
    NOR_WRITE((NOR_FLASH_START_ADDR + ReadAddr), 0x00F0);
/* exit autoselect (write reset command) */
    for(; NumHalfwordToRead != 0x00; NumHalfwordToRead--) {
        // Read a Halfword from the NOR
        *pBuffer++ = *(vu16*)((NOR_FLASH_START_ADDR + ReadAddr));
        ReadAddr = ReadAddr + 2;
    }
}

读写外部NOR Flash与读写外部SRAM的操作,地址寻址方式是一样的,但NOR Flash的写数据有较大的不同。

以单个Word编程为例,如下为写单个Word的流程图与实现代码:

“使用MM32F3270
NOR_Status FSMC_NOR_WriteHalfWord(u32 WriteAddr, u16 Data)
{
    NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA);
    NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055);
    NOR_WRITE(ADDR_SHIFT(0x0555), 0x00A0);
    NOR_WRITE((NOR_FLASH_START_ADDR + WriteAddr), Data);

    return (FSMC_NOR_GetStatus(Program_Timeout));
}

通过MindMotion的官网下载MM32F3270 lib_Samples:

https://www.mindmotion.com.cn/products/mm32mcu/mm32f/mm32f_mainstream/mm32f3270/

工程路径如下:

~MM32F327x_Samples\LibSamples\FSMC\FSMC_NOR\

可以看到详细的样例与功能操作。

下章的题目为《使用MM32F3270 的FSMC驱动外部OLED》讲解通过FSMC外扩并口OLED的实现。

来源:灵动MM32MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 103

页面

订阅 RSS - NOR Flash