STM32读写内部FLASH的函数程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*******************************************************************************
flash的写函数:
输入:
u32 StartAddr flash起始地址
u32 *p_data 待写入数据指针,比如一个数组的名字。此数组必须是32位的数据。
u32 size 写入数据的数量,比如数组的长度。
输出:
0:正确执行
非0:出错
注意:输入数据一定是u32 的指针,即数据一定是按照4字节对齐写入的。
所以:size也是u32的个数(字节数的4分之一)
直接改文件扩展名即可使用。
*******************************************************************************/
#include "stm32f10x_flash.h"
//根据芯片的类型,决定每个page的大小。1k or 2k
#if defined (STM32F10X_HD) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) || defined (STM32F10X_XL)
#define FLASH_PAGE_SIZE ((uint16_t)0x800)
#else
#define FLASH_PAGE_SIZE ((uint16_t)0x400)
#endif
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)/FLASH_PAGE_SIZE)+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
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