华邦(W79E2051/W79E825)单片机系列NVM(仿EEPROM) 库函数
已有 1401 次阅读2009-9-13 08:16
|系统分类:单片机|
华邦, 小扇区, NVM, 库函数
华邦公司推出的 LPC(W79E2051/W79E825)单片机系列,内含小扇区的 NVM(仿EEPROM),在使用上比一般产品方便(指用 FLASH仿 EEPROM),因产品需要,编写了 NVM(仿EEPROM) 库函数,现上传供网友分享。
//------------------------------------------------------//
#ifndef __W79ExxxNVM_H__
#define __W79ExxxNVM_H__
#include <absacc.h>
#if defined(W79E825) // W79E825
# include "W79E825.h"
# define NVM_PLEN 64 // LEN = 256
# define NVM_RL 6 // PAGE = 4
#elif defined(W79E4051) // W79E4051
# include "W79E4051.h"
# define NVM_PLEN 16 // LEN = 128
# define NVM_RL 4 // PAGE = 8
#else
# error "请选择带NVM芯片型号"
#endif
#pragma SAVE
#pragma REGPARMS
// char NVM_RD_CHAR(unsigned char ADDR)
#define NVM_RD_CHAR(m) CBYTE[m+0xfc00] // 字节读出
extern int NVM_RD_INT(unsigned char ADDR); // 字读出
extern long NVM_RD_LONG(unsigned char ADDR); // 长字读出
extern void NVM_RD_PAGE(unsigned char PAGE,unsigned char *p); // 页读出
extern void NVM_CLR(unsigned char PAGE); // 页擦除
extern void NVM_WR_CHAR(unsigned char ADDR,unsigned char CA); // 字节写入
extern void NVM_WR_INT(unsigned char ADDR,unsigned int IA); // 字写入
extern void NVM_WR_LONG(unsigned char ADDR,unsigned long LA); // 长字写入
extern void NVM_WR_PAGE(unsigned char PAGE,unsigned char *p); // 页写入
#pragma RESTORE
#endif // __W79ExxxNVM_H__
//------------------------------------------------------//
/*---------------------------------------------------*/
/* */
/* W79E4051/W79E825 NVM通用读写子程序 */
/* */
/* CPU : W79E4051 */
/* 晶振 : 12MHz */
/* 作者 : 许意义 */
/* 版本 : V1.0 */
/* 日期 : 2009.1.6 */
/* */
/*---------------------------------------------------*/
#include "MPU51TYPE.h"
#include "W79ExxxNVM.h"
int NVM_RD_INT(unsigned char ADDR) // 字读出
{ unsigned int IA;
byte0(IA) = NVM_RD_CHAR(ADDR++);
byte1(IA) = NVM_RD_CHAR(ADDR);
return(IA);
}
long NVM_RD_LONG(unsigned char ADDR) // 长字读出
{ unsigned long LA;
byte0(LA) = NVM_RD_CHAR(ADDR++);
byte1(LA) = NVM_RD_CHAR(ADDR++);
byte2(LA) = NVM_RD_CHAR(ADDR++);
byte3(LA) = NVM_RD_CHAR(ADDR);
return(LA);
}
void NVM_RD_PAGE(unsigned char PAGE,unsigned char *p) // 页读出
{
unsigned char a, i;
a = PAGE << NVM_RL;
for (i=0; i<NVM_PLEN; i++)
{ *p++ = NVM_RD_CHAR(a++);
}
}
void NVM_CLR(unsigned char PAGE) // 页擦除
{
NVMADDR = PAGE << NVM_RL;
NVMCON = _BV(EER);
}
void NVM_WR_CHAR(unsigned char ADDR,unsigned char CA) // 字节写入
{
NVMADDR = ADDR;
NVMDATA = CA;
NVMCON = _BV(EWR);
}
void NVM_WR_INT(unsigned char ADDR,unsigned int IA) // 字写入
{
NVM_WR_CHAR(ADDR++,byte0(IA));
NVM_WR_CHAR(ADDR, byte1(IA));
}
void NVM_WR_LONG(unsigned char ADDR,unsigned long LA) // 长字写入
{
NVM_WR_CHAR(ADDR++,byte0(LA));
NVM_WR_CHAR(ADDR++,byte1(LA));
NVM_WR_CHAR(ADDR++,byte2(LA));
NVM_WR_CHAR(ADDR, byte3(LA));
}
void NVM_WR_PAGE(unsigned char PAGE,unsigned char *p) // 页写入
{
unsigned char a, i;
unsigned char *p1;
a = PAGE << NVM_RL;
p1 = p;
for (i=0; i<NVM_PLEN; i++)
{ if ( *p1++ != NVM_RD_CHAR(a++)) // 比较页内容,值相等直接返回。
{ NVM_CLR(PAGE); // 值不等先页擦除。
a = PAGE << NVM_RL;
for (i=0; i<NVM_PLEN; i++)
{ NVM_WR_CHAR(a++,*p++); // 再写入。
}
goto NVM_WR_PAGE_END;
}
}
NVM_WR_PAGE_END: ; // 页写入成功,返回
}
//------------------------------------------------------//