Flash

10月18日,Holtek推出A/D NFC Flash MCU HT45F4050,其最大特点为MCU内建NFC Tag接口,终端产品不须采用MCU加NFC Tag IC的方案,可有效降低零件成本。

HOLTEK新推出HT45F4050 A/D NFC Flash MCU

HT45F4050 NFC接口RF Data Rate为106 kbit符合NFC Forum Type2及ISO1443 Type A标准,并包含有256 Bytes的NFC EEPROM及64 Bytes的NFC SRAM,可符合NFC Tag应用标准。

HT45F4050另外还包含8K×16程序内存、256×8 RAM、64×8 True EEPROM、12-bit A/D Converter、一组SPI/I2C接口、一个UART接口、4个Timer及一个4-SCOM LCD Driver,提供48LQFP封装,可符合多样应用的需求。

来源:HOLTEK

围观 349

10月17日,Holtek针对LED Gaming Keyboard应用新推出的Flash MCU HT68FB571,其最大特点为不需外加晶体管,以矩阵扫瞄I/O直推方式,达到同时完成128单色LED及键盘扫瞄。在Gaming Keyboard应用上拥有高性价比。

HOLTEK新推出HT68FB571 USB RGB LED Flash MCU

HT68FB571为单层板PCB安排的MCU脚位,能轻松降低跳线的使用量,具备1.5kHz高扫瞄频率,使LED有极佳的显示效果。HT68FB571的资源包含8K×16程序内存、512×8 RAM、64×8 True EEPROM及SPI×1,提供48LQFP及28SSOP二种封装,可满足单色LED Gaming Keyboard应用的需求。

HT68FB571延续HT66FB5x0 & HT68FB5x0系列特色,支持ISP在线韧体更新。

来源:HOLTEK

围观 299

芯片的加密,保证了芯片内部信息的安全性。有工程师会问:芯片加密后别人还能解密吗?这芯片安全吗?本文将为大家介绍几种不同类型芯片的加密方式。

随着信息技术的发展,信息的载体——芯片的使用也越来越多了,随之而来的是各个芯片厂商对芯片保密性要求越来越高,用芯片加密的方式来确保芯片内部信息的安全性。其实芯片的安全加密问题与芯片的类型有关,不同类型的芯片加密后有不一样的效果。

市面上现有的芯片种类很多,主要包括Flash,MCU,ARM,DSP,CPLD等。

一、Flash类芯片加密

Flash类芯片包含SPI Nor FLASH ,并行Nor FLASH,NAND FLASH,EMMC等,这些Flash类的芯片都没有非常牢固的加密功能,对code区进行加密后,只能进行写保护,如果有人想复制你的代码,只要读取母片即可,所以这类芯片安全性较低。

你的芯片够安全吗?

将上图所示的信息设置好写入芯片后,对应的区域即进入保护状态,不能编程,擦除,只能通过清空加密寄存器中的信息,才能从新对芯片进行擦除,编程操作。

二、MCU,ARM类芯片加密

经常会有人就MCU加密保护后能否二次使用的问题进行咨询。对于加密后的芯片能不能二次使用这个问题,得具体看是哪个类型的芯片,类似于TI 的MSP430系列芯片加密后即不可进行二次使用,这个加密为OTP(One Time Programmable)型,只能进行一次烧录。其原理是通过高压烧断熔丝,使外部设备再也无法访问芯片,这个是物理性,不可恢复,如要加密,请慎用!

但对于大部分ARM芯片来说,加密后芯片还是可以进行二次使用的。类似于NXP ARM类型芯片有3级可选的加密,即Level 1,Level 2,Level 3。其中Level 1 就是不做读保护级别,即可以读出芯片中的数据,但不能对芯片进行编程,擦除操作。如果芯片被设置为Level 2保护,这种状态下,不能读取芯片内的程序代码内容,也不能对芯片再次做存储空间的擦写或芯片调试了。而Level 3级别的保护是不可逆的,保护后即不能进行其他操作。综上,3个级别当中的Level 1和Level 2加密后还是可以通过解密的方式对芯片进行第二次操作,这种加密等级设置是比较人性化的。下图为P800系列编程器加密设置操作界面。

你的芯片够安全吗?

三、DSP类芯片加密

该类型的芯片加密形式是通过在特定的区域写入客户的密码进行加密。这种加密是可逆的,可以通过输入对的密码进行任何操作。但是有一种方式是不可逆的,即密码为全“0”。其P800系列编程器加密设置窗口如下。

你的芯片够安全吗?

四、CPLD、FPGA类芯片加密

这类芯片加密后一般都可以通过擦除方式进行解密,不能对加密的芯片进行读取操作,这种加密对芯片来说还是比较安全的。

以上便是几种常见类型芯片的加密方式以及加密后的效果,用户可以根据芯片类型选择对应的加密方式,最大程度确保芯片内部信息的安全。

你的芯片够安全吗?

转自:ZLG致远电子 研发部

围观 362

问题描述:

某客户反馈, 当 MCU 频繁的正常通断电的时候。FLASH 被异常改写,出现各种各样的异常(整片别擦除、中断向量表被改写为 0、写保护被清掉、被加上读保护 ……..)

问题调研:

首先跟客户沟通:

• 他们是延续之前的项目,进行的一些软硬件简单修改。之前的项目没有出现过类似的问题。

• 确认通断电的时间是足够,就是说他们断电后所有的 VDD 都回到 0.上电的时序也是正常。

• 原理图确认这是 follow 了我们的参考设计。

• 测量工作时的电压,只是发觉他们上电时会有一些抖动,其它一切正常。尝试让他们改善上电电路,去掉这一抖动,再次实验,仍然出现类似的问题。

到这里似乎跟硬件没有任何的问题了, 接着让客户代码进行删减又做了如下实验:

1, 去掉能 APP 部分代码,仅仅留下 IAP 代码。做相同的实验,问题再现。
2, 进一步删减程序,客户去掉程序中所有跟 flash 以及 OPTION BYTE 相关的部分,做相同的实验,问题再现。
3, 没招,再删,最后仅仅留下下面程序:

MCU 频繁的正常通断电的时候,FLASH被异常改写

MCU 频繁的正常通断电的时候,FLASH被异常改写

MCU 频繁的正常通断电的时候,FLASH被异常改写

客户反应只要掉用了 delay_init 函数就会出问题,不调用就不会出问题(仅仅做了一天的实验)。到这里似乎跟我们的软件有关系了,我们进一步分析发现他们改写了我们的 systick 的 config 函数,那么我就做下一个实验。

4, 改为标准库中的 systick 例程,去掉写保护,加一个 GPIO 定时翻转程序。同时在烧录之后,加上写保护,做相同的实验,问题再现。

5, 到这里我们都怀疑是芯片真的有损伤了,我们再做了一个实验用 cubemx 生成了一个 GPIO 翻转和 systick 的延时,做相同的实验,问题再现。

MCU 频繁的正常通断电的时候,FLASH被异常改写

从上面规格书来看,如果我们关断 mcu 内部的复位电路,需要在外部接一个复位信号保证 VDD 达到正常工作电压之前一直使 MCU 处于复位状态。

解决办法:

问题找到后解决办法就很简单,去掉 R48 这个 1k 欧姆的电阻,重做实验,再没有发现问题。

结论:

其实在之前我们的另外一个西安的客户发生过频繁上电不工作的情况。他们也是使用了就得数据手册,没有把 PDR_ON 脚拉到 VDD 所致。

对于 ST MCU 来说,这个 PDR_ON 引脚有的封装是被引出来了,有的封装没有引出,如果没有引出的是默认使能内部复位功能,如果引出的话,大家也要当心有的型号是拉低使能内部复位;有得是拉高使能内部复位。所以在检查电路时一定要当心。

来源:www.21ic.com

围观 410

FLASH 和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有 FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了。

在芯片的内电路中,FLASH和EEPROM不仅电路不同,地址空间也不同,操作方法和指令自然也不同,不论冯诺伊曼结构还是哈佛结构都是这样。技术上,程序存储器和非易失数据存储器都可以只用FALSH结构或EEPROM结构,甚至可以用“变通”的技术手段在程序存储区模拟“数据存储区”,但就算如此,概念上二者依然不同,这是基本常识问题。

EEPROM:电可擦除可编程只读存储器,Flash的操作特性完全符合EEPROM的定义,属EEPROM无疑,首款Flash推出时其数据手册上也清楚的标明是EEPROM,现在的多数Flash手册上也是这么标明的,二者的关系是“白马”和“马”。至于为什么业界要区分二者,主要的原因是 Flash EEPROM的操作方法和传统EEPROM截然不同,次要的原因是为了语言的简练,非正式文件和口语中Flash EEPROM就简称为Flash,这里要强调的是白马的“白”属性而非其“马”属性以区别Flash和传统EEPROM。

Flash的特点是结构简单,同样工艺和同样晶元面积下可以得到更高容量且大数据量下的操作速度更快,但缺点是操作过程麻烦,特别是在小数据量反复重写时,所以在MCU中Flash结构适于不需频繁改写的程序存储器。

很多应用中,需要频繁的改写某些小量数据且需掉电非易失,传统结构的EEPROM在此非常适合,所以很多MCU内部设计了两种EEPROM结构,FLASH的和传统的以期获得成本和功能的均衡,这极大的方便了使用者。随着ISP、IAP的流行,特别是在程序存储地址空间和数据存储地址空间重叠的MCU系中,现在越来越多的MCU生产商用支持IAP的程序存储器来模拟EEPROM对应的数据存储器,这是低成本下实现非易失数据存储器的一种变通方法。为在商业宣传上取得和双EEPROM工艺的“等效”性,不少采用Flash程序存储器“模拟”(注意,技术概念上并非真正的模拟)EEPROM数据存储器的厂家纷纷宣称其产品是带EEPROM的,严格说,这是非常不严谨的,但商人有商人的目的和方法,用Flash“模拟”EEPROM可以获取更大商业利益,所以在事实上,技术概念混淆的始作俑者正是他们。

从成本上讲,用Flash“模拟”EEPROM是合算的,反之不会有人干,用EEPROM模拟Flash是怎么回事呢?这可能出在某些程序存储空间和数据存储空间连续的MCU上。这类MCU中特别是存储容量不大的低端MCU依然采用EEPROM作为非易失存储器,这在成本上反而比采用Flash和传统EEPROM双工艺的设计更低,但这种现象仅仅限于小容量前提下。因Flash工艺的流行,现在很多商人和不够严谨的技术人员将程序存储器称为Flash,对于那些仅采用传统EEPROM工艺的MCU而言,他们不求甚解,故而错误的将EEPROM程序存储器称为“ 模拟Flash”,根本的原因是他们未理解Flash只是一种存储器结构而非存储器的用途,错误的前提自然导致错误的结论。

商业上讲,用EEPROM模拟 Flash是不会有人真去做的愚蠢行为,这违背商业追求最大利益的原则,技术上也不可行,而对于技术人员而言。本质的问题是Flash是一种存储器类型而非MCU中的程序存储器,即使MCU的程序存储器用的是Flash,但其逆命题不成立。

来源:huazhongwang

围观 417

常见存储器概念:RAM、SRAM、SDRAM、ROM、EPROM、EEPROM、Flash。存储器可以分为很多种类,其中根据掉电数据是否丢失可以分为RAM(随机存取存储器)和ROM(只读存储器),其中RAM的访问速度比较快,但掉电后数据会丢失,而ROM掉电后数据不会丢失。

在单片机中,RAM主要是做运行时数据存储器,FLASH主要是程序存储器,EEPROM主要是用以在程序运行保存一些需要掉电不丢失的数据。

FLASH:单片机运行的程序存储的地方。

SRAM:存储单片机运行过程中产生的了临时数据。

EEPROM:视用户的需要而定,一般用来存储系统的一些参数,这些参数可能需要修改,也可能不会修改。

ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写。ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。另外,一些变量,都是放到RAM里的,一些初始化数据比如液晶要显示的内容界面,都是放到FLASH区里的(也就是以前说的ROM区),EEPROM可用可不用,主要是存一些运行中的数据,掉电后且不丢失

RAM 又可分为SRAM(Static RAM/静态存储器)和DRAM(Dynamic RAM/动态存储器)。SRAM 是利用双稳态触发器来保存信息的,只要不掉电,信息是不会丢失的。DRAM是利用MOS(金属氧化物半导体)电容存储电荷来储存信息,因此必须通过不停的给电容充电来维持信息,所以DRAM 的成本、集成度、功耗等明显优于SRAM。 SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。DRAM保留数据的时间很短,速度也比SRAM慢,不过它还是比任何的ROM都要快,但从价格上来说DRAM相比SRAM要便宜很多,计算机内存就是DRAM的。

内存工作原理:内存是用来存放当前正在使用的(即执行中)的数据和程序,我们平常所提到的计算机的内存指的是动态内存(即DRAM),动态内存中所谓的"动态",指的是当我们将数据写入DRAM后,经过一段时间,数据会丢失,因此需要一个额外设电路进行内存刷新操作。

具体的工作过程是这样的:一个DRAM的存储单元存储的是0还是1取决于电容是否有电荷,有电荷代表1,无电荷代表0。但时间一长,代表1的电容会放电,代表0的电容会吸收电荷,这就是数据丢失的原因;刷新操作定期对电容进行检查,若电量大于满电量的1/2,则认为其代表1,并把电容充满电;若电量小于1/2,则认为其代表0,并把电容放电,藉此来保持数据的连续性。

而通常人们所说的SDRAM 是DRAM 的一种,它是同步动态存储器,利用一个单一的系统时钟同步所有的地址数据和控制信号。使用SDRAM不但能提高系统表现,还能简化设计、提供高速的数据传输。在嵌入式系统中经常使用。

ROM也有很多种,PROM是可编程的ROM,PROM和EPROM(可擦除可编程ROM)两者区别是,PROM是一次性的,也就是软件灌入后,就无法修改了,这种是早期的产品,现在已经不可能使用了,而EPROM是通过紫外光的照射擦出原先的程序,是一种通用的存储器。另外一种EEPROM是通过电子擦出,价格很高,写入时间很长,写入很慢。手机软件一般放在EEPROM中,我们打电话,有些最后拨打的号码,暂时是存在SRAM中的,不是马上写入通过记录(通话记录保存在EEPROM中),因为当时有很重要工作(通话)要做,如果写入,漫长的等待是让用户忍无可忍的。

Flash也是一种非易失性存储器(掉电不会丢失),它擦写方便,访问速度快,已大大取代了传统的EPROM的地位。由于它具有和ROM一样掉电不会丢失的特性,因此很多人称其为Flash ROM。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。

转自: http://www.cnblogs.com/yuandongtao1989/p/6674276.html

围观 330

单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。

插播一段:ROM最初不能编程,出厂什么内容就永远什么内容,不灵活。后来出现了PROM,可以自己写入一次,要是写错了,只能换一片。随着不断改进,终于出现了可多次擦除写入的EPROM,每次擦除要把芯片拿到紫外线上照一下,想一下你往单片机上下了一个程序之后发现有个地方需要加一句话,为此你要把单片机放紫外灯下照半小时,然后才能再下一次,这么折腾一天也改不了几次。历史的车轮不断前进,伟大的EEPROM出现了,拯救了一大批程序员,终于可以随意的修改ROM中的内容了。

EEPROM的全称是“电可擦除可编程只读存储器”,即Electrically Erasable Programmable Read-Only Memory。是相对于紫外擦除的rom来讲的。但是今天已经存在多种EEPROM的变种,变成了一类存储器的统称。

狭义的EEPROM:

这种rom的特点是可以随机访问和修改任何一个字节,可以往每个bit中写入0或者1。这是最传统的一种EEPROM,掉电后数据不丢失,可以保存100年,可以擦写100w次。具有较高的可靠性,但是电路复杂/成本也高。因此目前的EEPROM都是几十千字节到几百千字节的,绝少有超过512K的。

Flash:

Flash属于广义的EEPROM,因为它也是电擦除的ROM。但是为了区别于一般的按字节为单位的擦写的EEPROM,我们都叫它Flash。

既然两者差不多,为什么单片机中还要既有Flash又有EEPROM呢?

通常,单片机里的Flash都用于存放运行代码,在运行过程中不能改;EEPROM是用来保存用户数据,运行过程中可以改变,比如一个时钟的闹铃时间初始化设定为12:00,后来在运行中改为6:00,这是保存在EEPROM里,不怕掉电,就算重新上电也不需要重新调整到6:00。

但最大区别是其实是:FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有 FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了。

在芯片的内电路中,FLASH和EEPROM不仅电路不同,地址空间也不同,操作方法和指令自然也不同,不论冯诺伊曼结构还是哈佛结构都是这样。技术上,程序存储器和非易失数据存储器都可以只用FALSH结构或EEPROM结构,甚至可以用“变通”的技术手段在程序存储区模拟“数据存储区”,但就算如此,概念上二者依然不同,这是基本常识问题。

EEPROM:电可擦除可编程只读存储器,Flash的操作特性完全符合EEPROM的定义,属EEPROM无疑,首款Flash推出时其数据手册上也清楚的标明是EEPROM,现在的多数Flash手册上也是这么标明的,二者的关系是“白马”和“马”。至于为什么业界要区分二者,主要的原因是 Flash EEPROM的操作方法和传统EEPROM截然不同,次要的原因是为了语言的简练,非正式文件和口语中Flash EEPROM就简称为Flash,这里要强调的是白马的“白”属性而非其“马”属性以区别Flash和传统EEPROM。

Flash的特点是结构简单,同样工艺和同样晶元面积下可以得到更高容量且大数据量下的操作速度更快,但缺点是操作过程麻烦,特别是在小数据量反复重写时,所以在MCU中Flash结构适于不需频繁改写的程序存储器。

很多应用中,需要频繁的改写某些小量数据且需掉电非易失,传统结构的EEPROM在此非常适合,所以很多MCU内部设计了两种EEPROM结构,FLASH的和传统的以期获得成本和功能的均衡,这极大的方便了使用者。随着ISP、IAP的流行,特别是在程序存储地址空间和数据存储地址空间重叠的MCU系中,现在越来越多的MCU生产商用支持IAP的程序存储器来模拟EEPROM对应的数据存储器,这是低成本下实现非易失数据存储器的一种变通方法。为在商业宣传上取得和双EEPROM工艺的“等效”性,不少采用Flash程序存储器“模拟”(注意,技术概念上并非真正的模拟)EEPROM数据存储器的厂家纷纷宣称其产品是带EEPROM的,严格说,这是非常不严谨的,但商人有商人的目的和方法,用Flash“模拟”EEPROM可以获取更大商业利益,所以在事实上,技术概念混淆的始作俑者正是他们。

从成本上讲,用Flash“模拟”EEPROM是合算的,反之不会有人干,用EEPROM模拟Flash是怎么回事呢?这可能出在某些程序存储空间和数据存储空间连续的MCU上。这类MCU中特别是存储容量不大的低端MCU依然采用EEPROM作为非易失存储器,这在成本上反而比采用Flash和传统EEPROM双工艺的设计更低,但这种现象仅仅限于小容量前提下。因Flash工艺的流行,现在很多商人和不够严谨的技术人员将程序存储器称为Flash,对于那些仅采用传统EEPROM工艺的MCU而言,他们不求甚解,故而错误的将EEPROM程序存储器称为“ 模拟Flash”,根本的原因是他们未理解Flash只是一种存储器结构而非存储器的用途,错误的前提自然导致错误的结论。商业上讲,用EEPROM模拟 Flash是不会有人真去做的愚蠢行为,这违背商业追求最大利益的原则,技术上也不可行,而对于技术人员而言。本质的问题是Flash是一种存储器类型而非MCU中的程序存储器,即使MCU的程序存储器用的是Flash,但其逆命题不成立。

转自: 自由石匠

围观 338

在我们应用开发时,经常会有一些程序运行参数需要保存,如一些修正系数或一些自定义数据。这些数据的特点是:数量少而且不需要经常修改,但又不能定义为常量,因为每台设备可能不一样而且在以后还有修改的可能。将这类数据存在指定的位置,需要修改时直接修改存储位置的数值,需要使用时则直接读取,会是一种方便的做法。考虑到这些数据量比较少,使用专门的存储单元既不经济,也没有必要,而MM32L0系列产品内部的Flash容量较大,且擦写次数以万为单位,使用部分的Flash空间存储用户数据实现起来既方便又实惠。

MM32L0系列产品嵌入式闪存特性:

• 高达 128K 字节闪存存储器
• 存储器结构:
- 主闪存模块:最大 32K 字(32K×32 位)
- 信息模块: 系统存储器:高达 1K 字节(1K x 8 位)
选项字节:高达 2 x 8 字节
保密空间:高达 3K 字节(3K x 8 位)
保护字节:高达 512 字节(512 x 8 位)
闪存接口的特性为:
• 带预取缓冲器的读接口(每字为 2 × 64 位 )
• 选择字节加载器
• 闪存编程/擦除操作
• 访问/写保护
• 低功耗模式

MM32 FLASH操作

闪存空间由 64 位宽的存储单元组成,既可以存代码又可以存数据。主闪存块按 128 页(每页 1K 字节)或 32 扇区(每扇区 4K 字节)分块,以扇区为单位设置写保护。

主存储器的起始地址就是0x0800 0000,结束地址是0x0801 FFFF,共128K字节, B0、B1都接GND的时候,就是从0x08000000开始运行代码的。

选项字节的地址空间是0x1FFF F800 - 0x1FFF F80F,选项字节为16个字节(有效数据为低 8 位,而高 8 位为低 8 位的反码)。用于配置读写保护、软件/硬件看门狗以及器件处于待机或停止模式下的复位。

1、 读保护

在产品发布时,如果想对MCU的程序做一些保护性措施,防止他人通过仿真器把Flash中的程序读取回来,得到bin文件或hex文件,然后去模仿产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把Flash设置成读保护。

读保护后,只允许从用户代码中对主闪存存储器的读操作(以非调试方式从主闪存存储器启动),调试模式下(Sram boot 和 debug 模式)禁止对 flash 进行操作, flash 本身的程序禁止写低 4KB 空间。第 0 ~ 3 页被自动加上了写保护,其它部分的存储器可以通过在主闪存存储器中执行的代码进行编程(实现 IAP 或数据存储等功能),但不允许在调试模式下或在从内部 SRAM 启动后执行写或擦除操作(整片擦除除外)。

读保护操作方法:

FLASH_Unlock();//解锁
FLASH_ReadOutProtection(ENABLE);//读保护使能
FLASH_Lock();//上锁
注意:如果在设置了读保护时,调试器仍然连接到 JTAG/SWD 接口,需要执行一次上电复位,而不是(没有调试器时的)系统复位。

解除读保护操作方法:

FLASH_Unlock();//解锁
FLASH_ReadOutProtection(DISABLE);//读保护失能
FLASH_Lock();//上锁
注意:当解除读保护后MM32会自动擦除整片的Flash。

2、 FLASH写和擦除操作

只要MCU的供电正常,就可以完成烧写和擦除功能操作,但是在写/擦除 Flash 的同时不可以对它取指和访问数据,因为在对 Flash进行写/擦除操作的同时,任何对 Flash 的访问都会令总线停顿。

对FLASH进行写和擦除操作的功能主要由下列7个寄存器完成:
• 关键字寄存器(FLASH_KEYR)
• 选项字节关键字寄存器(FLASH_OPRKEYR)
• Flash 控制寄存器(FLASH_CR)
• Flash 状态寄存器(FLASH_SR)
• Flash 地址寄存器(FLASH_AR)
• 选项字节寄存器(FLASH_OBR)
• 写保护寄存器(FLASH_WRPR)

MM32 FLASH操作

第一步:FLASH解锁,访问闪存控制寄存器(FLASH_CR)的锁状态, Flash 存储器默认是受保护状态的,这样可以防范意外的擦除动作。 FLASH_CR 寄存器不允许被改写,除非执行一串针对 FLASH_KEYR 寄存器的解锁操作才能开启对 FLASH_CR 的访问权限。当LOCK位为“1”时表示FPEC和FLASH_CR被锁住,不能对FLASH进行读写或者擦除操作。在检测到正确的解锁序列后,硬件会自动清除此位为“0”,该位为“0”时才能对FLASH进行正常的操作。

第二步:清除相关标志位,清EOP(操作结束位)、WRPRTERR(写保护错误)和PGERR(编程错误)位,EOP(操作结束位)在需对FLASH进行读写操作时,需等存储器的操作结束和该位当闪存操作完成,然后硬件设置该位为“1”,再写“1”清除该状态位。 WRPRTERR(写保护错误)在试图对写保护的闪存地址编程时,硬件设置为“1”,写“1”清除状态。PGERR(编程错误)在试图对内容不是0XFFFF的地址编程时,该位置为“1”。

第三步:擦除FLASH(先擦除后写入),MM32的Flash 存储器可以按页(1K字节)为单位擦除,也可以整片擦除。
页(1K字节)擦除步骤:
• 检查 FLASH_SR 中的 BSY 位,以确认上一操作已经结束,当 FLASH_SR 中得 BSY 位为 1 的时候,这些寄存器不能写
• 置 FLASH_CR 寄存器中得 PER 位为 1
• 写 FLASH_AR 寄存器以选择待擦除的页
• 置 FLASH_CR 寄存器中的 STRT 位为 1
• 等待 FLASH_SR 中的 BSY 归零
• 读取已擦除页以校验
库函数操作函数:
FLASH_ErasePage(Page_Address);//页擦除,Page_Address表示需要擦除的页地址

整片擦除步骤:
可以用整片擦除命令一次擦除整个 Flash 用户区,但信息块不会受这个命令影响,注意用户在使用整片擦除时执行该函数会将写入的应用程序也会擦除,具体步骤如下:
• 检查 FLASH_SR 中的 BSY 位,以确认上一操作已经结束,当 FLASH_SR 中得 BSY 位为 1 的时候,这些寄存器不能写
• 置 FLASH_CR 寄存器中的 MER 位为 1
• 置 FLASH_CR 寄存器中的 STRT 位为 1
• 等待 BSY 位归零
• 读取全部页并校验
库函数操作函数:
FLASH_EraseAllPages();//整片擦除

选项字节的擦除步骤:
选项字节的编程与常规用户地址不同,总共 4 个字节(2 个写保护, 1 个读保护, 1 个硬件配置)。
• 检查 FLASH_SR 寄存器中的 BSY 位,以确保上一操作结束,当 FLASH_SR 中得 BSY 位为 1 的时候,这些寄存器不能写
• 解锁 FLASH_CR 寄存器中的 OPTWRE 位
• 置 FLASH_CR 寄存器中的 OPTER 位为 1
• 置 FLASH_CR 寄存器中的 STRT 位为 1
• 等待 BSY 位归零
• 读取并校验
库函数操作函数:
status = FLASH_EraseOptionBytes();//Option空间擦除

第四步:清除相关标志位,清EOP(操作结束位),等待擦除操作结束。

第五步:写入FLASH,存储器按页(1K字节)为单位写入,FLASH的写入地址必须是偶数(FLASH机制决定的FLASH写入的时候只能是偶数地址写入,必须写入半字或字,也就是2个字节或是4字节的内容)。
主闪存编程步骤:
• 检查 FLASH_SR 中的 BSY 位,以确认上一操作已经结束
• 置 FLASH_CR 寄存器中的 PG 位
• 以半字为单位向目标地址写入数据
• 等待 FLASH_SR 寄存器中的 BSY 归零
• 读数据以校验
在指定地址编写一个字库函数操作:
FLASH_ProgramWord(Address, Data);// Address表示待编写的地址,Data表示带写入数据

在指定地址编写半字库函数操作:
ProgramHalfWord(Address, Data); // Address表示待编写的地址,Data表示带写入数据

在指定FLASH选项字节地址(0x1FFF F800 - 0x1FFF F80F)编写半字库函数操作:
ProgramOptionByteData(Address, Data); // Address表示待编写的地址,Data表示带写入数据

第六步:FLASH上锁,设置Flash存储器保护状态,这样可以防范意外的擦除动作。

读取FLASH数据
我们要从地址addr,读取一个字(字节为8位,半字为16位,字为32位),可以通过如下的语句读取:
data= (*(__IO uint32_t*) addr));
将addr强制转换为u32指针,然后取该指针所指向的地址的值,即得到了addr地址的值。

小结:

1、 为了准确读取 Flash 数据,必须根据 CPU 时钟 (HCLK) 频率和器件电源电压,在 Flash 存取控制寄存器 (FLASH_ACR) 中正确地设置等待周期数 (LATENCY),有很多用户在自己配置时钟时,配置等待周期数错误导致程序进入HardFault。

MM32 FLASH操作

2、有些用户在测试读保护功能后,发现无法Download程序,这个时候MCU是处在读保护状态,所以程序无法下载,所以有两个解决办法:(1)在设置读保护之前加一个延时函数为程序擦除预留时间,延时时间以秒为单位,在MCU复位后,使用仿真器迅速擦除MCU程序。(2)从内置 SRAM 解除读保护,选择BOOT0接GND,使MCU从SRAM启动,Download程序,对读保护进行解除,然后重新将BOOT0接高电平。

3、如选项字节块对应的地址值为非 0xFFFF, 需先执行擦除选项字节块的动作,执行擦除选项字节块的动作不会导致自动的整片擦除操作, 不会改变读保护状态。

4、MM32的Flash主闪存块按 128 页(每页 1K 字节)或 32 扇区(每扇区 4K 字节)分块,存储器可以按页(1K字节)为单位擦除,也可以整片擦除,存储器按页(1K字节)为单位写入。

5、如果在设置了读保护时,调试器仍然连接到 JTAG/SWD 接口,需要执行一次上电复位读保护功能才会起作用,而不是(没有调试器时的)系统复位。

转自: 灵动微电子

围观 340

作者:叶子

FLASH的全称是FLASH EEPROM,但跟常规EEPROM的操作方法不同

FLASH 和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有 FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了。

至于那个“总工”说的话如果不是张一刀记错了的话,那是连基本概念都不对,只能说那个“总工”不但根本不懂芯片设计,就连MCU系统的基本结构都没掌握。在芯片的内电路中,FLASH和EEPROM不仅电路不同,地址空间也不同,操作方法和指令自然也不同,不论冯诺伊曼结构还是哈佛结构都是这样。技术上,程序存储器和非易失数据存储器都可以只用FALSH结构或EEPROM结构,甚至可以用“变通”的技术手段在程序存储区模拟“数据存储区”,但就算如此,概念上二者依然不同,这是基本常识问题。

没有严谨的工作精神,根本无法成为真正的技术高手。

EEPROM:电可擦除可编程只读存储器,Flash的操作特性完全符合EEPROM的定义,属EEPROM无疑,首款Flash推出时其数据手册上也清楚的标明是EEPROM,现在的多数Flash手册上也是这么标明的,二者的关系是“白马”和“马”。至于为什么业界要区分二者,主要的原因是 Flash EEPROM的操作方法和传统EEPROM截然不同,次要的原因是为了语言的简练,非正式文件和口语中Flash EEPROM就简称为Flash,这里要强调的是白马的“白”属性而非其“马”属性以区别Flash和传统EEPROM。

Flash的特点是结构简单,同样工艺和同样晶元面积下可以得到更高容量且大数据量下的操作速度更快,但缺点是操作过程麻烦,特别是在小数据量反复重写时,所以在MCU中Flash结构适于不需频繁改写的程序存储器。

在很多应用中,需要频繁的改写某些小量数据且需掉电非易失,传统结构的EEPROM在此非常适合,所以很多MCU内部设计了两种EEPROM结构,FLASH的和传统的以期获得成本和功能的均衡,这极大的方便了使用者。随着ISP、IAP的流行,特别是在程序存储地址空间和数据存储地址空间重叠的MCU系中,现在越来越多的MCU生产商用支持IAP的程序存储器来模拟EEPROM对应的数据存储器,这是低成本下实现非易失数据存储器的一种变通方法。为在商业宣传上取得和双EEPROM工艺的“等效”性,不少采用Flash程序存储器“模拟”(注意,技术概念上并非真正的模拟)EEPROM数据存储器的厂家纷纷宣称其产品是带EEPROM的,严格说,这是非常不严谨的,但商人有商人的目的和方法,用Flash“模拟”EEPROM可以获取更大商业利益,所以在事实上,技术概念混淆的始作俑者正是他们。

从成本上讲,用Flash“模拟”EEPROM是合算的,反之不会有人干,那么那位“总工”和楼上某网友所说的用EEPROM模拟Flash是怎么回事呢?这可能出在某些程序存储空间和数据存储空间连续的MCU上。这类MCU中特别是存储容量不大的低端MCU依然采用EEPROM作为非易失存储器,这在成本上反而比采用Flash和传统EEPROM双工艺的设计更低,但这种现象仅仅限于小容量前提下。因Flash工艺的流行,现在很多商人和不够严谨的技术人员将程序存储器称为Flash,对于那些仅采用传统EEPROM工艺的MCU而言,他们不求甚解,故而错误的将EEPROM程序存储器称为“ 模拟Flash”,根本的原因是他们未理解Flash只是一种存储器结构而非存储器的用途,错误的前提自然导致错误的结论。商业上讲,用EEPROM模拟 Flash是不会有人真去做的愚蠢行为,这违背商业追求最大利益的原则,技术上也不可行,而对于技术人员而言,尤其是IC业内的“总工”如果再这么讲那只能说明他或她要么根本不了解相关技术细节,要么非常不严谨,这都不符合“总工”的身份。本质的问题是Flash是一种存储器类型而非MCU中的程序存储器,即使MCU的程序存储器用的是Flash,但其逆命题不成立。

在此写此文,一方面是要澄清技术概念,另一方面更是不想令错误的说法误人子弟,搞技术也需要严谨的科学精神。

28系列是最早的EEPROM,28F则是最早的Flash,甚至Flash一词是Intel在1980S为推广其28F系列起的“广告名”,取其意“快”,仅此而已。当年的Flash不比传统EEPROM容量更大只是容量起点稍高。至于现在的手册中有无EEPROM字样并不重要,非要“较枝”的话,看看内容有无“电可擦除”存储器的说法,至少我随手打开SST的Flash手册上都写的很清楚,不过这些根本就是无意义的皮毛,典型的白马非马论。

至于AVR的地址连续问题是我随手之误,应指68HC系列,但即使如此,就算我没有用过包括AVR在内的任何MCU也跟Flash的性质毫无关系。

来源:电子发烧友

(直接点击图片可进入调查页面)

开发板测评图片
围观 299

页面

订阅 RSS - Flash