搜索

tag 标签: FLASH

相关帖子

版块 作者 回复/查看 最后发表
RAM、SRAM和FLASH的区别 信息发布 英尚微电子 2017-8-22 4 7076 英尚微电子 2019-2-26 10:59
DDR3与DDR2内存区别 信息发布 英尚微电子 2017-8-14 1 1112 英尚微电子 2018-2-28 15:00
CCS v5中烧写Flash实录:成功+失败 【微控制器 MCU】 Jacktang 2017-6-26 0 808 Jacktang 2017-6-26 09:00
RL78 Flash Self-Programming Library 怎么读取写入的数据 【瑞萨电子MCU】 yanghexin1990 2017-6-23 8 3323 hugoseo 2019-12-25 08:51
ADI最最最最新的中文资料来了~ attach_img 信息发布 春之歌 2017-6-14 0 1313 春之歌 2017-6-14 23:39
FPGA视频处理-兼职 求职招聘 qinshaop 2017-5-29 0 2323 qinshaop 2017-5-29 16:29
拆解 ARM,CPLD,FLASH, RAM 各一片,供大家娱乐。 attach_img 【以拆会友】 strong161 2017-5-24 58 9929 pkoko 2019-11-18 20:26
[OpenWRT点灯系列 一]自己编译OpenWRT 【Linux与安卓】 shinykongcn 2017-5-24 0 0 shinykongcn 2017-5-24 10:07
MSP430 Flash信息区 【微控制器 MCU】 fish001 2017-5-23 0 505 fish001 2017-5-23 08:35
MSP430学习经典方法 【微控制器 MCU】 Aguilera 2017-5-23 0 4646 Aguilera 2017-5-23 08:29
求助RL78 data flash 的库怎么用啊? 【瑞萨电子MCU】 ebaeab 2017-4-30 2 2200 yanghexin1990 2017-4-30 14:30
FLASH重新复位或者上电后是如何确定上次数据存储地址的??? 【EE_FPGA学习乐园】 HAORUIMIN 2017-4-26 2 2640 HAORUIMIN 2017-4-28 16:46
msp430Flash型单片机内部Flash存储器介绍 【微控制器 MCU】 Jacktang 2017-4-25 0 707 Jacktang 2017-4-25 20:42
萝卜家园GHOST Win7 SP1纯净旗舰版(64位)V2017.05 attach_img 信息发布 xiao810123 2017-4-24 0 10100 xiao810123 2017-4-24 19:22
MSP430单片机的框架程序 【微控制器 MCU】 Jacktang 2017-4-24 0 505 Jacktang 2017-4-24 14:28
编程利用MSP430的FLASH储存空间的实例 【微控制器 MCU】 fish001 2017-4-23 0 808 fish001 2017-4-23 21:04
求购downgrade nand flash/ ink die on blue tape 信息发布 cadsm300 2017-4-23 1 1515 Peteryu1230 2019-4-4 18:07
记忆科技苏州研发中心需求高级SSD硬件开发工程师 求职招聘 maggiemamaqiao 2017-4-20 0 6666 maggiemamaqiao 2017-4-20 14:35
error flash download failed target dll been cancelled 【NXP LPC MCU】 yunhai14 2017-4-24 5 2138 残雪 2017-4-25 09:54
有没有哪位大神用过dsPIC33FJ128MC804读写NAND FLASH attachment 【PIC单片机】 liuxian143x 2017-5-25 1 1146 暗室逢灯啊 2017-5-25 14:18

相关日志

分享 上海普冉(PUYA)高性价比NOR FLASH系列
sunnyqi001 2019-8-16 14:28
NOR Flash 和 NAND Flash 是现在市场 综述 上两种主要的非易失闪存技术。大多数情况下闪存只是用来存储少量的代码,这时 NOR 闪存更适合一些,而 NAND 则是高数据存储密度的理想解决方案。 NOR的特点是芯片内执行 (XIP , Execute In Place) ,这样应用程序可以直接在 Flash 闪存内运行,不必再把代码读到系统 RAM 中。 NOR 的传输效率很高,在 1 ~ 4MB 的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。 NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用 NAND 的困难在于 Flash 的管理需要特殊的系统接口。 目前全球90%市场在前 5 大 NOR FLASH 公司:镁光、旺宏、华邦、 CYPRESS (已收购台湾宜扬科技)、兆易创新。其它百分之十的市场被国内的 PUYA (普冉)、 XMC (武汉新芯)、 BOYA (博雅)、 YICHU (易储)、 XTX (芯天下)和其他品牌等占有。涉及的行业应用涵盖了:玩具、故事机、学习机、手机、数码相机、电脑、家电、 DVB 、 DVD 、安防、蓝牙音响、智能硬件、 iOT 、 AI 应用、汽车电子、工控应用等行业。 NOR FLASH目前的晶圆厂有:台积电、华润上华、联华电子、和舰科技、华虹 NEC 、华力微电子、武汉新芯、中芯国际等,前几大封装测试厂有:日月光、安靠封测、矽品科技、京隆科技、南通富士通、华润安盛、天水华天等。 普冉半导体(上海)有限公司是非易失性存储器、高安全存储器的供应商。主要是聚焦在超低功耗 SPI Nor Flash、高可靠性的 Serial EEPROM 和高安全性的闪存。包括于 IoT 、 NB-IoT 、穿戴、蓝牙、 PLCC 以及智能硬件等领域。 普冉(PUYA)系列晶元厂及封装厂 普冉系列特征: - 容量从 512Kb 到 64Mb ,用于代码和数据存储 - U系列,宽电源: 1.65 至 3.60V (仅限 MXIC 和 Puya 有) - L系列,低电压: 1.65 至 2.00V (与华邦兼容),其中 P25Q40L-UXH-IR 在手机FPC排线及手机周边数码配件行业用量非常大,其性价比非常出色 - H系列,高压: 2.30 至 3.60V , P25QxxH 系列在消费品领域逐步成为主流型号 普冉系列应用市场: 普冉(PUYA)与旺宏、华邦、兆易创新等部分品牌可替换型号: 以下是普冉(PUYA)系列部分采购选型信息: PUYA---P25Q40/20/10/05对应 4Mb/2Mb/1Mb/512Kb 采购选型信息 PUYA---P25Q80对应采购选型信息 PUYA---P25Q16对应采购选型信息 PUYA---P25Q32对应采购选型信息 PUYA---P25Q64对应采购选型信息 桑尼奇作为普冉(PUYA)授权一级代理,可供应全系列型号,原厂技术亲自参与从选型、打样到批量全过程,帮助客户选用最合适的型号,实现成本最优化。如需了解更多产品信息按以下方式联系肖生 QQ : 1735477079 手机: 18576774167 。 (以上信息由 深圳市桑尼奇科技有限公司 提供 www.sunnyqi.com )
0 个评论
分享 低电压SPI FLASH,P25Q40L简介
sunnyqi001 2019-8-9 17:48
谈到 FLASH ,大家传统的、直观的印象可能就是存储介质,或者一颗小容量的存储芯片。在今天这个半导体发展飞速的环境下, SPI FLASH 相信大家都不陌生,已经广泛应用于机顶盒、液晶显示器、数码相框和手机 FPC 排线等等产品,相对以前的 NOR FLASH ,它的硬件兼容性更好,封装更小,节省了成本,电压可选择范围也更广。 本文介绍的 SPI FLASH 是普冉半导体(上海)有限公司的一款低电压存储器 P25Q40L ,兼容华邦的相应产品。该款 SPI FLASH 面向显示屏及完整产品线,目前已在众多公司产品上量产使用,典型量产案例有屏模组厂合力泰的魅族项目,与德方案,搭配奇景主控。近期 P25Q40L 的应用市场主要是手机屏幕行业,用在 FPC 排线上,部分厂家已达到 KK 级需求。 目前我司代理销售普冉半导体的全系列产品,包括 SPI FLASH (兼容各类需求电压范围,业界仅普冉和旺宏具备宽电压产品)、 Serial EEPROM 和 WLCSP 产品,供用户选择。桑尼奇科技长期配套现货供应,并可提供参考设计及技术资料等服务。如需了解 P25Q40L 及更多 IC 芯片类产品信息按以下方式联系华先生 QQ : 695606378 手机: 15347785906 ,原装现货,欢迎交流。( 更多详情 ) 产品信息如下 电压范围: 1.65V — 2.0V 温度范围: -40 ℃— 85 ℃ 兼容串行接口: Mode 0 and Mode 3 Pin Definition : Block Diagram : 订购须知: 如有对 P25Q40L 或是其它普冉 SPI FLASH 感兴趣的客户可联系桑尼奇科技索取资料并试样,桑尼奇科技长期配套现货供应,并可提供设计参考及技术支持等服务。如需了解更多普冉 FLASH 和 IC 芯片信息,请按以下方式联系华先生 QQ : 695606378 手机: 15347785906 。 ( 以上信息由 深圳市桑尼奇科技有限公司 提供 www.sunnyqi.com)
0 个评论
分享 学STM32硬件-Flash
chenht7 2017-6-24 13:51
学STM32硬件-Flash --- 6/24/2017AM # 一、内容概要 1. 对于Flash的介绍 2. 对于所用芯片的介绍 # 二、内容详述 因为最近,买些手机这类东西的时候,实在是太容易把ROM和RAM,以及手机中一些混乱的内存这些的关系给搞乱掉了,于是刚开始写这些内容,就先捋一捋这些内容吧。 ## 1、内存与外存 在计算机原理里面,将计算机的硬件分为CPU、、主存储器(内存)、辅存储器(外存)、输入/输出设备与总线五类主要部件组成。那么主存储器就的别名应该就是内存。辅存储器呢,就是软盘(虽然现在不大用了)硬盘,光盘,还有现在各种各样的优盘,MP3,Memorystick,SD卡,eMMC卡……从中可以看到这个划分的方式是: ---内存(DDR3、DDR4、LPDDR4X...) 存储 --|--外存(闪存、硬盘、SD卡...) 内存是直接与CPU交换数据进行运算的高速存储器,一般具有易失性(断电后不能保存数据)。闪存可以算是外存的一种。这样对于Flash的进行了一下说明,从而将其定位为闪存,属于外存中的一种。 当然参考华为在P10手机中对其进行的定义,可能还是更加的精确点。把直接跟CPU交换数据的,最好还是叫做运行内存。而另一种主要用于储存数据用的,则是称为储存容量或储存空间。 ## 2、内存规格 这一张图,主要是根据储存物质的功能进行划分,主要是针对于运行内存进行。 内存类型分为: RAM(Random Access Memory):随机读写储存器 ROM(Read Only Memory):只读存储器 SRAM(Static Random Access Memory):静态随机读写储存器 DRAM(Dynamic Random Access Memory):动态随机读写储存器 其中的DRAM这一块,是目前发展最为快速的一个领域,对其中的内存芯片进行分类的话: FPM(Fast-Page Mode) DRAM:快速页面模式的DRAM EDO(Extened Data Out) DRAM:扩展数据输出DRAM,速度比FPM DRAM快15%~30% BEDO(Burst EDO) DRAM:突发式EDO DRAM,性能提高40%左右。 SDRAM(Synchronous DRAM):同步DRAM,与CPU的外部工作时钟同步。 RDAM(Rambus DRAM) DDR(Double Data Rate) DRAM,这一个目前发展最为迅速的DRAM类型。 在DDR-DRAM中,在低功耗的领域,比如说手机行业,已经LPDDR3,到了LPDDR4,以及LPDDR4X了。其中的运行速度也开始不断的加快。电脑领域,也已经进入到了DDR4。不过这个电脑内存的工作频率,不如手机领域的频率要高。典型的厂家,主要有海力士,三星这类厂家了。这些厂家在现代的最新的Flash领域也是引领行业的企业。 好了,扯了关于Flash相关的领域后,现在对FLASH的定位有了一些的了解、然后下面就开始,看看,开发板中的所用芯片处于整个Flash领域,是个啥水平。 ## 1、Flash的介绍 ### 1.1 Flash定义 Flash的技术,发展的比较繁多的。记得以前学单片机的时候,常用的存储是采用了IIC的,现在这个是SPI的,于是想一想,还是把整个Flash的发展给整体捋一下吧。当然,幸亏网上有人做了这个方面的绝大部分的工作,于是也便copy过来,当做我自己整理自己想法的主要架构。 ### 1.2 Flash分类 一、IIC EEPROM IICEEPROM,采用的是IIC通信协议。 IIC通信协议具有的特点:简单的两条总线线路,一条串行数据线(SDA),一条串行时钟线(SCL);串行半双工通信模式的8位双向数据传输,位速率标准模式下可达100Kbit/s;一种电可擦除可编程只读存储器,掉电后数据不丢失,由于芯片能够支持单字节擦写,且支持擦除的次数非常之多,一个地址位可重复擦写的理论值为100万次,常用芯片型号有 AT24C02、FM24C02、CAT24C02等,其常见的封装多为DIP8,SOP8,TSSOP8等; 为了增加下直观,下面就简单的附一个以截图于Atmel公司生产的基于I2C的EEPROM-AT24C02的规格书。不再详细地展开说自己的认识了。 二、SPI NorFlash SPINorFlash,采用的是SPI 通信协议。有4线(时钟,两个数据线,片选线)或者3线(时钟,两个数据线)通信接口,由于它有两个数据线能实现全双工通信,因此比IIC通信协议的 IIC EEPROM的读写速度上要快很多。SPI NorFlash具有NOR技术Flash Memory的特点,即程序和数据可存放在同一芯片上,拥有独立的数据总线和地址总线,能快速随机读取,允许系统直接从Flash中读取代码执行;可以单字节或单字编程,但不能单字节擦除,必须以Sector为单位或对整片执行擦除操作,在对存储器进行重新编程之前需要对Sector或整片进行预编程和擦除操作。 NorFlash在擦写次数上远远达不到IIC EEPROM,并且由于NOR技术Flash Memory的擦除和编程速度较慢,块尺寸又较大,因此擦除和编程操作所花费的时间会很长;但SPI NorFlash接口简单,使用的引脚少,易于连接,操作方便,并且可以在芯片上直接运行代码,其稳定性出色,传输速率高,在小容量时具有很高的性价比,这使其很适合应于嵌入式系统中作为 FLASH ROM,所以在市场的占用率非常高。 常见到的S25FL128、MX25L1605、W25Q64等型号都是SPI NorFlash,其常见的封装多为SOP8,SOP16,WSON8,US0N8,QFN8、BGA24等。 这次自己要学习的开发板中所用的W25Q16也是SPI类型的Flash。这个类型的具体说明,就在下面描述W25Q16中进行吧。 三、Parallel NorFalsh (CFI Flash) ParallelNorFalsh,也叫做并行NorFlash,采用的Parallel接口通信协议。拥有独立的数据线和地址总线,它同样继承了NOR技术Flash Memory的所有特点;由于采用了Parallel接口,Parallel NorFalsh相对于SPI NorFlash,支持的容量更大,读写的速度更快,但是由于占用的地址线和数据线太多,在电路电子设计上会占用很多资源。Parallel NorFalsh读写时序类似于SRAM,只是写的次数较少,速度也慢,由于其读时序类似于SRAM,读地址也是线性结构,所以多用于不需要经常更改程序代码的数据存储。 常见到的S29GL128、MX29GL512、SST39VF020等型号都是Parallel NorFlash,其常见的封装多为TSSOP32、TSOP48、BGA64,PLCC32等。 这次就以旺宏电子的MX29GL512的规格书中的,例子为例,简约的看下引脚分布。 从引脚图中,可以看到此时的芯片中的各个引脚之间所使用的连线已经是非常的多了。毕竟是并行的,果然是连线多。 这个引脚描述图和引脚结构图能让数据更加的清晰一点。 四、Parallel NandFlash ParallelNandFlash同样采用了Parallel接口通信协议,NandFlash在工艺制程方面分有三种类型:SLC、MLC、TLC。 NandFlash技术Flash Memory具有以下特点:以页为单位进行读和编程操作,以块为单位进行擦除操作;具有快编程和快擦除的功能,其块擦除时间是2ms,而NOR技术的块擦除时间达到几百ms;芯片尺寸小,引脚少,是位成本(bit cost)最低的固态存储器;芯片包含有坏块,其数目取决于存储器密度。坏块不会影响有效块的性能,但设计者需要有一套的坏块管理策略! 对比Parallel NorFalsh,NandFlash在擦除、读写方面,速度快,使用擦写次数更多,并且它强调更高的性能,更低的成本,更小的体积,更大的容量,更长的使用寿命。这使NandFlash很擅于存储纯资料或数据等,在嵌入式系统中用来支持文件系统。 其主要用来数据存储,大部分的U盘都是使用 NandFlash,当前NandFlash在嵌入式产品中应用仍然极为广泛,因此坏块管理、掉电保护等措施就需要依赖NandFlash使用厂家通过软件进行完善。 常见到的S34ML01G100、MX30LF2G18AC、MT29F4G08ABADA等型号都是Parallel NandFlash,其常见的封装多为TSOP48、BGA63、BGA107,BGA137等。 这次就以旺宏电子的MX30LF2G18AC为例吧。 这个引脚的封装有两种,第一种是48-TSOP,第二种是63-ball 9mmx11mm VFBGA。为了简介起见,就以第一种封装为例。 五、SPI NandFlash SPINandFlash,采用了SPI NorFlash一样的SPI的通信协议,在读写的速度上没什么区别,但在存储结构上却采用了与Parallel NandFlash相同的结构,所以SPI nand相对于SPI norFlash具有擦写的次数多,擦写速度快的优势,但是在使用以及使用过程中会同样跟Parallel NandFlash一样会出现坏块,因此,也需要做特殊坏块处理才能使用; SPINandFlash相对比Parallel NandFlash还有一个重要的特点,那就是芯片自己有内部ECC纠错模块,用户无需再使用ECC算法计算纠错,用户可以在系统应用当中可以简化代码,简单操作; 常见到的W25N01GVZEIG、GD5F4GQ4UBYIG、F50L1G41A等型号都是SPI NandFlash,其常见的封装多为QFN8、BGA24等。 文中就以华邦电子的W25N01GV为例吧。 这个引脚的封装有两种,第一种是WSON 8x6-mm;还有SOIC 300-mil,TFBGA 8x6-mm(5x5 or 6x4 Ball Array)。因为第一种封装最为简洁,就以第一种为示例吧。 六、eMMC Flash eMMC采用统一的MMC标准接口,自身集成MMC Controller,存储单元与NandFlash相同。针对Flash的特性,eMMC产品内部已经包含了Flash管理技术,包括错误探测和纠正,Flash平均擦写,坏块管理,掉电保护等技术。MMC接口速度高达每秒52MBytes,eMMC具有快速、可升级的性能,同时其接口电压可以是 1.8v 或者是 3.3v。 eMMC相当于NandFlash+主控IC ,对外的接口协议与SD、TF卡一样,主要是针对手机或平板电脑等产品的内嵌式存储器标准规格。eMMC的一个明显优势是在封装中集成了一个控制器,它提供标准接口并管理闪存,使得手机厂商就能专注于产品开发的其它部分,并缩短向市场推出产品的时间。这些特点对于希望通过缩小光刻尺寸和降低成本的NAND 供应商来说,同样的重要。 eMMC由一个嵌入式存储解决方案组成,带有MMC(多媒体卡)接口、快闪存储器设备(Nand Flash)及主控制器,所有都在一个小型的BGA 封装,最常见的有BGA153封装;我们通常见到的KLMAG8DEDD、THGBMAG8B4JBAIM、EMMC04G-S100等型号都是eMMC Flash。eMMCFlash存储容量大,市场上32GByte容量都常见了,其常见的封装多为BGA153、BGA169、BGA100等。 主要供应厂商有:三星半导体,东芝电子、海力士电子 好吧,我本来想去寻找这个第一款信号为KLMAG8DEDD这款芯片的资料的,不过好像这个找不到的,为了便于说明,于是也便直接去了三星半导体的官方网站进行查询。以这款KLMxGxGEAC-B001为例吧。 因为这个引脚实在是太多了,也就先弄打出来吧。进行描述。 Pin NO|Name A3|DAT0 A4|DAT1 A5|DAT2 B2|DAT3 B3|DAT4 B4|DAT5 B5|DAT6 B6|DAT7 K5|RSTN C6|VDD M4|VDD N4|VDD P3|VDD P5|VDD E6|VDDF F5|VDDF J10|VDDF K9|VDDF C2|VDDI M5|CMD M6|CLK C4|VSS E7|VSS G5|VSS H10|VSS K8|VSS N2|VSS N5|VSS P4|VSS P6|VSS 下面直接用英文标注好了。 CLK: Clock input。时钟输入 CMD: A bidirectional signal used for device initialization and command transfers. Command operates in two modes, open-drain for initialization and push-pull for fast command transfer. DAT0-7: Bidirectional data channels. It operates in push-pull mode. RST_n: H/W reset signal pin VDDF(VCC): Supply voltage for flash memory VDD(VCCQ): Supply voltage for memory controller VDDi: Internal power node to stabilize regulator output to controller core logics VSS: Ground connections 七、UFS2.0 JEDEC在2013年9月发布了新一代的通用闪存存储器标准USF2.0,该标准下得闪存读写速度可以高达每秒1400MB,这相当于在两秒钟内读写两个CD光盘的数据,不仅比eMMC有更巨大的优势,而且它甚至能够让电脑上使用的闪存存储介质固态硬盘也相形见绌。UFS闪存规格采用了新的标准2.0接口,它使用的是串行界面,很像PATA、SATA的转换,并且它支持全双工运行,可同时读写操作,还支持指令队列。相对之下,eMMC是半双工,读写必须分开执行,指令也是打包,在速度上就已经是略逊一筹了,而且UFS芯片不仅传输速度快,功耗也要比eMMC5.0低一半,可以说是日后旗舰手机闪存的理想搭配。目前仅有少数的半导体厂商有提供封装成品,如三星、东芝电子等。 2013年9月,JEDEC发布了UFS 2.0的闪存存储标准,其最大的特点是采用串行数据传输,全双工模式,支持指令队列。相比EMMC读取写入分开进行的半双工模式,UFS的全双工模式意味着读取和写入可以同时进行。指令队列的加入意味着无需再向EMMC5.1之前的版本一样,每一条指令的提交必须等待前一条指令的完成。 UFS 2.0闪存读写速度强制标准为HS-G2(High speed GEAR2),可选标准为HS-G3。HS-G2 1Lane最高读写速度为2.9Gbps(约为360MB/s),2Lane最高读写速度为5.8Gbps(约为725MB/s)。可选标准HS-G3 1Lane最高读写速度为5.8Gbps(约为725MB/s),2Lane最高读写速度为11.6Gbps(约为1.45GB/s)。HS-G2 1Lane由于读写速度与EMMC5.1相比没有明显的优势,相应的商业产品较为罕见。 代表的芯片有:海力士的H28U64222MMR,东芝电子的THGBF7G9L4LBATR 典型厂家:三星半导体,东芝电子、海力士电子 八、UFS2.1 2016年3月,JEDEC发布了UFS 2.1的闪存存储标准。相比UFS2.0,速度标准没有任何变化,仍然为强制标准HS-G2,可选标准HS-G3。改进主要分为三部分:设备健康(包括预防性维护)、性能优化(包括指令优先和固件升级)和安全保护。设备健康信息包括剩余预留块和设备使用寿命信息,指令优先允许向紧急的任务分配更高的优先级,安全保护则支持操作系统和应用级别细粒度的写入保护(包括UFS控制器硬件级别加密)。 UFS2.1/UFS2.0采用相同的速率标准。 典型厂家:三星半导体、海力士电子 典型的芯片,比如说海力士的H28U62301AMR,三星的KLUDG8V1EE-B0C1, 这个越是到后面真心是发现资料的查找好难。很难找到规格书。这边就先不写了。 ## 2、开发板中芯片 板子所用的芯片为华邦电子所生产的存储芯片,型号名为W25Q16。这个芯片在开发板当中,这个线路的连接方式可以参见下图。 从图中,是可以看到对于这类串行的Flash芯片的设计,添加的外围元件时比较少的,也就是添加了一个R25提供了上拉。 对于这个芯片的各个引脚,和功能的大致说明,于是也便直接以winbond的官方数据手册来进行阐述。只是在实际的芯片中,这个型号的芯片种类是比较多的,那就挑个W25Q16DV这个型号为例吧。 W25Q16DV的封装有以下几种,SOIC 150/208-mil;WSON 6x5-mm/USON 4X3-mm/USON 4X4-mm,还有PDIP 300-mil,WLCSP,SOIC 300-mil,SOIC 300-mil,TFBGA 8x6-mm,TFBGA 8x6-mm。为了方便起见,就以比较常见的PDIP封装为例展开好了。 ## 3、参考 winbond.W25Q16DV的数据手册(3V 16M-BIT,SERIAL FLASH MEMORY WITH DUAL AND QUAD SPI) . . http://www.winbond.com.tw/resource-files/w25q16dv%20revk%2005232016%20doc.pdf lz_kwok.Flash芯片的种类与区别 . . http://blog.csdn.net/lz_kwok/article/details/52032130 IT之家.UFS 2.0 /UFS 2.1究竟有何区别? . . https://www.ithome.com/html/digi/307923.htm Saber__777.闪存和内存有什么区别? https://zhidao.baidu.com/question/1430154902012180899.html hubaba.Flash芯片你都认识吗? http://www.51hei.com/bbs/dpj-47203-1.html # 三、总结 花了一大段的时间在整理这个内容,一方面是感觉到了原来内存的东西真多。另一方面也感觉到了内存技术是越来越强大了。集成的东西变多了。
个人分类: STM32|1541 次阅读|0 个评论
分享 CSR8645和CSR8670选哪个?求大神指导
热度 1 小琪琪来啦 2017-2-7 15:37
CSR8645,csr8670都很好,不过前者是ROM版的,后者是内置flash的,网上这么说,真正的区别我还不太懂,继续纠结中。。。。
10481 次阅读|1 个评论
分享 环形数组在FLASH存储中的应用
manhuami2007 2017-1-31 16:46
环形数组在FLASH存储中的应用
在嵌入式系统中串行Flash是一个很常用的存储芯片。但是对于Cortex-M系列的MCU或者51单片机,若使用文件系统存储数据,即浪费存储空间,又消耗单片机的性能。因此需要一个更简单的存储方式来存储数据。 环形数组是我们经常使用的一种数据结构,常用于存储一些队列数据,因此我们不妨 模仿环形数组 的方式,在Flash中存储数据。 环形数组 环形数组是一种首尾相连的数据结构。由于其头尾相接,这种数据结构能够更好的利用存储芯片的全部空间。 模拟环形数组 数组有两个重要的部分: 元素与索引 。因此为了在Flash模拟环形数组,我们需要解决两个问题: 确定模拟数组中元素的类型 如何在Flash中索引元素 元素类型 在Flash中模拟环形数组,我们需要对每个元素的长度提两点要求: 每个 元素的长度是一样 的 元素的 数据长度 能够被Flash擦除块 整除 对于第一点,因为在C语言中,数组是定长的,而且只能存储一种数据类型,也就是说数组是int型的,就只能存储int型的数据。那么我们在Flash中模拟时,也需要将FLASH看成一个长度与类型固定的数组,并且需要Flash中的每个元素都是同一种类型的,即数据长度一样。 对于第二点,由于Flash的擦除特性是按块擦除(像下图一样,一个擦除块就像表中的一行),我们希望每次擦除都是擦掉整数个元素。例如sst25vf16b擦除块是4096字节,那么写入的每个元素的长度应该是2的n次方,即1个字节、2个字节、4个字节.. 索引 每个元素的 地址是与索引对应的 ,即索引乘以每个元素的长度就是这个元素所在的地址。因此通过简单的换算就可以得到各个元素的索引值了。 总结 通过在Flash中模拟环形数组的方式存储数据之后可以按照环形数组的操作实现,数据的写入、读出、判断是否满和剩余空间等操作了。 欢迎大家添加我的微信公众号“光豆儿” ​
435 次阅读|0 个评论
分享 CSR8645和CSR8670选哪个?求大神指导
younever123 2016-12-15 14:28
CSR8645,csr8670都很好,不过前者是ROM版的,后者是内置flash的,网上这么说,真正的区别我还不太懂,继续纠结中。。。。
5340 次阅读|0 个评论
分享 ST官方flash loader软件串口方式下载HEX
北北 2015-11-26 14:11
对于STM32,ST官方提供了一个flash loader demo软件,用于通过串口方式(ISP)下载工程HEX文件 (注意下载前应将硬件BOOT引脚配置为系统存储器启动模式,即BOOT0为1,BOOT1为0。 下载完毕后,将引脚配置为主闪存存储器启动模式,即BOOT0为0,BOOT1为任意。然后上电运行)。 关于系统存储器启动模式简介: ISP方式:需要将BOOT管脚配置成上电从System Memory启动, System Memory中有一段BOOTLOADER来接收串口(对于STM32F103C8T6来说,为USART1)来的数据,把它们烧写到FLASH中。 (内嵌的自举程序存放在系统存储区,由ST在生产线上写入,用于通过可用的串行接口对闪存存储器进行重新编程) 一、准备工作: ST官方flash loader demo 软件,一个串口转USB模块(用于连接MCU与PC),HEX文件。 二、流程: 2.1、编译KEIL工程文件,生成HEX文件。 2.2、将MCU的BOOT引脚配置为系统存储器启动模式,即BOOT0为1,BOOT1为0。 2.3、将MCU的串口(对于STM32F103C8T6来说,为USART1)连接到PC,板子上电。 2.4、 2.4.1、打开flash loader软件,配置UART的端口信息:端口号,奇偶校验为偶校验(EVEN), 波特率任意设置(115200),echo禁止(disable),timerout设置为5。然后NEXT。 2.4.2、一路NEXT(这其中只是显示当前MCU的信息),直到出现一个界面,显示可选择进行的各项功能: 擦除、下载、上传、保护等待各种可进行的操作。 2.4.3、我们可以先选中“擦除”,然后NEXT,完毕后,BACK回到刚才功能界面。 2.4.4、我们可以选中“DOWNLOAD”,选择要下载的HEX文件,选中“擦除必要的页”,然后NEXT,下载完毕后,关闭。 2.5、板子断电,将MCU的BOOT引脚配置为主闪存存储器启动模式,即BOOT0为0,BOOT1为任意。 2.6、板子上电,可发现刚才下载的HEX文件的程序开始正常运行。 完结。
个人分类: STM32|7499 次阅读|0 个评论
分享 先实现一个弱爆的flash写函数,然后老老实实去学习树
辛昕 2015-8-3 00:18
其实这篇将很简单。 今天周日,从我开始倒腾stm32f4上的flash基本读写函数后,我开始倒腾 flash 文件系统啊,ftl啊啥的,以后,我最后发现,我还是两眼一抹黑,并且越来越不知道怎么回事。 最后我自以为自己放弃所有复杂的事情,只想用个简单的二叉查找树来解决问题的时候。 我傻逼呵呵的发现,一般二叉查找树强调尽量不要出现相同的关键字,或者即使出现了也不要增加到树里,否则....... 然而事实是,对于我想要弄得这个flash wear leveling算法,不好意思。 这两个强调的 不要干的事情,恰恰就是我必须干得事情。 最后我终于意识到,我显然不可能短期间理解 什么 平衡树,更别提什么 红黑树。 于是,我想,看来我还是得先写一个最傻逼的没用到算法的 flash 最不wear leveling的wear leveling方案。 然后花时间好好学算法。 然而这次我乖了。 神马算法,老子只是要好好把树学会。 我不奢求能理解红黑树。 我只希望我能把 C语言描述这本书里的 树这一章,尽可能看懂,能看懂多少是多少啊~~ 毕竟,嗯嗯,jffs2用的也是红黑树! 可是红黑树相比这些复杂太多了,因为它在那本书里很靠后的地方,名曰 高级数据结构!!
445 次阅读|0 个评论
分享 在内嵌RAM中运行程序(转)
wateras1 2015-1-8 17:36
这两天开始捣鼓板载STM32F103ZE的红牛开发板,每次做一点小改动都要重新下载程序到Flash中,很慢不说,还担心这么频繁地刷,Flash啥时候突然就归西了。于是准备每次下载程序的时候写到片载的RAM中。参考了网上的一些文章,发现不同的人说法略有差异。走了很多弯路以后,终于成功地下载到片载RAM中并运行起来。因为是刚刚上手STM32,就按初学的视角总结一下设置的经过,不涉及内部的机制。下面的步骤基本上都是必须的,应该没有迷信的步骤在里面了。 一、 先创建一个新项目。 1. 菜单 P roject -- New m V ision Project 。创建名为 RAM 的项目,并选择 CPU 为 STM32F103ZE 。添加启动代码选“ Y ”。 2. 这时,项目中仅有 STM32F10x.s 启动代码,要自己创建一个包含 main.c 的主文件。菜单 File -- New ,创建一个新文件,填入 main() 函数,保存为 main.c 。内容可以简单到极致: int main() { while(1); } 3. 右键单击 Source Group 1 ,选“ Add File to "Source Group 1" ”,添加 main.c 文件。至此一个新项目已经建立完毕,可以编译并在虚拟器中运行了。 二、 新建一个名为 SRAM.ini 的文件。内容如下: FUNC void Setup (void) { SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register } LOAD RAM.axf INCREMENTAL // Download ,红色代表工程文件名 .axf Setup(); // Setup for Running g, main 三、 设置项目的参数。在工具条上点击“ Options for Target ”,弹出项目设置对话框。 四、 在对话框的 Target 标签,修改 IROM1 地址。 Cortex-M3 的内部 RAM 的起始地址是 0x20000000 , STM32F103ZE 的 RAM 总共有 64k 。这里把 48k 分给 ROM , 16k 分给 RAM ,设置如下图。 注意, IROM 原先的地址是 0x8000000 ,后面是 6 个 0 ,而需要填入的新地址是 0x20000000 ,后面拖的是 7 个 0 ,千万不要填错。 五、 切换到 Linker 标签,修改基地址。 一开始,此标签下的 R/O Base 和 R/W Base 内容是不允许修改的,如下图 勾销“ Use Memory Layout from Target Dialog ”之后才可以编辑。在 R/O Base 填入 0x20000000 ,在 R/W Base 填入 0x2000C000 ,然后在勾选 “ Use Memory Layout from Target Dialog ”。完成后如下图。 六、 接下来是 Debug 标签设置。 1. 首先去掉“ Load Application at Startup ”核选框,并在下面填入刚才建立的 SRAM.ini 文件。 2. 选择 Cortex-M3 J-Link 调试器。如下图。 再点击旁边的 Setting 按钮,设置 JLink 设备。在弹出对话框中选择“ Falsh download ”标签。 (1) 核选“ Do not Erase ”,即在下载之前不需要擦除存储器; (2) 在“ RAM for Algorithm ”区的 Start 栏填入 0x2000C000 ,与前面的 RAM 设置保持一致。这里的 RAM 空间是供烧录时用的,大小用默认的就可以,不用改。 (3) 点击对话框最下面的 Add 按钮,在弹出对话框中选择“ STM32F10X High-density Flash ”,并点击确定,与 STM32F103ZE CPU 保持一致。 (4) 在“ Programming Algorithm ”的 Start 和 Size 中,一如既往地填入 0x20000000 和 0xC000 。指定烧录过程的起始位置和范围。按确定回到“ Options for Target ”对话框。 七、 选择“ Utilities ”标签栏,在“ Use Target Driver for Flash Programming ”下面选择“ Cortex-M3 J-Link ”。 旁边的 Setting 按钮和刚才设置的是同一个对话框。 八、 至此,设置全部完成。可以下载到板上运行了。 九、 常见错误: 1. 最常见的错误是在下载程序到芯片(烧写芯片)时,跳出一个对话框,显示“ Flash Timeout. Reset the Target and try it again. ”。通常这并不是由超时引起的错误,而是地址设置有误,程序写不进芯片中。有时在步骤六设置的 Flash Download 地址会丢失,发生这种错误时,先检查各个地址设置是否正确。 2. 如果在烧写芯片时弹出对话框显示“ Error: Flash Download failed - "Cortex-M3" ”,并且在 Output Window 的 Build 窗口中显示“ No Algorithm found for: 02000000H - 02000233H ”,这是步骤四的 IROM1 里填写的地址有误, 0x20000000 应该有 7 个 0 ,少填了个 0 就报这个错误。这个要特别小心,因为初始值 0x8000000 后面拖的是 6 个 0 。
个人分类: STM32F4XX/1XX/2XX/3XX/stm8s|798 次阅读|0 个评论
分享 STM32Fxx疑问解答
热度 1 wateras1 2015-1-8 17:06
1:STM32FXX的程序运行时需要从flash加载到ram运行还是直接在flash中运行? arm的话在 分散装载配置文件 里会有配置,关于code的地址,有两个设置,一个是存储地址(这个地址配置的是烧写器把代码段写到flashrom的何处),一个是装载运行地址,也就是你程序在什么地方运行,装载地址当然可以是flashrom(nor型的),所以你的程序是可以在flashrom里执行的。 当然如果系统时钟非常高,flashrom的读取速度不能满足,又或者你需要更新固件程序的话,那么你的程序就要在ram里运行,注意,把code从rom拷贝到ram里需要你手动写程序完成. 至于程序是否要在RAM里执行,看的的需求了。在RAM里程序执行的更快。 如果是一般的嵌入式系统应用,如STM32和LPC2XXX,LPC1XXX系列,基本都带片内FLASH,和一个还算过的去的片内RAM.这样的芯片一般用作控制领域,而且芯片本身可以跑到72MHZ,因此一般情况下会将程序放在FLASH中直接执行,此时,不需要将程序和RO-DATA拷贝到RAM中,只是在程序启动时将RW区从加载地址拷贝到执行地址。 如果用的是keil的默认启动汇编程序,而且在汇编中跳转到__main去(此时C的入口是main函数,注意main标号和__main是不同的)。__main是keil的库函数中的一个标号地址,__main处的代码会将RW区从加载地址拷贝到执行地址,然后还会初始化堆等空间。最后跳到应用程序的main函数去。 如果有速度要求或需要擦写程序所在的FLASH时,就需要将程序拷贝到RAM中取执行了,此时需要在scatter文件中设置执行地址,keil同样会在__main中将代码拷贝到ram然后跳到RAM中的main地址去执行。 不过keil中__main中执行的拷贝操作有时候不正确,一般这种情况下可以考虑自己写执行上述功能的代码,完成后直接跳到main去执行。 Boot mode selection pins Boot mode Aliasing BOOT1 BOOT0 x 0 Main Flash memory Main Flash memory is selected as boot space 0 1 System memory System memory is selected as boot space 1 1 Embedded SRAM Embedded SRAM is selected as boot space 它有两个引脚来控制启动方式 2:何为ARM的分散加载文件 分散加载(scatter loading)为*.scf文件。它提供这样一种机制:可以将内存变量定位于不同的物理地址上的存储器或端口,通过访问内存变量即可达到访问外部存储器或外设的目的;同时通过分散加载,让大多数程序代码在高速的内部RAM中运行,从而使得系统的实时性大大增强。 (一)原理 ARM的连接器提供了一种分散加载机制,在连接时可以根据分散加载文件(.scf文件)中指定的存储器分配方案,将 可执行镜像文件分成指定的分区并定位于指定的存储器物理地址 。这样,当嵌入式系统在复位或重新上电时,在对CPU相应寄存器进行初始化后,首先执行ROM存储器的Bootloader代码,根据连接时的存储器分配方案,将相应代码和数据由加载地址 拷贝 到运行地址,这样,定位在RAM存储器的代码和数据就在RAM存储器中运行,而不再从ROM存储器中取数据或取指令,从而大大提高了CPU的运行速率和效率。 (二)结构 Scatlertoading的存储区块可以分成二种类型: 装载区 :当系统启动或加载时应用程序的存放区。 执行区 :系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行块。 (三)分散加载时连接器生成的 预定义符号 在编译连接时如果指定了分散加载文件(.scf文件),在连接后会自动生成如下变量: (四)具体例子说明 ; ROM_LOAD 为加载区的名称,其后面的 0x00000000 表示加载区的起始地址(存放程序代码的起始地址) ROM_LOAD 0x0 { ; ROM_EXEC 描述了执行区的地址,放在第一块位置定义 ROM_EXEC 0x00000000 { ; 从起始地址开始放置向量表 ( 即 Startup.o(vectors, +First) ,其中 Startup.o 为 Startup.s 的目标文件 ) ; +First表示Vector段放在最前面 ;AREA vectors , CODE, READONLY Startup.o ( vectors , +First) ;接着放置其它代码 ( 即 * (+RO)), * 是通配符,类似WINDOW下搜索用的通配符 * (+RO) } ;变量区 IRAM 的起始地址为 0x40000000 IRAM 0x40000000 { ;放置 Startup.o (MyStacks) Startup.o (MyStacks) } ; +0 表示接着上一段, UNINIT 表示不初始化 STACKS_BOTTOM +0 UNINIT { ;放置 AREA StackBottom, DATA, NOINIT Startup.o (StackBottom) } ;接着从 0x40004000 开始,放置 AREA Stacks , DATA, NOINIT , UNINIT 表示不初始化 STACKS 0x40004000 UNINIT { Startup.o ( Stacks ) } ;外部 RAM 从 0x80000000 开始为变量区 ;如果片外RAM起始地址不为0x8000 0000,则需要修改mem_.scf文件 ERAM 0x80000000 { * (+RW,+ZI) } ; +0 表示接着上一段 , UNINIT 表示不初始化 HEAP +0 UNINIT { ;放置堆底, AREA Heap, DATA, NOINIT Startup.o (Heap) } ;接着在外部 0x80080000 放置堆顶 ;这个地址是片外RAM 的结束地址,根据实际情况修改 HEAP_BOTTOM 0x80080000 UNINIT { Startup.o (HeapTop) } } 以上分散文件的可引用的段名 |Image$$ROM_LOAD $$Limit| |Image$$ROM_EXEC $$Limit| 。。。。。。。。。。。。。。。。 ;重定向 __user_initial_stackheap 函数 ;分配新的bottom_of_heap地址等,R0-R3是函数必须的返回值,返回bottom_of_heap的值 ;通过分散加载描述文件,重定向其位置 ,bottom_of_heap等已经在Startup.s中定义为DATA类型 __user_initial_stackheap LDR r0,=bottom_of_heap ; LDR r1,=StackUsr LDR r2,=top_of_heap LDR r3,=bottom_of_Stacks MOV pc,lr 在keil中编译的程序通过了,但是debug的时候会出现一些错误: *** error 65: access violation at 0x4C000018 : no 'write' permission *** error 65: access violation at 0x00000000 : no 'execute/read' permission (ram.sct的时候) 我发现当我工程设置中linker中选择了runinram.sct和runinflash.sct或者自动生成的sct文件的时候就出现上面的错误。应该就是地址的问题。但是具体怎么修改才能解决这个错误,还没弄明白。弄明白了再发。 下面是找了一篇值得参考的文章: 原文地址: http://hi.baidu.com/pengjj0807/blog/item/ef73e287a212453cc65cc3be .html KEIL下分散加载文件的使用 ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00004000 ; load region size_region 第一个加载域,起始地址0x08000000 , { 大小0x00004000 ER_IROM1 0x08000000 0x00004000 ; load address = execution address 第一个运行时域, { 起始 0x08000000,大小0x00004000 *.o (RESET, +First) IAP第一阶段还是在FLASH中运行 *(InRoot$$Sections) startup_stm32f10x_md.o } ER_IROM2 0x20008000 0x00004000 ; load address = execution address 第二个运行时域, { 起始0x20008000,大小0x00004000 .ANY (+RO) IAP第二阶段加载到SDRAM中运行 } RW_IRAM1 0x20000000 0x00008000 ; RW data 把可读写的数据和初始化为0的数据放在内存SDRAM的开头 { .ANY (+RW +ZI) } } 让MDK自己分配--选linker-usexxx 对于分散加载的概念,在《ARM体系结构与编程》书中第11章有明确介绍。 分散加载文件(即scatter file 后缀为.scf)是一个文本文件,通过编写一个分散加载文件来指定 ARM连接器在生成映像文件时如何分配RO,RW,ZI等数据的存放地址。如果不用SCATTER文件指定,那么 ARM连接器会按照默认的方式来生成映像文件,一般情况下我们是不需要使用分散加载文件的。 但在某些场合,我们希望把某些数据放在指定的地址处,那么这时候SCATTER文件就发挥了非常大的作用 而且SCATTER文件用起来非常简单好用。 举个例子:比如像LPC2378芯片具有多个不连续的SRAM,通用的RAM是32KB,可是32KB不够用,我想把 某个.C中的RW数据放在USB的SRAM中,那么就可以通过SCATTER文件来完成这个功能。 下面是就这个例子作的说明: 这是一个标准的常用的分散加载文件,现在加注释于后,方便以后查阅: ;****************************************************************************** ; ; SCATTER LOADING DEION ; ARM ; KEIL's uVision3 ; (RealView Microprocessor Developer Kit) ; ; Filename : LPC2378_Flash.scat ;****************************************************************************** LR_IROM1 0x00000000 0x00080000 ;; 第一个加载域,名字为LR_IROM1,起始 {                  ;;地址为0x0,大小为0x80000 ER_IROM1 0x00000000 0x00080000 ;;加载域中的运行时域,名字为ER_IROM1 { ;; 起始地址为0x0,大小为0x80000 vectors.o (VECT, +First) ;;将vectors.c编译后生成的文件vectors.o中的代码 init.o (INIT) ;;以及init.o中的代码 * (+RO) ;;以及所有编译生成的RO属性的代码全部存放在 } ;;运行时域ER_IROM1指定的地址范围内,存放方式:顺序存放 RW_IRAM1 0x40000000 0x0000e800  ;;这是第二个运行时域,功能同上 { ;;其中 *是代表具有()里面指定的属性的全部数据 *(+RW,+ZI) ;;与*功能相似的有.ANY,后面说明 } ;; The following declarations select the "two region model" ; ;; A default __user_initial_stackheap() will be used ; ARM_LIB_HEAP 0x40007000 EMPTY 0x00000100 {} ;;指定堆栈地址 ARM_LIB_STACK 0x40008000 EMPTY -0x00000E00 {} } 下面是针对LPC2378的USB SRAM作数据RAM使用的配置: ;****************************************************************************** ; ; SCATTER LOADING DEION ; ARM ; KEIL's uVision3 ; (RealView Microprocessor Developer Kit) ; ; Filename : LPC2378_Flash.scat ;****************************************************************************** LR_IROM1 0x00000000 0x00080000 ;; 第一个加载域,名字为LR_IROM1,起始 {                  ;;地址为0x0,大小为0x80000 ER_IROM1 0x00000000 0x00080000 ;;加载域中的运行时域,名字为ER_IROM1 { ;; 起始地址为0x0,大小为0x80000 vectors.o (VECT, +First) init.o (INIT) * (+RO) } RW_IRAM1 0x40000000 0x0000e800 { .ANY(+RW,+ZI)     ;; 此处.ANY替换原来的*,是因为下面的一个执行域对指定的模块中的RW,ZI数据指定了存放地址 ;;用.ANY就可以把已经被指定的具有RW,ZI属性的数据排除 } ;; The following declarations select the "two region model" ; 找了3个分散加载文件来分析: 1、7x256的flash.sct分散加载文件: Load_region 0x100000 0x40000 {//ro起始地址为0x100000,大小为0x40000 Fixed_region 0x100000 0x40000 { *(cstartup +First) .ANY (+RO) } Relocate_region 0x200000 {//rw和zi段的地址为0x200000 *.o (VECTOR, +First) .ANY (+RW +ZI) } ARM_LIB_HEAP 0x20E000 EMPTY 0x1000 { } ARM_LIB_STACK 0x210000 EMPTY -0x1000 { } } 2、sram.sct文件 Load_region 0x200000 0x10000 { Fixed_region 0x200000 { *.o (VECTOR, +First) .ANY (+RO) } Relocate_region +0 { *(cstartup +First) .ANY (+RW +ZI) } ScatterAssert((ImageLength(Fixed_region) + ImageLength(Relocate_region)) 0xE000) ARM_LIB_HEAP 0x20E000 EMPTY 0x1000 { } ARM_LIB_STACK 0x210000 EMPTY -0x1000 { } } 3、自定义的sram.sct LR_IROM1 0x00200000 0x00008000 { ; load region size_region ER_IROM1 0x00200000 0x00008000 { ; load address = execution address//加载域等于运行域 *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x00208000 UNINIT 0x00008000 { ; RW data//rw和zi段 .ANY (+RW +ZI) } } 什么是分散加载文件这里就不赘述了。 前面两个分散加载文件是从别的地方拷过来的,用在自己的程序中可能会有问题,因为如果不修改它的话它就固定了加载地址和运行地址,如果程序简单又比较小的话可能不会有问题,但是如果程序代码比较大,超出了那两个加载文件的定义大小可能就会出问题,解决办法也很简单,直接修改.sct文件直到适合你的代码。 更好的办法是自己定义一个分散加载文件,在keil中勾选Use Memory Layout from Target Dialog,那么加载文件就是从你定义irom和iram等地址得到的,如果不勾选的话就是通过你自己指定的加载文件来加载。 如果分散加载文件不对的话,可能出现的问题就是明明是在sram中调试程序,但是却能神奇的通过flash downloader下载到flash中去,刚开始也是不解,后来才发现是分散加载文件有错误,我使用了一个指定的flash.sct分散加载文件,这样的话我设置的irom和iram都无效了,编译器直接根据我指定的flash.sct来分布代码和加载代码,又查看了一下flash.sct文件是加代码加载到flash地址空间的,这就是为什么在jlink-sram工程中也能通过flash downloader工具烧写代码到flash中去的原因 面对这样一个新东西,先去官网看看,或者看看IDE的帮助,基本上你想要的东西都有了,BAIDU来的都不全面,这是一种学习方法。 http://www.keil.com/support/man/docs/armlink/armlink_BABDDHBF.htm 这个链接是我在官网上找到的关于分散加载文件的资料。讲的比较详细了。这里通过一个例子记录下我学习的过程,通过分散加载文件把代码从flash里拷贝到ram里运行, 基于LPC1788。 先贴下我的sct文件: view plain copy LR_IROM10x000000000x00002000 { ER_IROM10x000000000x00020000 { *.o(RESET,+First) *(InRoot$$Sections) startup_lpc177x_8x.o(+RO) system_LPC177x_8x.o(+RO) } RW_IRAM10x200000000x00004000 { .ANY(+RW+ZI) } } LR_IROM20x000020000x0007E000 { VECTOR0x10000000EMPTY0xE4 { } ER_IRAM1+0 { .ANY(+RO) } } 这里有两个加载域(load region)LR_IROM1和LR_IROM2,LR_IROM1是初始化程序,拷贝代码等,从ROM的地址0开始,LR_ROM2是应用程序,从ROM的0x2000开始。+RO表示只读,代码或者只读数据,一般用来表示代码,+RW表示可读可写的数据,+ZI表示初始化为0的数据。大括号里面的为运行域(execution region),一个加载域可以包含几个运行域,LR_ROM2里面有两个运行域,VECTOR和ER_IRAM1,我用VECTOR来表示中断向量区域,ER_IRAM1来表示应用程序区,+0表示紧接着VECTOR排放,EMPTY表示空的,这里空出0xE4的大小,用来放中断向量,.ANY表示除了上面用到的代码之外的代码,官网上有专门解释.ANY的一节。 下面用一张图来表示这个程序的加载域和执行域: 其实加载域的empty这块区域是不用空出来的,主要是运行域要空出来,用来拷贝中断向量,看个人喜好了,我觉得空出来方便引用这块区域的执行域地址。 这样框架就比较清楚了,拷贝的程序清单如下: view plain copy extern unsigned char Image$$VECTOR$$Base; extern unsigned char Image$$VECTOR$$Length; extern unsigned char Load$$ER_IRAM1$$Base; extern unsigned char Image$$ER_IRAM1$$Base; extern unsigned char Image$$ER_IRAM1$$Length; void CopyCode2Ram() { unsigned char *pSrc,*pDes; unsigned int count; SCB-VTOR=0x10000000; pSrc=0; pDes=(unsigned char *)Image$$VECTOR$$Base; count=0xE4; while (count--) { *pDes++=*pSrc++; } count=(unsigned int )Image$$ER_IRAM1$$Length; pDes=(unsigned char *)Image$$ER_IRAM1$$Base; pSrc=(unsigned char *)(Load$$ER_IRAM1$$Base+0xE4); while (count--) { *pDes++=*pSrc++; } } 其中拷贝中断向量的时候要指定中断向量的偏移地址。Load$$ER_IRAM1$$Base表示执行域ER_IRAM1的加载地址;Image$$ER_IRAM1$$Base表示执行域ER_IRAM1的执行地址;Image$$ER_IRAM1$$Length表示执行域ER_IRAM1的实际长度,VECTOR区域因为是EMPTY,所以实际长度是0,而中断向量的长度是固定的,所以程序里就写了个常数。 行时可以有一个或多个执行块。 映像中所有的代码和数据都有一个装载地址和运行地址(二者可能相同也可能不同,视具体情况而定)。 1.scatter文件语法: scatter文件是一个简单的文本文件,包含一些简单的语法。 My Region 0x0000 0x1000 { ;the context of region } 标题: 每个块由一个头标题开始定义,头中至少包含块的名字(自己定义)和起始地址,如0x0000,另外还有最大长度等其他一些属性选项(注:这些属性是可选的,如0x1000)。 内容: 块定义的内容包括在紧接的一对花括号内,依赖于具体的系统情况。 一个加载块(加载时域)必须至少含有一个执行块(运行时域);实践中通常有多个执行块。 一个执行块必须至少含有一个代码或数据段;这些通常来自源文件或库函数等的目标文件;通配符号*可以匹配指定属性项中所有没有在文件中定义的余下部分。 2.分散加载样例分析: 这里用周立功的开发板附带例程里的分散加载文件做例子进行讲解。 硬件配置: 内部64K RAM: 0x4000 0000 - 0x4000 ffff 外部2M FLASH: 0x8000 0000 - 0x801f ffff 外部8M RAM: 0x8100 0000 - 0x807f ffff ROM_LOAD 0x80000000 ;加载时域描述 { ROM_EXEC 0x80000000 ;第一个运行时域描述 { Startup.o (vectors, +First);输入段描述:模块startup位于该 ;域的开头(+First),vector为入口点 * (+RO) ;本域包含全部RO代码(*(+RO)) } IRAM 0x40000000 ;第二个运行时域:将堆栈空间放入 ;片内静态RAM中(0x40000000) { Startup.o (MyStacks) ;本域包含模块STARTUP 的MYSTACKS段 } STACKS_BOTTOM +0 UNINIT ;将栈底放在堆栈的后面(+0) ;不进行初始化(UNINIT)。 { Startup.o (StackBottom) } STACKS 0x40004000 UNINIT ;将STACKS放入40004000 此处地址不能访问 ;如访问将产生预取中止和数据中止异常 { Startup.o (Stacks) } ERAM 0x81000000 ;将所有RWZI(*(+RW,+ZI))段放入外部RAM中 { * (+RW,+ZI) } HEAP +0 UNINIT ;在RWZI段后放入堆底 { Startup.o (Heap) } HEAP_BOTTOM 0x81080000 UNINIT { Startup.o (HeapTop) ;堆顶:放入了外部RAM中(0x81080000) } } (1)样例中,只有一个加载块ROM_LOAD,包含了所有的代码和数据(存放在ROM),起始地址为0x800000000。这个加载块一共对应七个执行块(ROM_EXEC, IRAM,STACKS_BOTTOM, STACKS,ERAM,HEAP,HEAP_BOTTOM)。 (2)RO的代码和数据会从ROM_EXEC开始执行,执行地址与装载地址相同。 (3)Startup.o是Startup.s的目标文件(Startup.s也在这个工程下),vectors是在Startup.s定义的段,整个句子的意思是把整个Startup.s编译生成的目标文件(向量表)放在0x8000 0000的第一个位置,即从vectors开始依次从ROM_EXEC的顶部放下来。 (4)所有的RW和ZI数据包含在外部RAM执行块里,起始地址为0x81080000。 (5)RW数据是从ROM_LOAD copy 过来的,ZI数据是在RAM中初始化的,其位置在RW之上。 (6)HEAP是用来定位堆栈的底的,堆栈底的位置在ZI之上所以使用"+0",heap会从此地址增加。 (7)STACKS是用来定位堆栈顶的,堆栈顶的位置在可以用来作为存储的内存的顶部。Stacks会从堆栈顶的地址下降。 在我看来,分散加载是个死东西,大可以用别人定义好的,需要的时候可以改动一些地方。而做为一个嵌入式软件的学习者,应把精力过多的放到应用编程上面,提高自己的编程能力!如果以后碰到对分散加载了解比较透彻的牛人,再去请教也不迟。
个人分类: STM32F4XX/1XX/2XX/3XX/stm8s|1538 次阅读|1 个评论
分享 关于FATFS文件系统挂载多个磁盘以及SPI FLASH的应用问题!
liufan 2014-12-10 17:34
FATFS 版本: R0.09b 这里FATFS 挂载了2个磁盘,1个是SPI FLASH, 一个是SD卡。 SPI Flash的配置: 型号是 SST25VF032B( 4Mbytes ),该FLASH是4096字节/扇区,FATFS有2重配置 可以考虑, 1. 直接在FFCONF.H中,设置 #define _MAX_SS 4096 /* 512, 1024, 2048 or 4096 */ 其他根据需要配置即可,其中有一个_USE_ERASE 可以设置为0, 此选项是设置擦除扇区。在代码中,只有 在f_mkfs和remove_chain 两个函数中添加擦除的代码,一般可以不用,当然有兴趣可以具体看一下代码, 看在什么条件下使用。因为项目的原因,没有仔细研究。假如这个选项设为1的话,在DISKIO.C文件中,要 增加相关指令选项CTRL_ERASE_SECTOR,该指令直接调用底层的扇区擦除函数。要注意一下的。 2. DISKIO.C中,编写相关指令的底层函数,主要就是扇区数据读取函数,扇区数据写入函数,因为FATFS在 底层是按照扇区/块来操作的。要注意下,在扇区数据写入函数里面,在写入数据前必须要先擦数扇区,再写 入数据,否则会出错。 3. 在读写文件的时候,一般会设置一个数据缓冲区,这个数据缓冲区的大小建议和 _MAX_SS 保持一致的大 小,可以避免出现错误,还有最好在读写函数的最前面,将缓冲区清零,如果缓冲区是局部变量,那么在进 入函数后,是动态从堆栈中得到的存储区域,里面可能会有无效的数据。所以最好清零。假如缓冲区是全局 变量,那么也最好清零,因为里面会有上次操作是留下的数据。 SPI FLASH 大致就这么多吧! 因为在项目应用中是要保存数据记录,而每条记录的大小也不大,小于512字节,于是想修改DISKIO.C中的 扇区读写函数,将4096字节/扇区大小虚拟为512字节/扇区,思路是这样的,配置 _MAX_SS = 512,那 么对于FATFS来说,他会按照512字节/扇区的大小来对底层进行操作,所以要做的事就是修改读写函数,读 扇区一般好改,不介绍。写函数的思路是这样的,根据FATFS扇区号计算出当前要写入的芯片的扇区号,然 后定义一个4096的缓冲区,大小和芯片扇区大小相等,然后复制这个扇区的数据到缓冲区中,然后擦除该扇 区,然后在根据FATFS的扇区号计算出芯片扇区内的偏移量,将数据写入缓冲区中,然后将缓冲区内的4096 个字节一次写入到芯片的扇区中,这就完成了虚拟式的转换。改写后经过调试使用一次通过。后来在网络也 找到了一些这样的做法,基本上思路是一致的。 虚拟出来存在2点问题: 1. 速度上有所欠缺; 2. 需要定义一个大的RAM缓冲区,对于STM32来说,是没有啥问题的,如 果是8位的MCU的话,可能就无法实现了。 下面再说多个磁盘的挂载问题,要在以上配置的基础上作如下2个地方的配置 1. 设置要挂载的磁盘数目,我是2个磁盘,所以设置为2. #define _VOLUMES 2 /* 支持的逻辑设备数目; */ 2. 这个地方必须要设置1,或者2 #define _FS_RPATH 1 /* 0 to 2 */ /* 0:去除相对路径支持和函数; 1:开启相对路径并且开启f_chdrive()和f_chdir()两个函数; 2:在1 的基础上添加f_getcwd()函数。 */ 说明一下,在操作另外一个磁盘的时候,一定要调用 f_chdrive()切换磁盘的函数,入口参数是磁盘的编号 ,也就是在DISKIO.C中 指令函数中的磁盘判断号。如下: switch (pdrv) { case ATA : break; case MMC : if( SDCard0_Init() == 0 ) stat = STA_OK; break; case USB : break; case SPI_FLASH : if( SPIFLASH_disk_initialize() == 0 ) stat = STA_OK; break; } ATA , MMC , USB , SPI_FLASH 就是对应的磁盘号: /* Definitions of physical drive number for each media */ #define MMC 0 #define ATA 1 #define USB 2 #define SPI_FLASH 3 在DISKIO.H中定义,磁盘的编号最好按顺序写,我这里用了2个,那么这样定义,不要定义成上面这样, /* Definitions of physical drive number for each media */ #define MMC 0 #define SPI_FLASH 1 #define USB 2 #define ATA 3 如果定义成最上面的形式,那么 _VOLUMES要定义成4了,因为在FF.C中有如下的定义: #if _VOLUMES static FATFS *FatFs ; /* Pointer to the file system objects (logical drives) */ #else #error Number of volumes must not be 0. #endif 原因就不说了,都看的懂的吧!!! 就到这里了,下班了。。。。。。
个人分类: ARM|14272 次阅读|0 个评论
分享 赛元微Flash MCU单片机一级代理商51单片机
KNK黄龙华 2014-5-10 14:22
赛元微单片机,性价比高,在直发器,小家电,电磁炉触控绝对优势,欢迎咨询深圳市康力佳电子Q2593454153/13723752350黄生
个人分类: MCU|273 次阅读|0 个评论
分享 Tiva Bootloader 记录一
热度 1 flyangus 2014-5-3 22:21
Tiva M4的Bootloader有两种模式写,一种是要写一小段bootloader程序,先下载下去,然后再写应用程序,写的时候注意Flash的位置,我调试了部分成功,还是有一些诡异的问题,这种模式扩展性强,第二种是用到ROM中的ROM_Update****相关的函数,这种模式和写常规的应用程序无区别,就是不具备扩展性,用起来方便, 放上代码吧,注意ROM_UpdateUART不用下载boot_serial,和通常的应用程序一样写,flash偏移位置0x0000000。 具体的问答在TI的官方支持网站: http://www.deyisupport.com/question_answer/microcontrollers/tiva_arm_cortex/f/96/p/61154/135776.aspx#135776 问题最终还是没有结局,等那天再调试看看,或有人给出答案吧。 代码: #define TARGET_IS_BLIZZARD_RB1 #include stdint.h #include stdbool.h #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "inc/hw_nvic.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "driverlib/rom.h" #include "driverlib/uart.h" void JumpToBootLoader( void ) { // // We must make sure we turn off SysTick and its interrupt before entering // the boot loader! // ROM_SysTickIntDisable(); ROM_SysTickDisable(); // // Disable all processor interrupts. Instead of disabling them // one at a time, a direct write to NVIC is done to disable all // peripheral interrupts. // HWREG(NVIC_DIS0) = 0xffffffff; HWREG(NVIC_DIS1) = 0xffffffff; ROM_UpdateUART(); } void SetupForUART( void ) { ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // Configure the UART for 115200, n, 8, 1 ROM_UARTConfigSetExpClk(UART0_BASE, ROM_SysCtlClockGet(), 115200, (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | UART_CONFIG_WLEN_8)); // // Enable the UART operation. // ROM_UARTEnable(UART0_BASE); } int main( void ) { int i; ROM_SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x02); for (i=0;i50;i++) ROM_SysCtlDelay(100000); SetupForUART(); ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x04); JumpToBootLoader(); while (1) { } }
个人分类: TI|2955 次阅读|2 个评论
分享 什么是ROM、RAM、DRAM、SRAM和FLASH的区别
热度 1 wateras1 2014-4-19 18:28
文章转自网络: ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写。ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。 RAM有两大类,一种称为静态RAM(Static RAM/SRAM),SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。另一种称为动态RAM(Dynamic RAM/DRAM),DRAM保留数据的时间很短,速度也比SRAM慢,不过它还是比任何的ROM都要快,但从价格上来说DRAM相比SRAM要便宜很多,计算机内存就是DRAM的。 DRAM分为很多种,常见的主要有FPRAM/FastPage、EDORAM、SDRAM、DDR RAM、RDRAM、SGRAM以及WRAM等,这里介绍其中的一种DDR RAM。 DDR RAM(Date-Rate RAM)也称作DDR SDRAM,这种改进型的RAM和SDRAM是基本一样的,不同之处在于它可以在一个时钟读写两次数据,这样就使得数据传输速度加倍了。这是目前电脑中用得最多的内存,而且它有着成本优势,事实上击败了Intel的另外一种内存标准-Rambus DRAM。在很多高端的显卡上,也配备了高速DDR RAM来提高带宽,这可以大幅度提高3D加速卡的像素渲染能力。 内存工作原理: 内存是用来存放当前正在使用的(即执行中)的数据和程序,我们平常所提到的计算机的内存指的是动态内存(即DRAM),动态内存中所谓的"动态",指的是当我们将数据写入DRAM后,经过一段时间,数据会丢失,因此需要一个额外设电路进行内存刷新操作。 具体的工作过程是这样的:一个DRAM的存储单元存储的是0还是1取决于电容是否有电荷,有电荷代表1,无电荷代表0。但时间一长,代表1的电容会放电,代表0的电容会吸收电荷,这就是数据丢失的原因;刷新操作定期对电容进行检查,若电量大于满电量的1/2,则认为其代表1,并把电容充满电;若电量小于1/2,则认为其代表0,并把电容放电,藉此来保持数据的连续性。 ROM也有很多种,PROM是可编程的ROM,PROM和EPROM(可擦除可编程ROM)两者区别是,PROM是一次性的,也就是软件灌入后,就无法修改了,这种是早期的产品,现在已经不可能使用了,而EPROM是通过紫外光的照射擦出原先的程序,是一种通用的存储器。另外一种EEPROM是通过电子擦出,价格很高,写入时间很长,写入很慢。 举个例子,手机软件一般放在EEPROM中,我们打电话,有些最后拨打的号码,暂时是存在SRAM中的,不是马上写入通过记录(通话记录保存在EEPROM中),因为当时有很重要工作(通话)要做,如果写入,漫长的等待是让用户忍无可忍的。 FLASH存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据(NVRAM的优势),U盘和MP3里用的就是这种存储器。在过去的20年里,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备,然而近年来Flash全面代替了ROM(EPROM)在嵌入式系统中的地位,用作存储Bootloader以及操作系统或者程序代码或者直接当硬盘使用(U盘)。 目前Flash主要有两种NOR Flash和NADN Flash。 NOR Flash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的容量从而节约了成本。 NAND Flash没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节,采用这种技术的Flash比较廉价。用户不能直接运行NAND Flash上的代码,因此好多使用NAND Flash的开发板除了使用NAND Flah以外,还作上了一块小的NOR Flash来运行启动代码。 一般小容量的用NOR Flash,因为其读取速度快,多用来存储操作系统等重要信息,而大容量的用NAND FLASH,最常见的NAND FLASH应用是嵌入式系统采用的DOC(Disk On Chip)和我们通常用的"闪盘",可以在线擦除。目前市面上的FLASH 主要来自Intel,AMD,Fujitsu和Toshiba,而生产NAND Flash的主要厂家有Samsung和Toshiba。 NAND Flash和NOR Flash的比较 NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。紧接着,1989年,东芝公司发表了NAND flash结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。但是经过了十多年之后,仍然有相当多的硬件工程师分不清NOR和NAND闪存。 相"flash存储器"经常可以与相"NOR存储器"互换使用。许多业内人士也搞不清楚NAND闪存技术相对于NOR技术的优越之处,因为大多数情况下闪存只是用来存储少量的代码,这时NOR闪存更适合一些。而NAND则是高数据存储密度的理想解决方案。 NOR是现在市场上主要的非易失闪存技术。NOR一般只用来存储少量的代码;NOR主要应用在代码存储介质中。NOR的特点是应用简单、无需专门的接口电路、传输效率高,它是属于芯片内执行(XIP, eXecute In Place),这样应用程序可以直接在(NOR型)flash闪存内运行,不必再把代码读到系统RAM中。在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。NOR flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。NOR flash占据了容量为1~16MB闪存市场的大部分。 NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于flash的管理和需要特殊的系统接口。 1、性能比较: flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为1。 由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。 执行擦除时块尺寸的不同进一步拉大了NOR和NADN之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。这样,当选择存储解决方案时,设计师必须权衡以下的各项因素: ● NOR的读速度比NAND稍快一些。 ● NAND的写入速度比NOR快很多。 ● NAND的4ms擦除速度远比NOR的5s快。 ● 大多数写入操作需要先进行擦除操作。 ● NAND的擦除单元更小,相应的擦除电路更少。 (注:NOR FLASH SECTOR擦除时间视品牌、大小不同而不同,比如,4M FLASH,有的SECTOR擦除时间为60ms,而有的需要最大6s。) 2、接口差别: NOR flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。 NAND器件使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同。8个引脚用来传送控制、地址和数据信息。 NAND读和写操作采用512字节的块,这一点有点像硬盘管理此类操作,很自然地,基于NAND的存储器就可以取代硬盘或其他块设备。 3、容量和成本: NAND flash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。 NOR flash占据了容量为1~16MB闪存市场的大部分,而NAND flash只是用在8~128MB的产品当中,这也说明NOR主要应用在代码存储介质中,NAND适合于数据存储,NAND在CompactFlash、Secure Digital、PC Cards和MMC存储卡市场上所占份额最大。
个人分类: STM32F4XX/1XX/2XX/3XX/stm8s|977 次阅读|1 个评论
分享 NAND FLASH控制器
axpro 2014-3-11 21:03
NAND FLASH Controller IP Core Super-High-Speed NAND FLASH Array Controller 超高速NAND FLASH阵列控制器 我是一位在职者(北京),专业从事FPGA接口设计,有较多的空余时间,对FPGA有比较丰富的项目经验(6年)。 熟练使用Xilinx/Altera FPGA,熟悉NAND FLASH接口时序。 自行编写NAND FLASH Controller/控制器,可以以源代码(VHDL语言)或网表形式(提供使用手册)提供,功能包括: 1. NAND Flash物理接口时序:支持PAGE READ、PROGRAM PAGE、BLOCK ERASE、RESET、READ ID、READ STATUS、Set/Get Feature等命令集和相关时序 2. Nand Flash阵列的流水线管理:流水线化PROGRAM PAGE,使Nand Flash阵列的存储速度最大化;流水线管理NAND FLASH阵列的PAGE READ、BLOCK ERASE、RESET、READ ID等操作 3. Nand Flash阵列的坏块检测:检测NAND FLASH的原始出厂坏块 4. Nand Flash阵列的坏块管理:在Nand Flash阵列的PROGRAM PAGE和PAGE READ过程中,剔除NAND FLASH的坏块,产生有效的块地址 5. Nand Flash阵列的ECC:256 byte数据生成3 byte ECC编码,使用3 byte ECC编码能够纠正256 byte数据中的1个bit错误,检测2个bit以上的错误;汉明码256 Byte纠正1-bit,检错2-bit;或RS码1080字节纠正32-bit; NAND FLASH Controller自动进行坏块管理以及ECC纠错,坏块表可存储于FPGA内部RAM块或片外SRAM。 NAND FLASH控制器的用户接口友好,基本上都是DPRAM或FIFO接口,状态信号是I/O接口,易于使用。 此NAND FLASH控制器既可以适应简单的单片NAND FLASH应用,也可以适应NAND FLASH阵列应用,并且可以适应各种各样的NAND FLASH芯片型号。 8x8(8行8列:8个片选,64位数据总线) NAND FLASH阵列的存储速度可达380MB/S。 FPGA内部可以嵌入多个NAND FLASH控制器,每个控制器的存储速度可达380MB/S。如果嵌入4个NAND FLASH控制器,那么存储速度可达1520MB/S。 此NAND FLASH控制器多次在实际项目中使用,被证明稳定可靠。 如有NAND FLASH接口开发相关方面的技术合作,可随时联系我。 联系方式:neteasy163z@163.com NAND FLASH Controller IP Core 标准NAND FLASH Controller 标准NAND FLASH控制器 我是一位在职者(北京),专业从事FPGA接口设计,有较多的空余时间,对FPGA有比较丰富的项目经验(6年)。 熟练使用Xilinx/Altera FPGA,熟悉NAND FLASH接口时序。 自行编写标准NAND FLASH Controller/控制器,可以以源代码(VHDL/Verilog HDL语言)或网表形式(提供使用手册)提供,功能包括: 1. 支持异步接口的SLC和MLC Nand Flash 2. 最高支持时序模式5(Timing Mode 5) 3. 兼容ONFI命令集:Reset、Read ID/ONFI Signature、Read Unique ID、Read Parameter Page、Set Feature、Get Feature、Read Status、Erase、Program Page、Read Page、Program Page Cache、Read Page Cache 4. 支持上电自动坏块检测 5. 支持坏块表动态更新 6. 支持坏块管理(BBM);坏块管理使能和禁止 7. 支持ECC:汉明码256 Byte纠正1-bit,检错2-bit;或RS码1080字节纠正32-bit;ECC使能和禁止 8. 内置DMA数据传输引擎 9. 支持各个设备厂商(Micron、Samsung、Hynix、Toshiba、ST-Micro和其他厂商)的Nand Flash NAND FLASH Controller自动进行坏块管理以及ECC纠错,坏块表可存储于FPGA内部RAM块。 NAND FLASH控制器的用户接口友好,基本上都是DPRAM或FIFO接口,状态信号是I/O接口,易于使用。 此NAND FLASH控制器可以适应各种各样的NAND FLASH芯片型号。 此NAND FLASH控制器多次在实际项目中使用,被证明稳定可靠。 如有NAND FLASH接口开发相关方面的技术合作,可随时联系我。 联系方式:neteasy163z@163.com
个人分类: 技术交流|1301 次阅读|0 个评论
分享 uPad或者tPad什么的,然而今晚我只是简单跑了一下 stm8s003的内部flash例程
热度 1 辛昕 2014-1-14 00:47
如题,这几乎就是我今晚做的所有事情。 从不久前,确实不久,那时候我刚拿出我久置了将近一年的iPad,在很傻逼很乐呵地玩的时候,照例在 新生代版主群 和 kdy qq 白丁他仨聊得很嗨皮。 kdy突然说到做一个 单片机的小pad。 qq和白丁不懂,他说我懂的,就是我的uS加上一个显示屏。 我于是一下就懂了。 而且这个想法慢慢在我心里生根发芽。 特别是昨天,周末,我决定死都给它焊出一个最初的硬件版本出来的——Pad这个词的意思其实也可以理解为平台。 有了航母,各式各样的战斗机,侦察机才可以停靠。 平台就是这样一种伟大的东西。 结果昨晚从十点半还是十一点的时候开始焊,焊到两点才搞定。 结果从睡下到早上,上班,甚至我怀疑是做梦的时候。 各种想法突然一个一个跳出我的脑海。 特别是这一两天听有声小说 李嘉诚父子,听到 李泽楷拼了命在为长江实业抢夺 卫星电视经营权的时候,我突然下意识在想。 李泽钜李泽楷两兄弟虽然是 富二代,但这两人不是 付不起的阿斗 啃老,即使不是司马懿之后,三代之内一代猛过一代,至少也是孙坚孙权之后,虎父无犬子。 可是看李泽楷做的事情,其实他也只是在一件一件事务的忙来忙去,看起来绝对没有什么 需要提前学会的MBA课程或其他专业知识。 他只是和我们一样,在拼命完成自己的工作任务。 唯一的区别就是 他在做的事务是一件一本万利,可以在几十年内带来滚滚财富的大业务。 其实这阵子特别感谢kdy,他不愧是有工作十八年的人,视野和眼光,实在是我望尘莫及。我写的uS,那么多人,看了或者没看, 压根不理解我在做什么,而他却能说出一句 “就是你的uS+一块显示屏,你懂的。” 而我更没想到,他这句简简单单的话,无意被我记住,结果我会一步一步想到那么远。 不管是wifi,还是这个uPad的最初创意,其实uPad这个东西如果以后真的可以有那么一点点名声,它至少有一半属于 kdy——虽然 我还不知道他的真名。 是的,这第三份工作开始以后,我给自己立下了一条规则,即使我忍不住想我自己业余的事情,我也最多只是在每25分钟工作周期的 空档去查阅5到10分钟的资料,绝不放下手头的工作专心去做。 可是今天,实际上,很多个5到10分钟,我脑子里都缠绕着 usb fatfs 12864通用多级菜单 例程(和目前百度上看到很多国内喜欢自己 写fat文件系统的人不同,我更喜欢移植已有的比较成熟的代码,不仅是减少风险和时间更是尽可能使用现成代码,这是我以后要坚持 的一种coding方式。) 以及之前的wifi lwip。 其实这些东西没有一个是省心的货色。 因此我一直被吓着。 可是,昨天,我终于在淘宝上买了那块 stm32+wifi+lwip的开发板; 而我也终于决定,把usb搞定,虽然是基于stm32方式,甚至在上位机上继续搞那个以前的libusb的 USB数传监控——假设我没有类似 串口助手的 USB调试助手的话。 虽然,最后我坐在咖啡厅里玩了一个晚上的 捕鱼达人,最后十点左右才回到家。 搞了半天,也就是把 stm8s003的 flash读写例程 测通了,并且整理成一个我的格式。 虽然发现了一个相当要命的问题,给它传入一个错误的地址,它居然没有出错。这真的是非常要命。 这还引发了另一个问题,也就是自从我看了 C标准库 的assert部分以后,想到的,对 这个 缝缝补补 破烂不堪的 stm库,即使不能短时间内进行大幅度修改,甚至重新构建,我也恐怕要付出不少时间来收拾它。 比如第一个要收拾的就是它该死的 以简单粗暴的while(1)代替的 assert断言失败的处理。 而且从今天这事情的效果看,它居然还是根本就没有真正实现这个作用的...... 而现在已经接近1点。 其实,今晚,即使只是做了一个非常简单的flash例程,我也经常想不弄——这是一种类似 高不成低不就 的心态。 但是,经历了很多事,使我耐着心,跟自己说,最多我今晚做不出来,但至少我要平静做下去,因为这只不过是一个flash操作。 这只不过总共不到100行代码,难道以我自称“三年职业程序员”的能力还搞不定? 以我的能力,即使是1000行,10000行代码我也能慢慢,用一个小时或者一两天收拾出一个头绪。 最后发现除了上面这个看起来无关要紧但实际非常严重的问题以外 至少看起来,它是成功的。 可惜,我终于决定在泡脚的时候,放下程序,跑到这写这篇博客。 今晚我决定以抄录一章C标准库里出现的 api函数声明 来让自己找一个去睡觉的理由。
5364 次阅读|1 个评论

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-27 04:49 , Processed in 0.087628 second(s), 22 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2020 http://test.bbs.eeworld.com.cn/

返回顶部