#include "flash.h"
//可加我微信大家一起交流哦
//微信号:18357164389
//不要随意转载哦!
#define Page_Size 128
void Flash_Write_String(const u16 Write_Addr,const u8 *Write_Data,const u16 Write_Len)
{
u16 xdata i = 0;
u8 code *w_addr = NULL; //Flash的写入地址
u16 xdata write_addr = 0;
u16 xdata writabledata_size = 0; //当前页可写数据大小
u8 xdata buffer[Page_Size] = {0}; //临时缓存
set_WDCLR; //喂狗
write_addr=Write_Addr/Page_Size*Page_Size; //Page写的起始地址
writabledata_size=Page_Size-(Write_Addr-write_addr); //当前页可写的长度
//读取当前页
w_addr=write_addr;
for(i=0; i<Page_Size; i++ )
{
buffer[i]= (*w_addr);
w_addr++;
}
//修改当前页
if(writabledata_size>=Write_Len)
{
for(i=0; i<Write_Len; i++)
{
buffer[Write_Addr-write_addr+i]=Write_Data[i];
}
}
else if(writabledata_size<Write_Len)
{
for(i=0; i<writabledata_size; i++)
{
buffer[Write_Addr-write_addr+i]=Write_Data[i];
}
}
//擦除当前页
IAPAH = (write_addr>>8)&0xFF;
IAPAL = write_addr&0xFF;
IAPFD = 0xFF;
set_IAPEN;
set_APUEN;
IAPCN = 0x22;
set_IAPGO;
//写入当前页
IAPCN = 0x21;
for(i=0; i<Page_Size; i++)
{
IAPFD=buffer[i];
set_IAPGO;
IAPAL++;
}
clr_APUEN;
clr_IAPEN;
write_addr+=Page_Size;
if(writabledata_size<Write_Len) //若是一页不够写
{
u8 j=0;
u8 write_number=(Write_Len-writabledata_size)/Page_Size; //还需写多少页
u8 residual_data_size=(Write_Len-writabledata_size)%Page_Size; //剩余数据的大小
for(j=0; j<write_number; j++)
{
for(i=0; i<Page_Size; i++)
{
buffer[i]=Write_Data[writabledata_size+j*Page_Size+i];
}
IAPAH = (write_addr>>8)&0xFF;
IAPAL = write_addr&0xFF;
IAPFD = 0xFF;
set_IAPEN;
set_APUEN;
IAPCN = 0x22;
set_IAPGO;
IAPCN = 0x21;
for(i=0; i<Page_Size; i++)
{
IAPFD=buffer[i];
set_IAPGO;
IAPAL++;
}
clr_APUEN;
clr_IAPEN;
write_addr+=Page_Size;
}
w_addr=write_addr;
for(i=0; i<Page_Size; i++ )
{
buffer[i]= (*w_addr);
w_addr++;
}
for(i=0; i<residual_data_size; i++)
{
buffer[i]=Write_Data[writabledata_size+j*Page_Size+i];
}
IAPAH = (write_addr>>8)&0xFF;
IAPAL = write_addr&0xFF;
IAPFD = 0xFF;
set_IAPEN;
set_APUEN;
IAPCN = 0x22;
set_IAPGO;
IAPCN = 0x21;
for(i=0; i<Page_Size; i++)
{
IAPFD=buffer[i];
set_IAPGO;
IAPAL++;
}
clr_APUEN;
clr_IAPEN;
write_addr+=Page_Size;
}
set_WDCLR; //喂狗
}
void Flash_Read_String(const u16 Read_Addr,u8 * Read_Data,const u16 Read_Len)
{
u8 code *r_addr = NULL; //Flash的写入地址
u16 xdata i=0;
r_addr=Read_Addr;
for(i=0; i<Read_Len; i++)
{
Read_Data[i]= *r_addr;
r_addr++;
}
}
关于N76E003的Flash存储
需积分: 50 50 浏览量
2018-05-10
09:40:37
上传
评论 2
收藏 1KB ZIP 举报
xiaominqin2413
- 粉丝: 0
- 资源: 2
最新资源
- Figma Converter for Unity适用Unity的Figma转换器Unity游戏开发插件unitypackage
- Creepy Animatronic Anims 令人毛骨悚然的电子动画Unity游戏动画插件资源unitypackage
- Rankings & Leaderboards 排名和排行榜Unity游戏开发插件资源unitypackage
- Semantic Color Palette 语义调色板Unity游戏开发插件资源unitypackage
- Low Poly Nature:Lush and Diverse Environments低聚自然郁郁Unity低多边形模型资源
- voc数据集是什么-我们如何使用voc数据集
- Edgar Pro-Procedural Level Generator程序关卡生成器Unity开发插件unitypackage
- 宝藏软件m3u8下载器\m3u8DL-CLI
- 三次样条插值的介绍-什么是三次样条插值原理
- http的一些相关介绍-对于我们来说什么是http
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈