初级会员

- 积分
- 90
- 金钱
- 90
- 注册时间
- 2016-5-24
- 在线时间
- 11 小时
|
10金钱
本帖最后由 16165008 于 2016-6-17 11:43 编辑
#include "OnChip_FLASH.h"
#include "MALLOC.h"
#define OnChip_FLASH_ADDRESS 0x08078000
//拷贝数据void OnChip_FLASH_CopyData(void *des,void *src,u32 n)
{
u8 *desdata=des;
u8 *srcdata=src;
u32 i;
for(i=0;i<n;i++)
{
*desdata=*srcdata;
desdata++;
srcdata++;
}
}
//向FLASH写入n个字节
//offset:相对定义的FLASH起始地址的偏移地址 0~32766 for 32KB
//data:
//n
void OnChip_FLASH_WriteNByte(u32 offset,u8 *data,u32 n)
{
u8 *DataBuff=(u8*)mymalloc(2048);//分配一块内存区域存放一页的数据
u16 pageindex;
u16 pageoffset;
u16 pageremain;
u32 pageaddr;//页在FLASH中的绝对地址
u16 i;
u16 HalfWord;
if(n==0) return;
if(data==NULL) return;
if(DataBuff==NULL) return;
n=n/2;//一次写入2个字节
pageindex=offset/2048;//页码(相对地址)
pageoffset=offset%2048;//页内偏移
pageremain=(2048-pageoffset)/2;//页内剩余区间(16位)
if(n<=pageremain) pageremain=n;
FLASH_Unlock();
while(1)
{
pageaddr=OnChip_FLASH_ADDRESS+(pageindex*2048);
OnChip_FLASH_CopyData(DataBuff,(u8*)pageaddr,2048);//读出一整页数据
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
FLASH_ErasePage(pageaddr);
for(i=0;i<(pageremain*2);i++)
{
*(u8*)(DataBuff+pageoffset+i)=*(u8*)(data+i);//在指定位置写入要改变的数据,其他位置数据不变
}
for(i=0;i<1024;i++)//写入一整页数据
{
HalfWord=*(u8*)(DataBuff+i*2);//低地址低字节
HalfWord|=(*(u8*)(DataBuff+i*2+1))<<8;//高地址高字节
FLASH_ProgramHalfWord((pageaddr+i*2),HalfWord);//写入半字
}
if(pageremain==n)//写完了
{
FLASH_Lock();
break;
}
else//还没有写完
{
pageindex++;//页码+1
pageoffset=0;
data+=pageremain*2;//写入数据指针偏移
n-=pageremain;//减去已经写入的数量
if(n>1024) pageremain=1024;//下一页还是写不完
else pageremain=n;
}
}
myfree(DataBuff);//释放动态分配的内存区域
}
//读出n个字节
//offset:相对偏移地址
//data:存放数据的指针
//n数据数量(byte)
void OnChip_FLASH_ReadNByte(u32 offset,u8 *data,u32 n)
{
u32 absAddr=OnChip_FLASH_ADDRESS+offset;
while(n--)
{
*(data++)=*((u8*)(absAddr++));
}
}
|
最佳答案
查看完整内容[请看2#楼]
试好了,去掉FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);这一行就好了,实在是诡异
|