yfz000的专栏

通过 IAP,用户可以使用片内Flash 作为非易失性数据存储器,存储一些设备的配置信息。这样不仅可以节约成本,而且还可以减小线路板的面积。

利用IAP 将Flash 作为数据存储器时,用户需要控制自身代码量的大小及代码定位。绝对不能够出现Flash 数据区和Flash 代码区重叠的现象。因为在利用IAP 向片内Flash 存储器写入数据时,需要对数据扇区进行擦除。如果数据区和代码区重合,就有可能会破坏系统的代码空间,造成系统死机或崩溃。

一、编程片内Flash 的步骤

使用 IAP 函数对片内Flash 执行编程操作时,需要按以下步骤进行操作。

(1)确定参数在使用 IAP 代码之前,需要定义一些常量,如系统时钟、IAP 函数入口、IAP 入口缓冲区和出口缓冲区等。

(2)选择扇区对某一个扇区执行擦除、写入等操作之前,必须先选择该扇区。但也可以一次选择多个扇区。

(3)擦除扇区同其它的 Flash 芯片一样,LPC2300 的片内Flash 在写入数据前也需要执行擦除操作。不过这一步是可选的。如果目标区域已经被擦除了,那么就不必重复擦除,直接写入数据即可。擦除操作一次可以擦除多个扇区。

(4)编程Flash以上几步执行完毕后,就可以编程Flash 了。执行编程扇区的操作时,IAP 函数会将RAM中的数据拷贝到Flash 中,此时有几个限制:

1.Flash 的目标地址必须是256 字节对齐,,即目标地址[7:0]为0,如下图所示;

2.RAM 数据区的源地址必须字对齐,即起始地址[1:0]为0,如下图所示;

3.源数据区必须是局部总线上的 SRAM,不能使用通用USB SRAM 和以太网SRAM;

4.一次写入的字节数固定:256、512、1024 或者4096。

(5)校验数据IAP 代码还为用户提供了一个数据校验的手段,这样用户就可以不必自己动手来校验写入Flash 中的数据是否正确。用户需要提供目标地址、源地址和比较字节的个数。注意:源地址、目的地址和比较字节的个数都必须是字对齐。

二、程序主体

在这个程序中,我们向扇区7 写入512 个字节的数据。

主程序代码#define DestAddr 0x00007000 // 扇区7 的起始地址/******************************************************************************************** 函数名称:main** 函数功能:数据存储解决方案。******************************************************************************************/int main (void){__align(4) uint8 SendData[512]; // 定义变量区uint32 i;for(i = 0; i < 512; i++) // 初始化变量区数据{SendData[i] = i;}SelSector(7, 7); // 选择扇区EraseSector(7,7); // 擦除扇区SelSector(7, 7); // 选择扇区RamToFlash(DestAddr, (uint32)SendData, 512); // 写数据到FLASHwhile(1);return 0;}三、IAP读操作

很多资料只有写,没有读操作。写Flash必须用IAP命令,从Flash中读取数据不需要使用IAP命令,直接通过指针读Flash绝对地址里的数据即可。

volatile const unsigned char *pucdata;unsigned char ucData = 0;pucdata = (volatile unsigned int *) 0x00000254;ucData = * pucdata;通过以上语句即可将0x00000254地址的数据读取到变量ucData中。

IAP的读操作注意事项在我的资源里(IAP例程)有说明。

IAP写和读例程在我的资源里下载。

前有阻碍,奋力把它冲开,运用炙热的激-情,

yfz000的专栏

相关文章:

你感兴趣的文章:

标签云: