×
单片机 > 单片机程序设计 > 详情

LPC2378的IAP读写编程

发布时间:2020-09-03 发布时间:
|

通过 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); // 写数据到FLASH

while(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中。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多