LPC2000 内部flash 用作EEPROM 使用详解(转)

                                                                                        king 发表于 2006-8-6 12:34:55
1. LPC2000 的Flash 简介
Flash 存储器系统包含128kB Flash 器件的16 个扇区和256kB Flash 器件的17 个扇区。Flash
存储器从地址0 开始并向上增加。Flash boot 装载程序同时提供片内Flash 存储器的ISP
和IAP 编程接口。IAP、ISP 和RealMonitor 程序都位于boot 扇区。boot 扇区存在于所有的
器件当中。ISP 和IAP 命令不允许对boot 扇区执行写/擦除/运行操作。在128kB Flash 器
件中只有120kB Flash 可供用户程序使用。器件共包含256kB 的Flash,其中,248kB 的Flash
可供用户程序使用。Boot Block 一般位于片内Flash 存储器顶端。在128kB Flash 中,它
是第16 个扇区(对应的扇区号是15),在256kB Flash 中,它是第18 个扇区(对应的扇
区号是17)。Boot Block 占有的Flash 存储器扇区不能用来存放用户数据。
LPC2000 系列提供在在应用中编程IAP,最终用户代码直接执行在应用编程 (IAP)对片内
Flash 存储器进行擦除和编程操作。Falsh 可以擦写10000 次,512 字节行编程时间为1ms。
单扇区或整片擦除时间为400ms。
Flash 存储器在写或擦除操作过程中不可被访问。
执行Flash 写/擦除操作的IAP 命令使用片内RAM 顶端的32 个字节空间。如果应用程序中允
许IAP 编程,那么用户程序不应使用该空间。
很多8 位单片机中有页的概念,页为Flash 编程的最小单位,每次可以擦除和编程一个页的
内容,由于页中包含的字节较少,在这种情况下把Flash 用作EEPROM 灵活性会很好。而
LPC2000 系列没有页的概念,它只有扇区这个最小的Flash 编程单位,即用户即使是只修改
一个字节,也需要首先擦除8K 的Flash。
把Flash 当作EEPROM 的过程,其实就是对Flash 进行读-修改-写的过程。
2. 向Flash 中写数据
Flash 必须遵循选择扇区,擦除,选择扇区,写的过程,具体到程序的编写,必须先后有下
面的代码:
SelSector(1,1); // 选择扇区1
EraseSector(1,1); // 擦除扇区1
SelSector(1,1); // 选择扇区1
for(i=0;i<512;i++)
source[i]=0x41;
RamToFlash(0x00002000, (uint32)source, 512); // 写数据到扇区1
应用的时候需要注意下面几点:
1)如果写之前没有选择扇区,是不能正确写入的。
2)如果写之前没有擦除,写入是不正确的。
3)最少写512 字节,写入的字节数应当为512 或 1024 或 4096 或 8192.
4)Flash 在擦写时不能访问,这也是IAP 是要关闭中断的原因。关中断可以用下面的语句
来实现:__asm{MSR CPSR_c, #0xdf},与此对应,开中断可以下面的语句:
__asm{MSR CPSR_c, #0x5f}。
另外,经常有人问如何将一个常量的数值定义在Flash 的特定地址上,我觉得这个功能不太
实用,因为每次擦除的最小单位是8K,到不如直接写数据到Flash 的一个地址,这个地址
是在一个空扇区中,读和写都以这个地址为基址。由于编译后的代码是向下靠紧的,所以你
可以查看一下编译后的代码量,然后选择靠上的地址做为用的变量区。如果实在想把数组定
义在Flash 的特定位置好像可以用分散加载。
3. 从Flash 中读数据
从Flash 中读数据比较简单,可以定义一个指针变量,该指针变量指向特定的Flash 地址,
例如可以写成下面的样子:
uint32 i;
uint8 * p;
p=(uint8 *)0x1C000;
for(i=0;i<400;i++)
{
Puthexbyte(*(p++));
}
4. Flash 的加密
代码读保护 这是Bootloader 修订版1.61 的特性。代码读保护通过向Flash 地址单元0x1FC
(用户Flash 扇区0)写入0x87654321(十进制表示为2271560481)来使能。地址单元0x1FC
用来允许为fiq 异常处理程序保留部分空间。当JTAG 调试端口的代码读保护被使能时,外
部存储器引导和以下ISP 命令将被禁能:
&#61548; 读存储器
&#61548; 写RAM
&#61548; 运行
&#61548; 将RAM 内容复制到Flash
上述ISP 命令终止时返回CODE_READ_PROTECTION_ENABLED。代码读保护使能时,ISP 擦除命
令只允许擦除用户扇区的内容。这种限制是代码读保护不使能时所没有的。IAP 命令不受代
码读保护的影响。
采用工程模板的RelInFlash 会自动加密。
5. 采用工程模板时需要注意的地方
采用ZLG 的工程模板时需要注意下面几点:
1)修改堆栈,在STARTUP.S 文件中的初始化堆栈为 StackUsr-20*4
2)设置编译参数-apcs/intervork,需要注意是修改 Language Settings/ARM C
Compiler/ATPS 下面的。我一开始的时候不小心选择的语言设置是ARM Assembler ,结果运
行程序后一写Flash 就错,大家要选准语言设置。
3)变量定义,由于一次至少写512 个字节,所以跟读写操作的变量最好定义为uint32 类型
的,我犯的一个错误是将变量定义为uint8 类型的,如下面:
uint8 i;
for(i=0;i<512;i++)
source[i]=0x41;
RamToFlash(0x00002000, (uint32)source, 512); // 写数据到扇区1
结果可想而知,一直在for 循环中运行而跳不出来,这到给我们一个IAP 不好用的假象。

你可能感兴趣的:(LPC2000 内部flash 用作EEPROM 使用详解(转))