AVR开发 Arduino方法(六) 内存子系统

发布者:平安心境最新更新时间:2019-12-06 来源: eefocus关键字:AVR开发  Arduino方法  内存子系统 手机看文章 扫描二维码
随时随地手机看文章

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 }


关键字:AVR开发  Arduino方法  内存子系统 引用地址:AVR开发 Arduino方法(六) 内存子系统

上一篇:AVR开发 Arduino方法(五) 模数转换子系统
下一篇:AVR开发 Arduino方法(七) 嵌入式操作系统FreeRTOS

推荐阅读最新更新时间:2024-11-09 22:57

AVR开发 Arduino方法(六) 内存子系统
Arduino UNO R3主处理器ATMega328P的芯片内部拥有3种存储器:数据存储器,程序存储器和电可擦写可编程存储器;它们各自有不同的用途。 1.数据存储器 数据存储器是一块2KB大小的静态随机存储器(SRAM)。其中一部分空间分配给了通用寄存器和I/O寄存器,其余部分一般用于存储全局变量,堆栈数据和支持动态内存分配。它的存取速度快,但掉电后数据会丢失。 2.程序存储器 程序存储器是一块32KB大小的闪存(Flash),其中0.5KB用于引导程序。它可以多次擦写,掉电后数据不会丢失,一般用于存储程序。 3.电可擦可编程只读存储器 电可擦写可编程只读存储器(EEPROM)是一块1KB大小的独立数据存储空间。它和程序存储器一
[单片机]
AVR开发 Arduino方法(二) 中断子系统
在了解ATMega328P的中断子系统之前,首先要了解中断的概念。你正在看书,这时电话响了,你会怎么做呢?相信大多数人会这样:先标记看到的位置,接完电话回来后继续阅读。这就是一个现实生活中中断的例子,我们把“电话响了”成为中断源。 ATMega328P拥有26个中断源,如下表所示: 向量号 程序地址 中断源 中断定义 中断服务程序名称 1 0x0000 RESET 外部电平复位,上电复位,掉电检测复位,看门狗复位 2 0x0002 INT0 外部中断请求0 INT0_vect 3 0x0004 INT1 外部中断请求1 INT1_vect 4 0x0006 PCINT0
[单片机]
热门资源推荐
热门放大器推荐
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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