文档库 最新最全的文档下载
当前位置:文档库 › 详细介绍Flash型单片机的加密解密方法1

详细介绍Flash型单片机的加密解密方法1

详细介绍Flash型单片机的加密解密方法1
详细介绍Flash型单片机的加密解密方法1

详细介绍Flash型单片机的加密解密方法

自Flash技术得到广泛应用以来,各类单片机制造商纷纷采用了多种不同的芯片加密方法,对比掩膜ROM芯片来说,Flash ROM在线可编程特性使得芯片的加密和解密方式变得更加灵活和可靠。在Flash型单片机中,芯片的加密和解密工作都是通过对Flash ROM的编程来完成的,由于用户程序可以在线地改写ROM的内容,可以编写一套加密和解密的小程序,随用户程序下载到芯片中,通过运行该程序,在线修改Flash ROM的内容,对芯片进行加密和解密,使整个的加解密过程更为简单灵活。

随着Flash型单片机的普及,单片机加密的技术已经有了较大的变化。在这里我们以HCS12系列单片机为例,介绍一种典型的加解密机制,并着重讨论使用密码加解密的方法以及相应的用户接口程序设计思路。厂商利用单片机进行产品开发时,都会关心其代码和数据的保密性。考虑到用户在编写和调试代码时所付出的时间和精力,代码的成本是不言而喻的。

早期的单片机,代码是交给芯片制造商制成掩膜ROM。有两种加密的机制,一是彻底破坏读取代码的功能,无论是开发者还是使用者都永远无法读取其中的内容。从安全上来说,这种方式很彻底,但是已经无法检查ROM中的代码了。另一种方法是不公开读取方法,厂商仍可以读取代码。这种方式留有检查代码的可能性,但是并不能算是一种真正的“加密”,被破解的可能性是存在的。

客观地讲,一方面希望加密很彻底,而另外一方面又希望留有检查代码的可能,这是相互矛盾的要求。

Freescale公司的HCS12单片机采用的加解密思路有一定的典型性,我们对此作了一些研究,现以MC9S12DP256单片机为例,介绍Flash型单片机的加密解密方法。

BDM程序调试接口

Freescale公司的很多单片机都借用一种被称为后台调试模式(Background Debug Mode,BDM)作为下载和调试程序的接口。

BDM是一种单线调试模式,芯片通过一个引脚与编程器进行通信。在HCS12系列单片机中,内部都置有标准的BDM调试模块。

该模块有三种作用:

1)对内部存储器的读写。将用户程序下载到目标芯片中或是将存储器中的数据读出。

2)对单片机工作方式和资源进行配置。部分涉及到单片机工作方式和资源配置的寄存器只能在特殊模式下由编程器发送BDM命令来修改。

3)利用BDM模块可以读写内存和CPU内部寄存器,调试程序。

在HCS12单片机未加密的状态下,使用BDM硬件命令可以将Flash ROM中的程序读出或将新的程序写入。BDM命令可以由独立的硬件系统来送出,我们一般称此类系统为BDM编程器。

BDM编程器的时序协议是公开的,任何人都可以根据协议设计硬件、编写程序,实现BDM编程器的功能。使用BDM接口,编程器可以很容易的访问到目标系统的存储器,这给程序调试和烧写带来了很大的方便,然而,便利的对外接口也给盗用者留下了可乘之机。

在带有BDM模块的单片机中引入数据保密机制并非HCS12系列的首创,先前的HC12系列单片机的D家族中,就已经引入了屏蔽Lockout BDM读写的机制,可惜,该机制在单片机的扩展工作模式下存在着漏洞。相比之下,HCS12系列单片机中的保密机制更加完善,无论在BDM模式下或是扩展模式下,都可以屏蔽外部对Flash ROM的读写。

两种加密解密方法

在HCS12系列单片机中,加密可以分成两种方法:完全加密和使用密码的加密。这两种加密的方法根据用户的需求,使用的场合也有所不同。

?完全加密

所谓完全加密,就是将芯片彻底的保护起来,屏蔽对芯片的所有读操作。在MC9S12DP256单片机中,加密是通过对某一Flash单元($FF0F)编程来实现的。加密后的芯片,BDM编程器对Flash的读操作就被禁止了。

采用完全加密,读取ROM代码的可能性就不存在了,这是一种最为“安全”的加密方法。如果用户想修改ROM的内容,唯一的办法就是将Flash的内容全部擦除,这一操作可以通过BDM编程器来完成。

使用BDM编程器擦除Flash ROM和EEPROM的过程与在普通模式下对片内的Flash ROM擦除操作过程基本一样,区别是对寄存器或是存储单元的读写要改由BDM命令来实现。通过BDM编程器将一连串完整的擦除指令序列送给单片机,就可将Flash ROM和EEPROM的内容全部擦除了。

在全擦除操作完成后,BDM编程器将系统复位,系统会自动检查全擦除操作是否成功。如果成功,BDM状态寄存器的UNSEC位会自动置“1”,系统进入解密状态。

由于系统靠检查Flash ROM和EEPROM是否清空来决定系统是否保持加密状态,所以,如果用户程序偶然将Flash ROM和EEPROM的内容全部擦除,那么系统也将自动解密。

?使用密码的加密

为了留有读取ROM代码的可能,用户可以采用一种带有密码的加密方式。解密时,用户只要给出正确的密码(称为“后门密码”),就可以读写ROM,而不破坏其内容了。

使用这种方法,用户需要在加密之前,设定4个字长的密码,并将其存放在Flash中,MC9S12DP256存放密码的Flash地址是从$FF00到$FF07。设定的密码可以随用户程序一起下载到芯片中。

解密时,接受用户输入的密码并验证的工作只能由一个用户接口程序来完成的,不能使用BDM编程器。接口的方式没有限制,如SCI、SPI、IIC、MSCAN等等,只要用户能够将正确的密码输入,任何一种接口方式都是可以的,最为典型的接口是串口。

需要注意,不管使用哪种方式将系统解密,解密后的系统虽然可以暂时读取Flash,但是由于单元$FF0F中的最后两位仍处于加密状态(全擦除后,“11”的组合仍为加密状态),系统在下次复位后,仍会回到加密的状态,所以为了彻底解密系统,必须改写这两位为“10”。

灵活使用带密码的加密解密方法

通过研究我们发现,使用带有密码的加密方式,看似给破解代码留有了可能性,但因为接受和验证密码都需要由用户程序完成,只要用户程序设计的可靠,这种可能性是很小的。

为了增强用户接口程序的可靠性和灵活性,我们提出以下几种可能的设计思路:

针对穷举密码的对策。MC9S12DP256的密码长达8个字节,如果不将密码限定在ASCII 码的范围内,那么可以选择的密码数量将达到1.8*1019 种。为了防患破解者穷举密码,用户可以设定允许输入错误密码的次数,如果出错超过一定次数,接口程序就不再接收新的密码了。允许出错的次数可以根据安全需要和使用方便综合考虑。

灵活的对外接口。使用密码加解密时,用户程序使用的对外接口是没有任何限制的。本文中的串口程序只是一例,MC9S12DP256片内集成了众多的接口模块,如SCI、SPI、IIC、MSCAN、J1850等等。使用哪一个接口,用户可以根据方便和安全考虑自己选择,这样也会使破解者难以入手。

用户程序级密码验证。用户还可以给接口程序增设一级密码验证的步骤。只有通过该密码验证,才能进一步输入解密的密码。因为加密后,Flash ROM就无法读写了,用户程序可以将增设的密码也保存到Flash中,留待验证。另外,如果某一个模块既要作为接受密码的接口,又有其他的用途,也应该留有一个交互界面,在使用前让用户选择该模块的用途。

远程加解密。在很多场合,用户对于单片机的控制是通过以太网等介质远程实现的,只

要有相应的接口程序,能够远程对单片机进行加解密,这无疑会给用户的工作带来很大的方便。

总体而言,Flash在线编程技术的出现给单片机中的加密机制带来了很大的改变。通过对HCS12系列单片机加解密方法的分析,我们认为这种加解密的机制具有足够的安全性,以及灵活的加解密方式。

另外,使用密码解密的可靠性很高,实现的过程依赖于用户程序,只要精心设计接口程序,用户完全可以将这种风险降至最低。

双高科技对各类FLASH型单片机有过深入的研究和技术探讨,在各种系列的FLASH 型单片机解密领域拥有独特的技术优势,目前能成功破解的FLASH型芯片涉及A TMEL等数十个厂家的数万种单片机。如果您有相关单片机解密或破解需求,可与双高科技联系咨询更多解密详情。

【何杰与你共享】

更多精彩分享:QQ:1994226

(1) 系统设计者应该始终牢记的基本原则【单片机】

(2)【单片机解密技术】电子产品的设计工程师必读

spiFLASH芯片WQ的单片机驱动代码

spiFLASH芯片WQ的单片机驱动代码 #include "w25q80.h" // 注:W25Q80由256 BYTE 组成一个PAGE,不可PGAE擦除,可以进行BYTE PROGRAM 或者PAGE PROGRAM // 由16 PAGE 组成一个SECTOR,可SECTOR擦除 // 由16 SECTOR组成一个BLOCK,可BLOCK 擦除 // 由16 BLOCK 组成一个FULL MEMEORY,可FULL MEMORY 擦除 // 所以,总容量是1M bytes // W25Q80主要命令字 #define READ_ARRAY 0x03 #define SECTOR_ERASE 0x20 #define BYTE_OR_PAGE_PROGRAM 0x02 #define WRITE_ENABLE 0x06 #define WRITE_DISABLE 0x04 #define READ_STATUS_REGISTER 0x05 #define Manufacturer_DeviceID 0x9F // 定义W25Q80的CS脚对应MCU的IO #define W25Q80_CS P1_2 // SPI硬件初始化 void Spi_Init(void) { PERCFG |= 0x02; // SPI1映射到P1口 P1SEL |= 0xE0; // P15~P17作复用功能(clk mosi miso) P1SEL &= ~0x04; // P12作GPIO P1DIR |= 0x04; // P12作输出 P1_2 = 1; // P12输出高电平 U1CSR &= ~0xA0; // SPI主方式 U1GCR &= ~0xC0; // CPOL=0 CPHA=0 U1GCR |= 0x20; // MSB U1BAUD = 0; // 波特率设为sysclk/8 U1GCR |= 0x11;

AVR单片机EEPROM和FLASH区别

AVR单片机EEPROM和FLASH区别 为什么A VR单片机既有FLASH又有EEPROM?我如果要烧写程序只用HEX文件行么?那个EEP文件有什么作用? 你的程序代码是保存在FLASH里的,只烧写HEX文件就可以。EEP文件是EEPROM的初始化数据文件,如果不烧写,EEPROM会保持FF,如果烧写了这个文件,就会按照你的初始化要求初始化EEPROM。在实际中有时往往不仅仅需要程序代码,还需要用到一些数据,而这些数据又会根据情况的不同而变化。举个例子,比如我要测量一个电机的转数,而每天电机最多测量12个小时,要求记录这12个小时的转数,然后第二天从这个数值继续测量,当然第二天单片机也会重新上电。遇到这个情况你如何去保存你的记录数值呢?当然这就需要用到EEPROM了。EEPROM存取数据方便,掉电不丢失,适合记录这种要求有变化又要求掉电不丢失的数据。当然EEPROM也可以作为程序存储器来存放程序。但是A VR单片机的BOOTLOADER是ATMEL提供的,只能够从FLASH开始。其次,即使能够使用EEPROM做程序存储器,如今也不会采用这样的方式,因为EEPROM造价比FLASH要高很多,同时存取速度比FLASH要慢得多,因此如今的程序基本都是被放入FLASH中,而EEPROM只用来存放那些不希望丢失的数据而用了 FLASH 一个静态的只读存储器,单片机本身无法修改自己 EEPROM 是指5V或3.3V可擦写存储器,可以由单片机本身编程写入一般用来做掉电保护,也可以由烧程器写入。烧程时当然只用HEX文件AVR编程的时候,可以对EEPROM编程 设置你想要的初始化量 简单的说,flash是保存程序的,eeprom是保存程序需要用到的,掉电不会丢失的变量,通常是初始值之类的。通常flash不会被程序改写(avr有bootloader 功能,可以修改flash甚至bootloader自身),而eeprom则很容易被改写。 一般来讲,实际应用中eeprom用的不多,除非对成本极为看重,因为片内的eeprom比较不可靠,当电压不稳时,数据容易丢失。 AVR系列单片机的FLASH存储器、SRAM存储器、EEPROM存储器各有什么用途? FLASH:单片机运行的程序存储的地方。

单片机32个IO口流水灯C程序

单片机32个IO口流水灯C程序(转)2008-11-23 11:37/************************************************************ *89C51、S51单片机32个IO口流水灯测试程序 *Flash0、1、2、3分别对应单片机的P0、1、2、3四个口 *a程序对应流水灯从全灭到一个一个亮 *b程序对应流水灯从全亮到一个一个灭 *Author:大灵通 *2006-7-26 10:57,OK! *************************************************************/ #include #include #include #define uchar unsigned char #define uint unsigned int #define TimeDelay 60000 void delay(uint n); void Flash0a(void); void Flash0b(void); void Flash1a(void); void Flash1b(void); void Flash2a(void); void Flash2b(void); void Flash3a(void); void Flash3b(void); /************************************************************ *Function: 主函数 *parameter: *Return: *Modify: *************************************************************/ void main(void) { while(1) { Flash1b(); Flash1a(); delay(TimeDelay); delay(TimeDelay); Flash0b(); Flash0a(); Flash2b();

单片机内的Flash与EEPROM作用及区别(精)

单片机内的 Flash 与 EEPROM 作用及区别 单片机运行时的数据都存在于 RAM (随机存储器中, 在掉电后 RAM 中的数据是无 法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用 EEPROM 或FLASHROM 等 存储器来实现。在传统的单片机系统中, 一般是在片外扩展存储器, 单片机与存储器之间通 过 IIC 或 SPI 等接口来进行数据通信。这样不光会增加开发成本,同时在程序开发上也要花 更多的心思。在 STC 单片机中内置了 EEPROM (其实是采用 IAP 技术读写内部 FLASH 来 实现 EEPROM ,这样就节省了片外资源,使用起来也更加方便。下面就详细介绍 STC 单 片机内置 EEPROM 及其使用方法。 flash 是用来放程序的,可以称之为程序存储器,可以擦出写入但是基本都是整个扇区进行的 . 一般来说单片机里的 flash 都用于存放运行代码,在运行过程中不能改; EEPROM 是用来保存用户数据,运行过程中可以改变,比如一个时钟的闹铃时 间初始化设定为 12:00,后来在运行中改为 6:00,这是保存在 EEPROM 里, 不怕掉电,就算重新上电也不需要重新调整到 6:00 下面是网上详细的说法,感觉不错:

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

Flash型单片机的加密与解密

Flash型单片机的加密与解密 厂商利用单片机进行产品开发时,都会关心其代码和数据的保密性。考虑到用户在编写和调试代码时所付出的时间和精力,代码的成本是不言而喻的。 早期的单片机,代码是交给芯片制造商制成掩膜ROM。有两种加密的机制,一是彻底破坏读取代码的功能,无论是开发者还是使用者都永远无法读取其中的内容。从安全上来说,这种方式很彻底 ,但是已经无法检查ROM中的代码了。另一种方法是不公开读取方法,厂商仍可以读取代码。这种方式留有检查代码的可能性,但是并不能算是一种真正的“加密”,被破解的可能性是存在的。 客观地讲,一方面希望加密很彻底,而另外一方面又希望留有检查代码的可能,这是相互矛盾 的要求。 自Flash技术得到广泛应用以来,各类单片机制造商纷纷采用了多种不同的芯片加密方法,对比掩膜ROM芯片来说,Flash ROM在线可编程特性使得芯片的加密和解密方式变得更加灵活和可靠。在Flash型单片机中,芯片的加密和解密工作都是通过对Flash ROM的编程来完成的,由于用户程序可以在线地改写ROM的内容,可以编写一套加密和解密的小程序,随用户程序下载到芯片中,通过运行该程序,在线修改Flash ROM的内容,对芯片进行加密和解密,使整个的加解密过程更为简单灵活。 Freescale公司的HCS12单片机采用的加解密思路有一定的典型性,我们对此作了一些研究,现以MC9S12DP256单片机为例,介绍Flash型单片机的加密解密方法。 BDM Freescale公司的很多单片机都借用一种被称为后台调试模式(Background Debug Mode,BDM)作为下载和调试程序的接口。 BDM是一种单线调试模式,芯片通过一个引脚与编程器进行通信。在HCS12系列单片机中,内部都置有标准的BDM调试模块。该模块的有三种作用: 1) 对内部存储器的读写。将用户程序下载到目标芯片中或是将存储器中的数据读出。 2) 对单片机工作方式和资源进行配置。部分涉及到单片机工作方式和资源配置的寄存器只能在特殊模式下由编程器发送BDM命令来修改。 3) 程序调试。利用BDM模块可以读写内存和CPU内部寄存器,调试程序。 在HCS12单片机未加密的状态下,使用BDM硬件命令可以将Flash ROM中的程序读出或将新的程序写入。BDM命令可以由独立的硬件系统来送出,我们一般称此类系统为BDM编程器。 BDM编程器的时序协议是公开的,任何人都可以根据协议设计硬件、编写程序,实现BDM编程器的功能。使用BDM接口,编程器可以很容易的访问到目标系统的存储器,这给程序调试和烧写带来了很大

单片机的ROM、RAM、FLASH

单片机rom,ram和flash的作用 (2013-02-21 10:04:50) 转载▼ 常规上ROM是用来存储固化程序的,RAM是用来存放数据的。由于FLASH ROM比普通的ROM读写速度快,擦写方便,一般用来存储用户程序和需要永久保存的数据。譬如说,现在家用的电子式电度表,它的内核是一款单片机,该单片机的程序就是存放在ROM里的。电度表在工作过程中,是要运算数据的,要采集电压和电流,并根据电压和电流计算出电度来。电压和电流时一个适时的数据,用户不关心,它只是用来计算电度用,计算完后该次采集的数据就用完了,然后再采集下一次,因此这些值就没必要永久存储,就把它放在RAM里边。然而计算完的电度,是需要永久保存的,单片机会定时或者在停电的瞬间将电度数存入到FLASH里。 --ROM存放指令代码和一些固定数值,程序运行后不可改动;RAM用于程序运行中数据的随机存取,掉电后数据消失.. code就是指将数据定义在ROM区域,具只读属性,例如一些LED显示的表头数据就可以定义成code存储在ROM。 ROM:(Read Only Memory)程序存储器 在单片机中用来存储程序数据及常量数据或变量数据,凡是c文件及h文件中所有代码、全局变量、局部变量、’const’限定符定义的常量数据、startup.asm文件中的代码(类似ARM中的bootloader或者X86中的BIOS,一些低端的单片机是没有这个的)通通都存储在ROM中。 RAM:(Random Access Memory)随机访问存储器 用来存储程序中用到的变量。凡是整个程序中,所用到的需要被改写的量,都存储在RAM中,“被改变的量”包括全局变量、局部变量、堆栈段。

基于单片机的Flash在系统编程方法

基于单片机的Flash在系统编程方法 一个完整的嵌入式系统必须要有一个合适的存储器存放用户代码。Flash是一种非易失性存储器,而且具有电可擦写、容量大、价格便宜等特点,通常可 用于在DSP系统中存放用户代码。Flash在正常使用前要进行编程,即将用户 代码写入Flash。在系统编程方法不需要其他编程设备和编程电源,只借助于仿真器,可直接通过DSP烧写程序对Flash进行编程。本文所使用的编程方法就属于在系统编程。本文首先介绍常见的Flash编程方法。然后详细介绍本文方 法的原理,以及DSP系统上电加载原理,最后给出整个实现过程并分析了Flash变成时需要注意的一些问题。Flash编程方法常见的Flash编程方式Flash 在正常使用前必须写入用户程序,传统上有3种编程方法:由供应商出货前把 程序代码写入Flash,编程器编程和在系统编程。第1种方法不能满足用户更改代码的需求,所以在开发阶段不宜采用。当使用编程器编程时,要求Flash固 定在PCB板前必须把用户程序写入片内。因此,现在一般都优先考虑在系统编程方法,首先应确定所选的DSP是否支持在系统编程。现行的在系统编程的方法一般是先把待加载程序(用户程序)的.out文件(COFF格式)转成HEX格式,然后去掉HEX格式文件的文件头,再通过烧写程序写到Flash里去,也可以不进行COFF格式到HEX格式的转换这一步,把COFF文件作为源文件, 去除文件头信息后将其写入Flash。本文方法的编程原理本文的实现方法比较简单,首先把用户程序映射到系统RAM,再把用户程序作为数据直接从RAM搬 入Flash中。首先在CCS上完成用户程序,生成可执行的.out文件,将该文件设为文件1进行加载;然后加载烧写程序的.out文件,将其设为文件2;最后 运行文件2,通过它把文件1烧入Flash。操作步骤非常简单,这里要说明几点,首先,2个.out文件各自独立,文件2加载后,文件1成为数据,CCS在运行

单片机FLASH与RAM、ROM的关系

单片机FLASH主要用作程序存贮器,就是替代以前的ROM,最大的有有点是降低了芯片的成本并且可以做到电擦写,目前市场上单片机的FALSH寿命相差比较大,擦写次数从1000~10万的都有,但存储时间可以保证40年,在选用时要注意.还有一些廉价的单片机为了集成可掉电的数据存储器,没有选用价格昂贵的EEPROM,而用FALSH来做的,但要注意其寿命最多就10万次,而且擦写不能字节擦写,这要注意使用的场合其寿命是否满足要求. RAM是数据存储器,跟计算机里面的内存差不多,主要是用来存放程序运行中的过程数据,掉电后就会丢失之前的数据,所以程序在上电时需要进行初始化,否则上电后的数据是一个随机数,可能导致程序奔溃. ROM就是程序存储器,掉电后数据不会丢失,但在程序运行过程中其数据不会改变.早期的单片机的ROM因为擦写修改麻烦,价格昂贵或者价格低廉的OTP型无法修改数据等原因已经被现在的FLASH存储器替代了.因为FLASH的擦写很容易,现在的部分单片机支持在线内部编程,通过特定的程序执行方式可以修改FALSH 的内容,而实现在线修改程序存储器.这与上面说的程序存储器的内容在运行的时候不可被改变是不冲突的,因为在程序正常运行时,其内容不会改变,只工作在只读状态下的. 现在的单片机,RAM主要是做运行时数据存储器,FLASH主要是程序存储 器,EEPROM主要是用以在程序运行保存一些需要掉电不丢失的数据. 楼上说的很好 另外,一些变量,都是放到RAM里的,一些初始化数据比如液晶要显示的内容界面,都是放到FLASH区里的(也就是以前说的ROM区),EEPROM可用可不用,主要是存一些运行中的数据,掉电后且不丢失

串行接口FLASH存储器在8051单片机中的应用

串行接口FL AS H存储器在8051单片机中的应用3 张亚华,李福勤 (河南机电高等专科学校电子与通信工程系,河南新乡453002) 摘要:介绍了flash存储器A T25FS040与8051单片机的接口方法,详细叙述了A T25FS040读取,写入和擦除操作的具体方法和时序,设计了A T25FS040与8051单片机接口的硬件,并给出参考例子程序。 关键词:8051单片机;FL ASH存储器;SPI 中图分类号:TP368.1 文献标识码:A 文章编号:100822093(2007)0620001203 在单片机控制的大屏幕L ED显示屏中,需要存 储大量文字、图形的点阵数据。而8051 单片机内部 的程序存储器容量有限,且只能存储固定的点阵数据,缺乏灵活性。使用扩充外部数据存储器的方法存储点阵数据,除容量有限外,还存在占用单片机接口资源和数据掉电保护等问题。因此在此类单片机应用系统中,以尽量少的硬件资源,外扩大容量的FL ASH存储器,是一种较好的解决方案。 1 大容量FL ASH存储器A T25FS040 A T25FS040[1]是A TM EL公司生产的一种大容量串口FL A SH存储器,在一片SO IC封装的8脚芯片中,有4Mbit存储单元,组成512K×8的结构。整个存储区划分为8个64K字节的存储块,每一个块又划分为16个4K字节的扇区。数据写入时,一次可以写入一个字节或一个256字节的页面。读取数据时,可以一次读一个字节,也可以连续读相临单元的数据。数据擦除时,可以分别擦除一个扇区,一个数据块或者整个存储器。芯片可以反复擦写10000次。A T25FS040的I/O接口采用了4线的SPI接口,SPI时钟频率最高可达到50M Hz。该芯片采用低压供电,电源电压2.7V-3.6V。芯片还设计了完善的软硬件写保护功能和串口等待功能。 AT25FS040的引脚定义和引脚功能见图1和表1。 图1 A T25FS040引脚定义 表1 A T25FS040引脚功能 引脚功能引脚功能 /CS片选SI串行数据输入 SO串行数据输出SC K串行时钟 /WP写保护/HOLD串口等待 GND地线VCC电源 1.1 A T25FS040的操作指令 A T25FS040定义了11组操作指令,常用的有以下7种: 表2 A T25FS040常用指令表 指令代码操作WREN06H使能写操作 RDSR05H读状态寄存器 READ03H读操作 PRO GRAM02H写操作 SECTOR ERASE20H擦除扇区(4K) BLOC K ERASE52H擦除块(64K) CHIP ERASE60H擦除芯片(512K) 向A T25FS040发送操作指令的顺序是:SC K为低电平时,片选信号/CS由高电平变为低电平,然后单片机按SPI时序要求,在时钟脉冲作用下,经SI引脚向A T25FS040发送指令代码(高位在前),紧接着发送或接受指令的参数(地址、状态、数据等),完成后在SC K低电平时置“1”/CS信号。 1.2 A T25FS040的读操作 向A T25FS040发送读操作指令(03H),紧跟着 1 第15卷第6期 2007年11月 河南机电高等专科学校学报 Journal of Henan Mechanical and Electrical Engineering College Vol.15№.6 Nov.2007 3收稿日期:2007209220 作者简介:张亚华(19512),男,河南郑州人,副教授,主要从事嵌入式系统开发研究。

STC单片机内部FLASH读写程序

STC单片机内部FLASH读写程序(https://www.wendangku.net/doc/e113716413.html,/admin/article/article_a dd.php) 电子伙伴发表于 2006-4-11 16:26:00 1 推荐 //#i nclude "STC89C51.h" //#i nclude #define ERROR 0 #define OK 1 #define WAIT_TIME 0x00 //mcu clock 40mhz //#define WAIT_TIME 0x01 //mcu clock 20mhz //#define WAIT_TIME 0x02 //mcu clock 10mhz //#define WAIT_TIME 0x03 //mcu clock 5mhz #define HOUR 0x8000 #define MINUTE 0x8001 void ISP_EN(void) { EA = 0; // 关中断 ISP_CONTR = ISP_CONTR & 0x18; // 0001,1000

ISP_CONTR = ISP_CONTR | WAIT_TIME; ISP_CONTR = ISP_CONTR | 0x80; // 1000,0000 } void ISP_DI(void) { ISP_CONTR = ISP_CONTR & 0x7f; // 0111,1111 ISP_TRIG = 0x00; EA = 1; // 开中断} unsigned char Byte_read(unsigned int byte_addr) { ISP_ADDRH = (unsigned char)(byte_addr >> 8); ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; // 1111,1000 ISP_CMD = ISP_CMD | 0x01; // 0000,0001 字节读数据存储区 ISP_EN(); ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_(); ISP_DI(); return (ISP_DATA); }

如何用MSP430单片机flash存储数据

如何用MSP430单片机flash存储数据 MSP430 FLASH型单片机的FLASH存储器模块根据不同的容量分为若干段,其中信息存储器SegmengA及SegmentB各有128字节,其他段有512字节。SegmentB的地址是:0x01000h 到0x107F,SegmentA的地址是:0x01080h到0x010FFh。其他段的地址根据容量不同,从0xFFFFh开始,每512字节为一段进行分配。 FLASH存储器写入数据时,每一位只能由“1”变成“0”,不能由“0”变成“1“,因此,当我们有数据要保存到FLASH存储器时,要先对目标段进行整段擦除操作,擦除操作使的对应段FLASH存储器变成全“1”。下面是擦除FLASH段的子程序,配置好必要的寄存器后,向段中任意地址写入数据,及擦除一段。 void flash_clr(int *ptr) { _DINT(); //关中断 FCTL3 = 0x0A500; //* Lock = 0 开锁 FCTL1 = 0x0A502; //* Erase = 1 使能擦除 *((int *) ptr) = 0; //* 擦除段 } FLASH存储器可以按字节写入,也可以按字写入。 void flash_write_int8(int8_t *ptr, int8_t value) // 字节写入 { _DINT(); FCTL3 = 0x0A500; // Lock = 0 开锁 FCTL1 = 0x0A540; // Write = 1使能写入 *((int8_t *) ptr) = value; // 写入数据 }

void flash_write_int16(int16_t *ptr, int16_t value) // 字写入 { _DINT(); FCTL3 = 0x0A500; /* Lock = 0 */ FCTL1 = 0x0A540; /* Write = 1 */ *((int16_t *) ptr) = value; /* Program the flash */ } // FLASH存储器可以连续写入按字节写入指定的数量的数据 void flash_memcpy(char *ptr, char *from, int len) { _DINT(); FCTL3 = 0x0A500; /* Lock = 0 */ FCTL1 = 0x0A540; /* Write = 1 */ while (len) { *ptr++ = *from++; len--; } } 在我们的应用程序中可以将要保存的数据放在一个自定义的结构中,例如: typedef struct Setup { float gain_ch0; // 0通道增益 float gain_ch1; // 1通道增益 float gain_ch2; // 2通道增益 char init_flag; //初始化标记,恒为0xAA; }SETUP;

MSP430单片机对片内FLASH的读写操作程序范例

MSP430单片机对片内FLASH的读写操作程序范例 // 参数:wAddr 为地址, 范围0x1000~0xFFFF void ReadFlash(U16 wAddr,U8 *bBuf,U8 bLen) { while (bLen--) *bBuf++=*(U8 *)wAddr++; return; } void WriteFlash(U16 wAddr,U8 *bBuf,U8 bLen) { U8 reg1,reg2; reg1=_BIC_SR(GIE); reg2=IE1;IE1=0; // 保护原来中断标志,并关闭有关中断。 // 写一个字节数据到指定flash地址 while (bLen--) { while (FCTL3&BUSY); // 等待以前FLASH操作完成 FCTL3 = FWKEY; FCTL1 =FWKEY+WRT; // 发送写flash命令 *(U8 *)wAddr++=*bBuf // 写数据到指定的flash地址 while(FCTL3&BUSY); // 等待写操作完成 FCTL1 = FWKEY; FCTL3 = FWKEY+LOCK; // 对FLASH内容进行加锁保护 } if(reg1&GIE) _BIS_SR(GIE); // 恢复中断标志 IE1=reg2; return; } void EraseSectorFlash(U16 wAddr)

{ U8 reg1,reg2; reg1=_BIC_SR(GIE); reg2=IE1; // 保护有关中断标志 IE1=0; // 关闭IE1中断 while(FCTL3&BUSY); // 等待FLASH编程结束 FCTL3 = FWKEY; // 为了准备编程而初始化FLASH控制寄存器3 FCTL1 = FWKEY+ERASE; // 发送FLASH擦除命令 *(U8 *)wAddr=0; // 启动擦除操作 while(FCTL3&BUSY); // 等待擦除操作完成 FCTL1 = FWKEY; // 撤销任何对FLASH的操作命令 FCTL3 = FWKEY+LOCK; // 对FLASH内容进行加锁保护 if(reg1&GIE) _BIS_SR(GIE); // 恢复中断标志 IE1=reg2; return; }

STC单片机内部FLASH读写程序

STC单片机内部FLASH读写程序(https://www.wendangku.net/doc/e113716413.html, /admin/article/article_add.php) 电子伙伴发表于 2006-4-11 16:26:00 1 推荐 //#i nclude "STC89C51.h" //#i nclude #define ERROR 0 #define OK 1 #define WAIT_TIME 0x00 //mcu clock 40mhz //#define WAIT_TIME 0x01 //mcu clock 20mhz //#define WAIT_TIME 0x02 //mcu clock 10mhz //#define WAIT_TIME 0x03 //mcu clock 5mhz #define HOUR 0x8000 #define MINUTE 0x8001 void ISP_EN(void) { EA = 0; // 关中断 ISP_CONTR = ISP_CONTR & 0x18; // 0001,1000

ISP_CONTR = ISP_CONTR | WAIT_TIME; ISP_CONTR = ISP_CONTR | 0x80; // 1000,0000 } void ISP_DI(void) { ISP_CONTR = ISP_CONTR & 0x7f; // 0111,1111 ISP_TRIG = 0x00; EA = 1; // 开中断 } unsigned char Byte_read(unsigned int byte_addr) { ISP_ADDRH = (unsigned char)(byte_addr >> 8); ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; // 1111,1000 ISP_CMD = ISP_CMD | 0x01; // 0000,0001 字节读数据存储区 ISP_EN(); ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_(); ISP_DI(); return (ISP_DATA); }

LPC900系列Flash单片机详细开发流程

? ?1ゴLPC900 ?? ?? (1) 1.1 LPC900?? (1) 1.2 LPC900? ? ?偸 (2) 1.2.1 ???? (2) 1.2.2 ?? ? (2) 1.2.3 ??? (2) 1.2.4 ?? ? (3) 1.2.5 ? Hex ? (7) 1.3 LPC900?? ?? (8) 1.3.1 ? ?? ?UCFG1? (8) 1.3.2 ? ?Boot Status?& ? ?Boot Vector? (9) 1.4 LPC900? (10) 1.5 LPC900?? (10) 1.5.1 ?? ?? (10) 1.5.2 ?? ???? ? (11) 1.5.3 ???? ?偸 (11) 1.6 ?? (15) 1.7 ? (15)

1 LPC900 1.1 LPC900?? LPC900? ? ?Philips ? ?80C51 ?? 催 ??? ?ㄝ? ? ??⑤? ? UART?SPI?I2C ???? ? ?ADC/DAC? ? ?? ? ?? ???? ? ? ?? ?? 催? ? ? ?? ? ?? z 2 Clock?? ?? ? ?? ?80C51 ? ?6 ? z IAP ?? ? ?FLASH ?E2PROM???? 1.2?? z ICP/ISP ????? ??? ??? ? z 催有 ?RC ? ?7.3728MHz?? ? 〇 ??? 1.2??z ?WDT?????? ?⑤?? z RTC?Real Time Clock? ? ?? z ??? ??? ?〇 ?? ?????????? ? ? z 8 ? 64 ? ? ?? ? 1.1?? z ?? ?? ? ?1uA? z ??? 8051 ?? ? ? 1.1 P89LPC9102?P89LPC952 ? 1.2 P89LPC922 ? ? ?? ???? ? ? ???? ??

51单片机控制Nand Flash读写的两种方法

51单片机控制N a n d F l a s h读写的两种 方法 本文叙述了51单片机控制N a n d F l a s h读写的两种方法:总线方式和I/O模拟方式,并通过逻辑分析仪验证这两种方法均是符合N a n d F l a s h的读写时序的,最 后通过逻辑分析仪观察和汇编分析给出了这两种方法读效率的对比。 第一章 单片机与N a n d F l a s h总线连接 1N a n d F l a s h的总线时序分析 图1-1N a n d F l a s h总线操作要求 将N a n d F l a s h总线操作分为三类:写命令、写地址和数据操作(读数据与写数 据仅仅差别在n R和n W引脚,而且这两个引脚无法进行编址,故归为一类)。根 据这三类的时序要求,选出引脚在这三类中变化的进行编址,n E引脚总是要求 低电平,不符合要求;A L和C L在这三类操作中有时是低电平有时是高电平,符 合要求。

2单片机读写外部数据存储器的时序分析 由图2和图3可以知道,51单片机在进行外部数据读写操作时要求A L E信号为低电平,这与N a n d F l a s h总线操作片选信号n E要求相同,因此可以将A L E与 n E相连。为了能够利用N a n d F l a s h的保护功能,将n W P引脚与单片机的一个I/O 口相连。 3N a n d F l a s h与单片机的连接及编址

因为对于单片机仅仅M O V X 指令才能访问外部数据存储器,又因为单片机P 0口已经作为数据口与单片机相连,因此只能使用拥有高8位地址的P 2口。P 2口仅仅在16位地址操作中才有用,因此编址采用16位形式,用不到的补零。如表2所示,可知N a n d 的命令端口地址为:0×6000h ,地址端口地址为:o x A o o o h ,数据端口地址为:0×2000h 。在C 程序中声明如下: 第二章 单片机与N a n d F l a s h I /O 直接 相连 1.N a n d 与单片机的连接 图1-1描述了N a n d F l a s h 操作的时序要求,根据该要求可以采用单片机的I /O 口与N a n d F l a s h 直接相连,通过I /O 口模拟的方式来控制N a n d F l a s h 的操作。

单片机flash和ram-ROM的区别

单片机flash和ram/ROM的区别 常规上ROM是用来存储固化程序的,RAM是用来存放数据的。由于FLASH ROM比普通的ROM读写速度快,擦写方便,一般用来存储用户程序和需要永久保存的数据。譬如说,现在家用的电子式电度表,它的内核是一款单片机,该单片机的程序就是存放在ROM里的。电度表在工作过程中,是要运算数据的,要采集电压和电流,并根据电压和电流计算出电度来。电压和电流时一个适时的数据,用户不关心,它只是用来计算电度用,计算完后该次采集的数据就用完了,然后再采集下一次,因此这些值就没必要永久存储,就把它放在RAM里边。然而计算完的电度,是需要永久保存的,单片机会定时或者在停电的瞬间将电度数存入到FLASH里。 --ROM存放指令代码和一些固定数值,程序运行后不可改动;RAM用于程序运行中数据的随机存取,掉电后数据消失.. code就是指将数据定义在ROM区域,具只读属性,例如一些LED显示的表头数据就可以定义成code存储在ROM。 ROM:(Read Only Memory)程序存储器在单片机中用来存储程序数据及常量数据或变量数据,凡是c文件及h文件中所有代码、全局变量、局部变量、’const’限定符定义的常量数据、startup.asm文件中的代码(类似ARM中的bootloader或者X86中的BIOS,一些低端

的单片机是没有这个的)通通都存储在ROM中。 RAM:(Random Access Memory)随机访问存储器用来存储程序中用到的变量。凡是整个程序中,所用到的需要被改写的量,都存储在RAM中,“被改变的量”包括全局变量、局部变量、堆栈段。程序经过编译、汇编、链接后,生成hex文件。用专用的烧录软件,通过烧录器将hex文件烧录到ROM中(究竟是怎样将hex文件传输到MCU内部的ROM中的呢?),因此,这个时候的ROM中,包含所有的程序内容:无论是一行一行的程序代码,函数中用到的局部变量,头文件中所声明的全局变量,const声明的只读常量,都被生成了二进制数据,包含在hex文件中,全部烧录到了ROM里面,此时的ROM,包含了程序的所有信息,正是由于这些信息,“指导”了CPU的所有动作。可能有人会有疑问,既然所有的数据在ROM中,那RAM中的数据从哪里来?什么时候CPU将数据加载到RAM中?会不会是在烧录的时候,已经将需要放在RAM中数据烧录到了RAM中?要回答这个问题,首先必须明确一条:ROM是只读存储器,CPU只能从里面读数据,而不能往里面写数据,掉电后数据依然保存在存储器中;RAM是随机存储器,CPU既可以从里面读出数据,又可以往里面写入数据,掉电后数据不保存,这是条永恒的真理,始终记挂在心。清楚了上面的问题,那么就很容易想到,RAM 中的数据不是在烧录的时候写入的,因为烧录完毕后,拔掉电源,当再给MCU上电后,CPU能正常执行动作,RAM中照样有数据,这就说明:RAM中的数据不是在烧录的时候写入的,同时也说明,在CPU运行时,RAM中已经写入了数据。关键就在这里:这个数据不是人为写

单片机读写Flash例子程序和原理图

Programming Atmel’s AT29 Flash Family Introduction Atmel offers a diverse family of small sector Flash memory devices ranging in density from 256K to 4M bits. These de- vices read and program with a single voltage supply. The nominal supply volt- age is 5V for the AT29CXXX, 3.3V for the “low voltage” AT29LVXXX, and 3V for the “Battery Voltage” AT29BVXXX Flash memory family. The entire Flash PEROM product line is designed to al- low users to have one common pro- gramming algorithm for all three Flash voltage families. Therefore, upgrading from one density to another and from a higher voltage to a lower voltage device is simplified. This application note describes the de- sign benefits of Atmel’s AT29 Flash ar- chitecture as well as how the device ID feature is used to adjust for varying den- sities and supply voltages. In addition, Atmel’s Software Data Protection (SDP) feature, which prevents inadvertent writes, is described. An example is given to illustrate the ease with which the pro- gramming software can be written to ac- commodate four different 4M bit Flash devices: the AT29C040, the AT29LV040, and the newer generation Flash devices, the AT29C040A and the AT29LV040A. Hardware and software has been devel- oped to demonstrate the relevant design issues. The demo uses an AT89C51 Flash-based microcontroller (which has the same pinout and instruction set as an 80C51) as the host processor and a “C” language program for the software. The software automatically adjusts the amount of time required for program- ming the varying voltage versions of the 4M bit Flash devices in addition to ac- commodating for their different sector sizes. The AT89C51, a member of Atmel’s growing family of Flash microcontroller devices, features 4K bytes of in-system reprogrammable Flash memory (see At- mel application note “AT89C51 In-Cir- cuit Programming” for additional infor- mation). Current and future versions of Atmel’s microcontroller family incorpo- rate from as little as 1K byte of Flash memory to as much as 128K bytes, pro- viding many density options for different applications. Other versions will also in- clude special architectures such as a combination of Flash and parallel E2PROM memory on board. Programming Flash Devices Unlike Atmel’s Flash memories, pre- vious generations of Flash memories had large sectors, typically 4K to 128K bytes, and required that an entire sector be erased prior to programming. Gener- ally, the sector erase cycle time was hundreds or thousands of milliseconds and could be as long as 30 seconds for the entire memory array. In addition, a separate high voltage supply was re- quired for a write and erase operation. At- mel’s AT29 Flash memory family has sim- plified usage by having only one supply voltage, reducing the sector size, having the programming similar to an SRAM write operation, and decreasing signifi- cantly the total programming time. Small sector sizes reduce the amount of system resources necessary for pro- gramming. When only a few bytes in a Flash memory need to be altered, a RAM image of the Flash sector must be created. The RAM must then be altered with the new data, and the image trans- Flash 4-251

相关文档
相关文档 最新文档