老许的笔记 https://bbs.21ic.com/?591729 [收藏] [复制] [RSS]

日志

华邦(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: ;                         // 页写入成功,返回
}

//------------------------------------------------------//

路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)