NXP

(转)Cortex-M3 (NXP LPC1788)之EEPROM存储器

2019-07-12 12:47发布

EEPROM是一种非易失性存储器,主要用于存储相对少量的数据,如存储一些系统的配置信息。通过系统的EEPROM控制模块可以轻松的进行EERPOM的存储控制。         要正确使用EPPROM需要配置掉电寄存器EEPWRDWN确定EEPROM的工作模式,配置EEPROM时钟分频器寄存器,使EPPROM工作在375KHZ。下面对EPPROM的读和写数据进行介绍。         EEPROM存储器的访问有三种操作方式:读、写、擦除/编程。对EPPROM中写数据分成两个单独的操作:写和擦除/编程。第一步写操作并不是真正把数据写入EPPROM的存储介质中,而只是更新被称作“页寄存器”的临时数据寄存器。只有执行下一步”擦除/编程“操作才会真正地更新非易失存储器。LPC1788共有4K的片内EPPROM,其中EPPROM的每一页等于页寄存器大小为64Byte,总共有64页。大小正好是64*64=4096Byte=4K。首先我们指定的位数,如8、16或者32位,将数据写入页寄存器,页内的地址偏移由EEPROM地址寄存器的第6位决定。如果需要往页寄存器写入一串数据,写完第一个数据后,页内的偏移地址会自动增加,我们只需把要操作的下一个数据填入EEPROM写数据寄存器即可。当页寄存器的64个字节被写满,必须进行编程操作,将数据写入到EEPROM的存储介质。然后更新页寄存器的偏移地址。         对于EEPROM的读操作,首先要向地址寄存器写入一个12位的地址,高6位为页的偏移,即我们需要读哪个页寄存器。低6位为页内的偏移,即我们需要读当前页的哪个字节。读操作也可以自动的对地址寄存器做后递增,这样就可以对EEPROM存储器进行连续的操作而无需每次读数据都写入一个新地址。         下面的程序将信息写入EEPROM后读出通过串口打印显示 [cpp]
  1. #include "LPC1788_REG.h" 
  2. #include "uart.h" 
  3.  
  4. #define rEECMD          (*(volatile unsigned*)(0x00200080)) 
  5. #define rEEADDR         (*(volatile unsigned*)(0x00200084)) 
  6. #define rEEWDATA        (*(volatile unsigned*)(0x00200088)) 
  7. #define rEERDATA        (*(volatile unsigned*)(0x0020008C)) 
  8. #define rEEWSTATE       (*(volatile unsigned*)(0x00200090)) 
  9. #define rEECLKDIV       (*(volatile unsigned*)(0x00200094)) 
  10. #define rEEPWRDWN       (*(volatile unsigned*)(0x00200098)) 
  11.  
  12. #define rEEINTEN        (*(volatile unsigned*)(0x00200FE4)) 
  13. #define rEEINTCLR       (*(volatile unsigned*)(0x00200FD8)) 
  14. #define rEEINTSET       (*(volatile unsigned*)(0x00200FDC)) 
  15. #define rEEINTSTAT      (*(volatile unsigned*)(0x00200FE0)) 
  16. #define rEEINTSTATCLR   (*(volatile unsigned*)(0x00200FE8)) 
  17. #define rEEINTSTATSET   (*(volatile unsigned*)(0x00200FEC)) 
  18.  
  19. #define EEPROM_PAGE_SIZE 64 
  20. void Init_EEPROM(void); 
  21. void Write_EEPROM(unsigned char page_num, unsigned char page_offset, char* data, unsigned int count); 
  22. void Read_EEPROM(unsigned char page_num, unsigned char page_offset, char* data, unsigned int count); 
  23.  
  24. char read_buffer[]; 
  25. char write_buffer[] = {"  
  26. - Name: Nuncle.lee  
  27. - QQ: 23610603  
  28. - Email: nuncle.lee@gmail.com "}; 
  29.  
  30. int main(void
  31. {    
  32.     Init_Uart2(); 
  33.     Init_EEPROM(); 
  34.      
  35.      
  36.     Write_EEPROM(0, 0, write_buffer, sizeof(write_buffer)); 
  37.     Write_EEPROM(sizeof(write_buffer)/64, sizeof(write_buffer)%64, '