flash的写函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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