flash的写函数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/****************************************************************************** *

flash的写函数:

输入:

u32 StartAddr flash起始地址

u32 *p_data 待写入数据指针

u32 size 写入数据的数量

输出:

0:正确执行

非0:出错

注意:输入数据一定是u32 的指针,即数据一定是按照4字节对齐写入的。

所以:size也是u32的个数(字节数的4分之一)

******************************************************************************* /

u8 flash_write(u32 StartAddr,u32 *p_data,u32 size)

{

volatile FLASH_Status FLASHStatus;

u32 EndAddr=StartAddr+size*4;

vu32 NbrOfPage = 0;

u32 EraseCounter = 0x0, Address = 0x0;

int i;

int MemoryProgramStatus=1;

//为一是通过

FLASH_Unlock(); //解锁函数

NbrOfPage=((EndAddr-StartAddr)>>10)+1; //有多少个页被擦除//清除所有已有标志FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);

//擦页

FLASHStatus=FLASH_COMPLETE;

for(EraseCounter=0;(EraseCounter

{

FLASHStatus=FLASH_ErasePage(StartAddr+(PageSize*EraseCounter));

}

//开始写数据

Address = StartAddr;

i=0;

while((Address

{ FLASHStatus=FLASH_ProgramWord(Address,p_data[i++]);

Address=Address+4;

}

//检验数据是否出错

Address = StartAddr;

i=0;

while((Address < EndAddr) && (MemoryProgramStatus != 0)) {

if((*(vu32*) Address) != p_data[i++])

{ MemoryProgramStatus = 0;

return 1;

}

Address += 4;

}

return 0;

}

int flash_read(u32 StartAddr,u32 *p_data,u32 size)

{

u32 EndAddr=StartAddr+size*4;

int MemoryProgramStatus=1;

u32 Address = 0x0;

int i=0;

Address = StartAddr;

while((Address < EndAddr) && (MemoryProgramStatus != 0)) {

p_data[i++]=(*(vu32*) Address);

Address += 4;

}

return 0;

}

注:需在stm32f10x_conf.h中先定义#define _FLASH_PROG

相关文档
最新文档