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

发布者:龙腾少年最新更新时间:2016-05-26 来源: eefocus关键字:Cortex-M3  NXP  EEPROM存储器 手机看文章 扫描二维码
随时随地手机看文章
        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后读出通过串口打印显示

 
  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[] = {"\n\r\  
  26. \t - Name: Nuncle.lee \n\r\  
  27. \t - QQ: 23610603 \n\r\  
  28. \t - Email: nuncle.lee@gmail.com\n\r"};  
  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, '\0', 1);  
  38.       
  39.     Read_EEPROM(0, 0, read_buffer, sizeof(write_buffer)+1);  
  40.       
  41.     Uart2SendS(read_buffer);  
  42.   
  43.     return 0;  
  44. }  
  45.   
  46. void Init_EEPROM(void)  
  47. {  
  48.     unsigned int val=0;  
  49.       
  50.     rEEPWRDWN = 0;  //不处于掉电模式  
  51.     rEECLKDIV = (CCLK/375000)-1;    //设置一个375KHZ的EEPROM时钟  
  52.       
  53.     val  = ((((CCLK / 1000000) * 15) / 1000) + 1);      //配置等待状态时间  
  54.     val |= (((((CCLK / 1000000) * 55) / 1000) + 1) << 8);  
  55.     val |= (((((CCLK / 1000000) * 35) / 1000) + 1) << 16);  
  56.     rEEWSTATE = val;  
  57. }  
  58. void Write_EEPROM(unsigned char page_num, unsigned char page_offset, char* data, unsigned int count)  
  59. {  
  60.     unsigned int i;  
  61.       
  62.     rEEADDR = (page_offset&0x3f);   //确定开始写的页内偏移地址  
  63.     for(i=0; i
  64.     {  
  65.         rEECMD = 0x3;               //8位写操作  
  66.         rEEWDATA = *(data+i);  
  67.         while(!(rEEINTSTAT & (0x1<<26)));   //等待写操作完成  
  68.         page_offset++;  
  69.           
  70.         if(page_offset >= EEPROM_PAGE_SIZE)     //如果当前页写满了64Byte 则启动 编程操作  
  71.         {  
  72.             rEEINTSTATCLR = 0x1<<28;  
  73.             rEEADDR = (page_num&0x3F)<<6;  
  74.             rEECMD = 0x6;   //擦除编程  
  75.             while(!(rEEINTSTAT & (0x1<<28)));   //等待编程完成  
  76.               
  77.             page_offset = 0;  
  78.             page_num++;     //写满一页,准备写下一页  
  79.             rEEADDR = 0;    //写满一页,从页的开始写  
  80.         }  
  81.         else if(i==count-1)                 //如果要写入EPPROM的数据写完成,启动编程操作  
  82.         {  
  83.             rEEINTSTATCLR = 0x1<<28;  
  84.             rEEADDR = (page_num&0x3F)<<6;  
  85.             rEECMD = 0x6;   //擦除编程  
  86.             while(!(rEEINTSTAT & (0x1<<28)));  
  87.         }  
  88.     }  
  89. }  
  90.   
  91. void Read_EEPROM(unsigned char page_num, unsigned char page_offset, char* data, unsigned int count)  
  92. {  
  93.     unsigned int i;  
  94.     rEEADDR = (page_num&0x3F)<<6|page_offset&0x3F;      //确定读数据的起始位置,包括页偏移和页内的偏移  
  95.     rEECMD = 0x1<<3;                                    //8位读,地址自动递增模式  
  96.     for(i=0; i
  97.     {  
  98.         while(!(rEEINTSTAT & (0x1<<26)));               //等待上一次读数据完成  
  99.         *(data+i) = rEERDATA;  
  100.         page_offset++;  
  101.           
  102.         if(page_offset >= EEPROM_PAGE_SIZE)             //如果当前页64Byte读完,准备读下一页  
  103.         {  
  104.             page_offset = 0;  
  105.             page_num++;  
  106.             rEEADDR = (page_num&0x3F)<<6|page_offset&0x3F;    
  107.             rEECMD = 0x1<<3;  
  108.         }  
  109.     }  
  110. }  

 

程序的执行结果如下图

程序中,sizeof关键字计算出字符数组的大小,并不包含字符串的结束标志‘\0’。因此还需在sizeof(write_buffer)的位置写入字符串的结束标志。读取时读sizeof(write_buffer)+1个字节,才能正确的通过串口打印数据。当然,也可以自己指定串口打印字符的个数,而不用字符串结束标志去判断。

关键字:Cortex-M3  NXP  EEPROM存储器 引用地址:Cortex-M3 (NXP LPC1788)之EEPROM存储器

上一篇:Cortex-M3 (NXP LPC1788)之IIC控制器
下一篇:Cortex-M3 (NXP LPC1788)之ADC数模转换器的应用

推荐阅读最新更新时间:2024-03-16 14:55

恩智浦为接触式银行卡和安全身份市场带来高级安全的解决方案
SmartMX2-P40新一代接触式智能卡IC;专为快速、防篡改交易而优化 中国上海,2013年12月2日——恩智浦半导体NXP Semiconductors N.V. (NASDAQ:NXPI)作为安全银行和电子政务部署领域的全球领导者,针对快速增长的银行和电子政务 (eGov) 市场的大规模项目,推出新型SmartMX2-P40芯片卡微控制器平台。随着人们日常生活广泛地融入到一个不断深化的互联世界中,全球对身份窃取、欺诈和隐私问题的担忧依然继续,这促使金融和政府机构持续加大投入在个人数据防护方面。SmartMX2-P40搭载了一个功能强大的全新RISC MRK3-SC内核,并且基于恩智浦闻名全球的IntegralSecuri
[安防电子]
NXP Layerscape LS1046A Freeway评估板贸泽开售
专注于引入新品推动行业创新的电子元器件分销商贸泽电子 (Mouser Electronics) 即日起开售NXP Semiconductors的Layerscape®LS1046A Freeway (FRWY-LS1046A) 评估板。FRWY-LS1046A评估板是一个边缘计算平台,可以裸板方式提供,或在含双频段Wi-Fi模块的外壳内提供,旨在支持NXP的QorIQ LS1046A片上系统 (SoC)。 此款功能强大的评估板应用广泛,适用于从工业和智能建筑无线网关到支持面部识别的人工智能 (AI) ,以及汽车与航空航天等各类应用。其他目标应用还包括边缘计算网关、机器学习、机器人、工业物联网 (IIoT) 和数据通信。
[物联网]
<font color='red'>NXP</font> Layerscape LS1046A Freeway评估板贸泽开售
恩智浦推出全新MCX N微控制器,引领智能高效的边缘处理步入新时代
恩智浦全新MCX N微控制器首次集成恩智浦专用神经处理单元(NPU),可助力实现高性能、低功耗的边缘安全智能 中国上海——2022年11月9日——恩智浦半导体(NXP Semiconductors N.V.,)宣布推出MCX微控制器产品组合N系列中的首批产品: MCX N94x和MCX N54x 。MCX N系列微控制器专为简化安全智能边缘应用(包括物联网和工业应用)打造,首次集成了恩智浦专有神经处理单元(NPU),并集成了EdgeLock®安全子系统。MCX N系列器件采用多核设计,可智能、高效地将工作复杂分配到模拟和数字外设,提升系统性能并降低功耗。 产品重要性 如今的开发者需要微控制器能够具备更高的处理能
[嵌入式]
<font color='red'>恩智浦</font>推出全新MCX N微控制器,引领智能高效的边缘处理步入新时代
贸泽即日起备货NXP SLN-TLHMI-IOT EdgeReady智能HMI解决方案
为物联网、工业物联网和智能应用提供ML视觉、语音和GUI功能 2023年9月20日 – 提供超丰富半导体和电子元器件™的业界知名新品引入 (NPI) 代理商贸泽电子 (Mouser Electronics) 即日起备货NXP Semiconductors的SLN-TLHMI-IOT EdgeReady智能HMI解决方案。 该产品是32位嵌入式评估板,集成了先进的图形功能、免提远场语音控制,以及NXP用于人脸和手势识别的先进视觉处理技术,并且充分利用了NXP i.MX RT117H跨界微控制器 (MCU) 的强大功能,是一款完整的智能人机接口 (SMHMI) 解决方案。 其搭载的跨界MCU可完全离线执行各种人脸和手势识别以
[工业控制]
贸泽即日起备货<font color='red'>NXP</font> SLN-TLHMI-IOT EdgeReady智能HMI解决方案
高通收购恩智浦出现小插曲:属常规程序
高通470亿美元收购恩智浦(NXP)引起业界的关注,如果顺利,两家公司合并后,年收入将超过300亿美元,成为移动、汽车、物联网、安全、射频、网络等领域的行业领导企业。6月29日高通首席执行官史蒂夫·莫伦科夫在MWCS2017上海展上接受通信世界全媒体采访时表示,此次收购具备良好的业务互补性,不管是监管部门还是合作伙伴,对于这一收购接受程度很高,完成收购后高通能为客户提供更好的服务并支持他们实现向智能互联时代的快速转型。 据悉,高通已向包括中国在内的数个国家和地区提交了申请,每个国家和地区监管机构的审批阶段和进度不一样,通过全部的审批并完成最终收购还需要一些时间,目前此项收购已经得到美国监管机构和中国台湾地区公平交易委员会的批准。不
[手机便携]
基于STM32微控制器处理先进电机控制方法
   变频器的问世和先进的电机控制方法让三相无刷电机(交流感应电机或永磁同步电机)曾经在调速应用领域取得巨大成功。这些高性能的电机驱动器过去主要用于工厂自动化系统和机器人。十年来,电子元器件的大幅降价使得这些电机驱动器能够进入对成本敏感的市场,例如:家电、空调或个人医疗设备。本文将探讨基于ARM的标准微控制器如何在一个被DSP和FPGA长期垄断的市场上打破复杂的控制模式,我们将以意法半导体的基于Cortex-M3 内核的STM32系列微控制器为例论述这个过程。     首先,我们回顾一下电机控制的基本原理。在电机控制系统内,为什么处理器非常重要?我们为什么需要非常好的计算性能?毕竟,Nicolas Tesla在一个世纪前发明交流电机
[嵌入式]
赋能边缘,恩智浦如何打造未来智能工厂?
18世纪中叶以来,人类历史上先后围绕蒸汽技术、电力技术、计算机信息与新能源技术发生了三次工业革命,而现在以智能化技术为基石的第四次工业革命也正蓄势待发。 未来的工厂会是什么样的?那一定会是一张网之下,万物都被连接,一切都被数据赋予灵魂,没有人干预,也能自动地完成一切生产。 数据显示,2021年,全球18%的GDP将用于工厂自动化。未来30年,全球人口将增加近 20亿,这将继续推动工厂自动化需求的巨大增长。 虽然工业4.0的概念已经喊了很多年,但实现这样的目标,并不容易。日前,恩智浦(NXP)召开媒体沟通会,深入探讨智能工厂。 真实物理工厂的数字孪生 “智能工厂真正的推动力是工业4.0或工业物联网,其核心是将
[焦点新闻]
赋能边缘,<font color='red'>恩智浦</font>如何打造未来智能工厂?
汽车“缺芯”告急:南北大众停产,芯片厂商全线涨价
芯片 供给不足,导致车载电脑两大模块无法生产,上汽 大众 、一汽大众首当其冲。不禁让人感叹,“缺芯何时了?”紧急布局,已是远水解不了近渴。 据相关媒体报道,半导体产业的产能紧张问题影响的不仅是消费电子行业,如今“缺芯”的问题也已传导到了汽车产业。 本次短缺的汽车芯片将导致 ESP(电子稳定程序系统)和 ECU(电子控制单元)即车载电脑两大模块无法生产。受到芯片断供影响,车企将面临的 停产 风险。 在车企冲刺 2020 年销量的最后一个月里,中高端汽车厂家面临停产风险对市场影响不可谓不大,而且此次缺芯问题不知何时才能解决。 据了解,本次停产风波,首当其冲的是上汽大众和一汽大众。 据了解,影响南北大众停产的
[汽车电子]
汽车“缺芯”告急:南北大众停产,芯片厂商全线涨价
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved