历史上的今天
返回首页

历史上的今天

今天是:2024年12月06日(星期五)

正在发生

2019年12月06日 | AVR开发 Arduino方法(六) 内存子系统

2019-12-06 来源:eefocus

Arduino UNO R3主处理器ATMega328P的芯片内部拥有3种存储器:数据存储器,程序存储器和电可擦写可编程存储器;它们各自有不同的用途。

1.数据存储器

数据存储器是一块2KB大小的静态随机存储器(SRAM)。其中一部分空间分配给了通用寄存器和I/O寄存器,其余部分一般用于存储全局变量,堆栈数据和支持动态内存分配。它的存取速度快,但掉电后数据会丢失。

2.程序存储器

程序存储器是一块32KB大小的闪存(Flash),其中0.5KB用于引导程序。它可以多次擦写,掉电后数据不会丢失,一般用于存储程序。

3.电可擦可编程只读存储器

电可擦写可编程只读存储器(EEPROM)是一块1KB大小的独立数据存储空间。它和程序存储器一样可以用于保存程序运行中的数据,但在掉电后数据不会丢失。

Arduino IDE提供了几个EEPROM的示例,eeprom_write示例将0引脚上的模拟信号转换为数字信号,并将转换结果以字节的形式保存到EEPROM中:


 1 // eeprom_write.ino

 2 #include

 3 

 4 int addr = 0;

 5 

 6 void setup() {

 7 }

 8 

 9 void loop() {

10   int val = analogRead(0) / 4;

11 

12   EEPROM.write(addr, val);

13 

14   addr = addr + 1;

15   if (addr == EEPROM.length()) {

16     addr = 0;

17   }

18 

19   delay(100);

20 }


和eeprom_write示例相反,eeprom_read示例将EEPROM中的数据以字节的形式读出,并打印到串口0上:


 1 // eeprom_read.ino

 2 #include

 3 

 4 int address = 0;

 5 byte value;

 6 

 7 void setup() {

 8   Serial.begin(9600);

 9   while (!Serial) {

10     ;

11   }

12 }

13 

14 void loop() {

15   value = EEPROM.read(address);

16 

17   Serial.print(address);

18   Serial.print("t");

19   Serial.print(value, DEC);

20   Serial.println();

21 

22   address = address + 1;

23   if (address == EEPROM.length()) {

24     address = 0;

25   }

26 

27   delay(500);

28 }


与EEPROM相关的Arduino库函数有:

 

  EEPROM.write(address, val):向EEPROM指定地址写入一个字节的数据

  address:指定数据写入的地址

  val:写入的数据

  EEPROM.read(address):从EEPROM指定地址读出一个字节的数据

  address:指定数据读取的地址

  函数返回读取的一个字节数据

  EEPROM.length():获取EEPROM大小

  函数返回EEPROM的大小

 

ATMega328P的EEPROM由3个寄存器控制,EEPROM地址寄存器(EEARH和EEARL)和EEPROM数据寄存器EEDR分别用于在写入或读取EEPROM时保存地址信息和数据信息。EEPROM控制寄存器EECR的结构如下图所示:



EEPM1

EEPM0

EERIE

EEMPE

EEPE

EERE

将EEPROM主机写使能位EEMPE置1后,4个时钟周期内将EEPROM写使能位EEPE置1,就可以数据写入EEPROM的指定地址中;向EEPROM读使能位EERE写入1,则可以将EEPROM指定地址的数据读入EEDR寄存器中。


通过直接访问寄存器改写以上程序为:

 1 // eeprom_write_reg.ino

 2 #include

 3 

 4 int addr = 0;

 5 void eeprom_write(int address, byte val);

 6 

 7 void setup() {

 8 }

 9 

10 void loop() {

11   int val = analogRead(0) / 4;

12 

13   eeprom_write(addr, val);

14 

15   addr = addr + 1;

16   if (addr == EEPROM.length()) {

17     addr = 0;

18   }

19 

20   delay(100);

21 }

22 

23 void eeprom_write(int address, byte val) {

24   while (EECR & (1 << EEPE));

25   EEAR = address;

26   EEDR = val;

27   EECR |= (1 << EEMPE);

28   EECR |= (1 << EEPE);

29 }

30 

31 // eeprom_read.ino

32 #include

33 

34 int address = 0;

35 byte value;

36 byte eeprom_read(int address);

37 

38 void setup() {

39   Serial.begin(9600);

40   while (!Serial) {

41     ;

42   }

43 }

44 

45 void loop() {

46   value = eeprom_read(address);

47 

48   Serial.print(address);

49   Serial.print("t");

50   Serial.print(value, DEC);

51   Serial.println();

52 

53   address = address + 1;

54   if (address == EEPROM.length()) {

55     address = 0;

56   }

57 

58   delay(500);

59 }

60 

61 byte eeprom_read(int address) {

62   while (EECR & (1 << EEPE));

63   EEAR = address;

64   EECR |= (1 << EERE);

65   return EEDR;

66 }


推荐阅读

史海拾趣

Altera (Intel)公司的发展小趣事

Altera是一家以FPGA(可编程逻辑器件)和相关技术为主的半导体公司,于1983年成立于美国加利福尼亚州的圣塔克拉拉。以下是关于Altera公司发展的五个相关故事:

  1. 成立与早期发展:Altera公司由Robert Hartmann和Michael Magranet等人创立,最初以设计和制造EEPROM(可擦除可编程只读存储器)为主。1984年,Altera推出了全球第一个可编程逻辑器件EP300系列,开创了FPGA行业。随后,Altera不断扩大产品线,致力于FPGA技术的研发和推广。

  2. FPGA技术创新:Altera在FPGA技术方面持续进行创新,推出了一系列新产品和技术。1992年,公司推出了第一个基于SRAM(静态随机存储器)的FPGA器件,从而实现了更高的速度和灵活性。随后,Altera不断改进器件结构、设计工具和软件支持,提高了产品性能和用户体验。

  3. 与竞争对手的竞争:在FPGA市场,Altera与Xilinx是两大竞争对手。两家公司在技术、产品性能、市场份额等方面展开激烈竞争。为了在市场上取得优势,Altera不断加大研发投入,推出了更具竞争力的产品,并积极开展营销和销售活动。

  4. 收购与合并:Altera在发展过程中进行了一系列收购与合并,以扩大市场份额和提升技术实力。2015年,英特尔公司以约160亿美元的价格收购了Altera,将其并入英特尔旗下,成为英特尔的子公司。这一收购使英特尔获得了Altera在FPGA领域的技术优势和市场份额,进一步巩固了英特尔在半导体行业的领先地位。

  5. 公司发展与创新:作为英特尔的子公司,Altera继续发展和创新。公司不仅致力于FPGA技术的进一步改进和推广,还在其他领域进行探索和拓展,如数据中心、人工智能、物联网等。Altera不断推出新产品和解决方案,满足不同行业和应用领域的需求,保持了在半导体行业的竞争优势。

以上是关于Altera公司发展的五个相关故事,这些故事展示了Altera从成立初期到被英特尔收购的发展历程,以及其在FPGA技术领域的技术创新、市场竞争和业务拓展等方面的重要进展。

上海晶岳(AFSEMI)公司的发展小趣事

上海晶岳电子有限公司自2010年成立以来,就将目标锁定在60V以下MOSFET产品线及锂电池保护IC系列产品。在公司创始人的领导下,晶岳电子团队凭借对技术的深入理解和市场的敏锐洞察,迅速在行业中崭露头角。他们不仅注重产品的研发和设计,还积极与上下游企业合作,优化供应链,确保产品质量和交货期的稳定。经过几年的努力,晶岳电子在MOSFET领域建立了良好的口碑,为后续的发展奠定了坚实的基础。

Astro Industries Inc公司的发展小趣事

随着国内市场的饱和,Astro Industries Inc开始将目光投向海外市场。公司制定了详细的国际化战略,通过参加国际展览、建立海外销售网络等方式,积极开拓国际市场。同时,公司还针对不同国家和地区的市场需求,推出了定制化的产品,满足了不同客户的特殊需求。这些举措使得Astro Industries Inc在国际市场上也取得了不俗的成绩。

Herley New York公司的发展小趣事

Astro Industries Inc的创始人在电子行业拥有丰富的经验,他们看到了市场对于高性能电子产品的迫切需求。于是,公司从创立之初就专注于技术创新,投入大量资源进行研发。经过不懈的努力,Astro Industries Inc成功推出了一款具有颠覆性的电子产品,其性能远超当时市场上的同类产品,迅速获得了市场的认可。

成都成电硅海公司的发展小趣事

随着技术的不断成熟和市场的不断扩大,成都成电硅海公司开始寻求更广阔的市场空间。公司积极参加国内外各种行业展会和论坛,与业界同行进行深入的交流和合作。同时,公司还加大了对海外市场的开拓力度,成功将产品打入欧美等发达国家市场。这一系列的市场拓展举措,使得成都成电硅海公司的知名度不断提升,市场份额也逐渐扩大。

FDI [Future Designs , Inc.]公司的发展小趣事

在电子行业的早期,FDI(Future Designs, Inc.)还只是一家名不见经传的小公司。创始人李明,凭借其对电子技术的热爱和敏锐的商业洞察力,带领团队研发出了一款具有革命性的电子芯片。这款芯片不仅性能卓越,而且成本较低,迅速在市场上获得了认可。正是这款产品,为FDI公司赢得了第一桶金,也为公司后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

汽车尾灯控制电路—电子课程设计

:\'( 高手帮忙呐。汽车尾灯控制电路—电子课程设计…

查看全部问答>

各种 EDA 软件下载地址

http://www.sonsivri.com 直接搜索该论坛的帖子,一般能找到你所需要的EDA 软件,比如 ------ Synopsys Design Compiler 2008.09 It is for linux only. I installed it in Debian 4 and 5 and in Ubuntu and it worked well. Have fun Wink ...…

查看全部问答>

血糖仪原理设计及仿制开发方案详解-上

本文主要探讨基于C8051F系列单片机的血糖仪电路原理设计与应用分析,并同时提供仿制开发、调试生产的完整解决方案。   血糖测量通常采用电化学分析中的三电极体系。三电极体系是相对于传统的两电极体系而言,包括,工作电极(WE),参比电极(RE)和 ...…

查看全部问答>

遥测通信协议

貌似遥测通信一般采用无线、有线相结合的方式,了解一下他们大概一般包括哪些,最好举个例子,大致说明一下!…

查看全部问答>

GPRS模块拨号设置问题

我在设置gprs过程如下 1、AT+CGDCONT=1,“IP”,“CMNET” 2、AT+CGACT=1,1 (之后能获取PDP分配的IP地址,AT+CGREG=0,1) 3、ATD*99***1# 如果1、2、3走下来,执行到第3步就会返回“+CME ERROR:2”,但是如果跳过2的话就能放回“CONNECT”+一 ...…

查看全部问答>

scsi 中SendASPI32Command的问题,急!!!高手进

我的程序为什么跑一段时间就会在waitforsingleobject 处死等然后超时 部分代码如下:                 // Create Event                 hSrbEvent= Create ...…

查看全部问答>

ccs3.1 中注释中文语句写不了?

大家好 我用的ccs3.1 怎么在里面用中文注释直接写不上去啊?注释用英文或数字都行。 还有就是 include中只能自动加入2407.h(我用的2407),其他的头文件都自动加不进去。…

查看全部问答>

晒晒我先设计的LPC1114/LPC11U14/LPC1343开发板

最近对这三种芯片进行研究,发现做一块开发板是有必要的,于是设计一这款开发板:       板子已经送到厂家:                           ...…

查看全部问答>

本人想通过Atmega128的RXD1串口接收GPS的数据,通过TXD0跟计算机通信,问题在哪里啊?

有没有做过UART串口接收数据的,我在用Atmega128串口接收GPS数据遇到难题,就是老接不到数据,大侠们帮忙指正下,谢谢…

查看全部问答>

南华大学黄智伟 控制类赛题使用的元器件汇总

本帖最后由 paulhyde 于 2014-9-15 02:55 编辑 南华大学黄智伟 控制类赛题使用的元器件汇总  …

查看全部问答>