历史上的今天
返回首页

历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2021年10月14日 | ATmega48 EEPROM数据存储器

2021-10-14 来源:eefocus

ATmega48/88/168包含256/512/512字节的EEPROM数据存储器。它是作为一个独立的数据 EEPROM 的寿命至少为 100,000 次擦除周期。 EEPROM 的访问由地址寄存器,数据寄存器和控制寄存器决定。

具体的 SPI 及并行下载 EEPROM 数据请参见 P254“存储器编程”。

EEPROM 读/ 写访问

EEPROM 读/ 写访问EEPROM 的访问寄存器位于I/O 空间。

EEPROM的写访问时间由Table 3给出。自定时功能可以让用户软件监测何时可以开始写下一字节。用户操作EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路中,上电/ 下电时VCC 上升/ 下降速度会比较慢。此时CPU 可能工作于低于晶振所要求的电源电压。请参见 P20“ 防止EEPROM 数据丢失” 以避免出现EEPROM 数据丢失的问题。

为了防止无意识的EEPROM 写操作,需要执行一个特定的写时序。具体参看EEPROM控制寄存器的内容。

执行EEPROM 读操作时, CPU 会停止工作4 个周期,然后再执行后续指令;执行EEPROM 写操作时, CPU 会停止工作2 个周期,然后再执行后续指令。

EEPROM 地址寄存器- EEARH和EEARL

· Bits 15..9 – Res: 保留
保留位,读操作返回值为零。

· Bits 8..0 – EEAR8..0: EEPROM 地址
EEPROM 地址寄存器 – EEARH和EEARL指定了 256/512/512 字节的EEPROM。
EEPROM 地址是线性的,从 0 到 255/511/511。 EEAR 的初始值没有定义。 在访问EEPROM 之前必须为其赋予正确的数据。
EEAR8 在 ATmega48 中为无效位,必须始终将其赋值为 ”0”。

EEPROM 数据寄存器 - EEDR

· Bits 7..0 – EEDR7.0: EEPROM 数据
对于EEPROM 写操作, EEDR 是需要写到EEAR 单元的数据;对于读操作, EEDR 是从地址EEAR 读取的数据。

EEPROM 控制寄存器- EECR

· Bits 7..4 – Res: 保留
保留位,读操作返回值为零。

· Bit 5, 4 – EEPM1 与 EEPM0: EEPROM 编程模式位
EEPROM编程模式位的设置决定对EEPE写入后将触发什么编程方式。EEPROM的编程可以作为一个原子操作来实现擦除老的数据并写入新的数据,也可以将擦除与写操作 分为两步进行。不同编程模式的时序请见 Table2。 EEPE 置位时,对 EEPMn 的任何写操作都将会被忽略。在复位过程中,除非 EEPROM 处于编程状态,EEPMn 位将被设置 为 0b00。

· Bit 3 – EERIE: 使能 EEPROM 准备好中断
若 SREG 的 I 为 "1",则置位 EERIE 使能 EEPROM 准备好中断。清零 EERIE 则禁止此中断。当 EEPE 清零时 EEPROM准备好中断即可发生。

· Bit 2 – EEMPE: EEPROM 写使能
EEMPE决定设置EEPE为"1“是否可以启动EEPROM写操作。当EEMPE为"1“时,在4个时钟周期内置位 EEPE 将把数据写入 EEPROM 的指定地址;若 EEMPE 为 "0“,则EEPE不起作用。EEMPE置位后4个周期,硬件对其清零。见EEPROM写过程对EEPE位的描述。
· Bit 1 – EEPE: EEPROM 写使能
写使能信号 EEPE 是 EEPROM 的写入选通信号。当 EEPROM 数据和地址设置好之后,需置位 EEPE 以便将数据写入 EEPROM。此时 EEMPE 必须置位,否则 EEPROM 写操作将不会发生。写时序如下 ( 第 3 和第 4 步的次序可更改 ):
1. 等待EEPE 位变为零
2. 等待SPMCSR 中的SPMEN 位变为零
3. 将新的EEPROM 地址写入EEAR ( 可选)
4. 将新的EEPROM 数据写入EEDR ( 可选)
5. 对EECR 寄存器的EEMPE 写"1",同时清零EEPE
6. 在置位EEMPE 的4 个周期内,置位EEPE

在 CPU 写 Flash 存储器的时候不能对 EEPROM 进行编程。 在启动 EEPROM写操作之前软件必须要检查Flash写操作是否已经完成。第二步仅在软件包含引导程序,允许CPU对 Flash 进行编程时才有用。如果 CPU 永远都不会写 Flash,则第二步可以忽略。请参考 P240“Boot Loader 支持 RWW 自编程, ATmega88 与 ATmega168”。(注意:ATmega48 无Boot Loader)

注意 : 如有中断发生于步骤 5 和 6 之间将导致写操作失败。 因为此时 EEPROM 写使能操作将超时。如果一个操作EEPROM的中断打断了另一个EEPROM操作,EEAR或EEDR寄存器可能被修改,引起 EEPROM 操作失败。建议此时关闭全局中断标志 I。

经过写访问时间之后,EEPE硬件清零。用户可以凭此位判断写时序是否已经完成。EEPE置位后, CPU 要停止两个时钟周期才会运行下一条指令。

· Bit 0 – EERE: EEPROM 读使能
读使能信号 EERE是 EEPROM的写入选通信号。 当 EEPROM地址设置好之后,需置位EERE以便将数据读入EEAR。EEPROM数据的读取只需要一条指令。读取EEPROM时 CPU 要停止 4 个时钟周期然后才能执行下一条指令。

用户在读取EEPROM 时应该检测EEPE。如果一个写操作正在进行,就无法读取EEPROM,也无法改变寄存器EEAR。 经过校准的片内振荡器用于EEPROM定时。

标定的振荡器用于 EEPROM 访问定时。 Table3 为 CPU 访问 EEPROM的典型时间。

下面的代码分别用汇编和C函数说明如何实现EEPROM的写操作。在此假设中断不会在执行这些函数的过程当中发生。例子同时还假设软件没有引导程序。若引导程序存在,则 EEPROM 写函数还需要等待正在进行的 SPM 命令的结束。

汇编代码例程
EEPROM_write:
; 等待上一次写操作结束
sbic EECR,EEPE
rjmp EEPROM_write
; 设置地址寄存器 (r18:r17)
out EEARH, r18
out EEARL, r17
; 将数据写入数据寄存器(r16)
out EEDR,r16
; 置位EEMPE
sbi EECR,EEMPE
; 置位EEPE 以启动写操作
sbi EECR,EEPE
ret
C 代码例程
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* 等待上一次写操作结束 */
while(EECR & (1<;
/* 设置地址和数据寄存器*/
EEAR = uiAddress;
EEDR = ucData;
/* 置位EEMPE */
EECR |= (1</* 置位EEPE 以启动写操作*/
EECR |= (1<

下面的例子说明如何用汇编和C 函数来读取EEPROM,在此假设中断不会在执行这些函数的过程当中发生。

汇编代码例程
EEPROM_read:
; 等待上一次写操作结束
sbic EECR,EEPE
rjmp EEPROM_read
; 设置地址寄存器 (r18:r17)
out EEARH, r18
out EEARL, r17
; 设置EERE 以启动读操作
sbi EECR,EERE
; 自数据寄存器读取数据
in r16,EEDR
ret
C 代码例程
unsigned char EEPROM_read(unsigned int uiAddress)
{
/* 等待上一次写操作结束 */
while(EECR & (1<;
/* 设置地址寄存器*/
EEAR = uiAddress;
/* 设置EERE 以启动读操作*/
EECR |= (1</* 自数据寄存器返回数据 */
return EEDR;


在掉电休眠模式下的EEPROM写操作

若程序执行掉电指令时EEPROM的写操作正在进行,EEPROM的写操作将继续,并在指定的写访问时间之前完成。 但写操作结束后,振荡器还将继续运行,单片机并非处于完全的掉电模式。因此在执行掉电指令之前应结束EEPROM 的写操作。

防止EEPROM 数据丢失

若电源电压过低,CPU 和EEPROM 有可能工作不正常,造成EEPROM 数据的毁坏( 丢失)。这种情况在使用独立的EEPROM 器件时也会遇到。因而需要使用相同的保护方案。

由于电压过低造成EEPROM 数据损坏有两种可能:一是电压低于EEPROM 写操作所需要的最低电压;二是CPU 本身已经无法正常工作。

EEPROM 数据损坏的问题可以通过以下方法解决:
当电压过低时保持AVR RESET信号为低。这可以通过使能芯片的掉电检测电路BOD来实现。如果BOD 电平无法满足要求则可以使用外部复位电路。若写操作过程当中发生了复位,只要电压足够高,写操作仍将正常结束。

推荐阅读

史海拾趣

Acme Electric Corporation公司的发展小趣事

Acme Electric Corporation是一家专注于生产变压器和电源设备的公司。以下是该公司发展的五个相关故事:

  1. 公司成立和初期发展: Acme Electric Corporation成立于1958年,总部位于美国威斯康星州。公司最初是一家小规模的家庭企业,致力于生产各种类型的变压器和电源设备,主要用于工业、商业和农业应用。

  2. 技术创新和产品扩展: 随着市场需求的增长和技术进步,Acme Electric Corporation不断进行技术创新,并扩展了产品线。公司推出了一系列高性能、高效率的变压器和电源设备,包括控制变压器、隔离变压器、电源逆变器等,满足不同客户的需求。

  3. 市场拓展和客户合作: Acme Electric Corporation积极开拓国内外市场,并与各行各业的客户建立了合作关系。公司的产品被广泛应用于制造业、电力行业、建筑业等领域,为客户提供稳定可靠的电源解决方案。同时,Acme Electric Corporation与客户密切合作,根据客户的需求定制产品,提供个性化的服务。

  4. 质量控制和生产管理: Acme Electric Corporation注重产品质量和生产管理,采用先进的生产设备和严格的质量控制体系,确保产品的稳定性和可靠性。公司拥有一支专业的研发团队和生产团队,不断改进工艺流程,提升产品质量和生产效率。

  5. 未来发展展望: Acme Electric Corporation将继续致力于变压器和电源设备领域的研发和生产,不断推出更先进、更可靠的产品和解决方案,以满足客户在各个领域的需求。公司将加强国际市场拓展,提升自身在全球市场的竞争力,为行业的发展做出更大的贡献。

ALLIED [Allied Electronics]公司的发展小趣事

Allied Electronics,总部位于美国德克萨斯州的一家分销公司,专注于为各种行业提供电子元件和电子产品。以下是关于Allied Electronics发展的五个相关故事:

  1. 成立和初期发展: Allied Electronics成立于1928年,最初以销售家庭无线电零件和配件为主要业务。随着无线电和电子行业的发展,公司逐渐扩大了产品范围,开始提供更广泛的电子元件和设备,以满足不断增长的市场需求。

  2. 与RS Components的合并: 2000年,Allied Electronics与英国的RS Components公司合并,成为全球领先的电子元件分销商之一。这一合并加强了两家公司在全球市场的地位,并且拓展了它们的产品线和客户群。

  3. 公司战略调整: 随着数字化技术的快速发展,Allied Electronics逐渐调整了业务战略,加大了对电子元件和器件的供应,并拓展了工业自动化、物联网和电子制造等领域的业务。通过与各种行业的合作伙伴建立紧密的关系,公司不断提升了产品质量和服务水平。

  4. 技术创新和数字化转型: Allied Electronics致力于技术创新和数字化转型,通过建立先进的电子商务平台和在线资源中心,为客户提供更便捷的采购体验。同时,公司还加强了与供应商的合作关系,引入了更多的创新产品,满足不同客户的需求。

  5. 持续发展和全球扩张: 作为全球领先的电子元件分销商之一,Allied Electronics不断加大在全球范围内的市场扩张力度,开设了多个销售办事处和物流中心,以更好地服务于全球客户。同时,公司还积极参与行业展会和活动,加强了与全球电子行业的合作与交流,推动了公司的持续发展和壮大。

Data Translation Inc公司的发展小趣事

Data Translation在追求企业发展的同时,也积极履行社会责任和推动可持续发展。公司关注环境保护和员工福利等方面的问题,通过采用环保材料、节能减排等措施降低生产过程中的环境污染和能源消耗;通过提高员工福利待遇、加强员工培训等方式提升员工的工作满意度和忠诚度。这些举措不仅为公司赢得了良好的社会声誉和形象,也为公司的长期发展奠定了坚实的基础。

请注意,以上故事仅为概述框架,并未详细展开每个故事的具体情节和细节。在实际编写时,你可以根据Data Translation Inc公司的具体发展历程和业务特点进行进一步的补充和完善。

Fluke公司的发展小趣事

Data Translation一直以客户为中心,致力于为客户提供优质的产品和服务。公司不断创新产品设计和制造技术,以满足客户对数据采集和处理性能、稳定性、易用性等方面的需求。同时,公司还建立了完善的客户服务体系,为客户提供从产品咨询、选型、安装、调试到售后维护等全方位的服务。这些举措赢得了客户的广泛赞誉和信任,为公司赢得了更多的市场份额和声誉。

方舟(ARKLED)公司的发展小趣事

方舟公司高度重视产品品质管理,从原材料采购到生产加工,再到成品检验,每一个环节都严格把关。公司引进了先进的生产设备和检测仪器,建立了完善的质量管理体系。通过ISO9001质量管理体系认证,方舟公司的产品质量得到了有效保障,赢得了客户的信赖和支持。

GSN Electronics公司的发展小趣事

在市场竞争日益激烈的今天,方舟公司凭借其卓越的产品质量和完善的售后服务,成功打开了国内外市场。公司积极参与国内外行业展会和交流活动,与众多知名企业建立了战略合作关系。同时,方舟公司还不断拓展海外市场,产品远销欧美、东南亚等地区,赢得了客户的广泛赞誉。

问答坊 | AI 解惑

AD6智能PDF导出时,中文字符无显示

Altium Designer 6 中,制件的原理图文件中若有中文字,用自带的\"智能PDF\"导出时,则在产生的PDF中显示不了中文字符.本人用Altium Designer 6.3~Altium Designer 6.9都试过,均有此问题,不知能否解决,请哪位大侠指点,若不能人为修改,是否要等待A ...…

查看全部问答>

6个变态的C语言Hello World程序

下面的六个程序片段主要完成这些事情: 输出Hello, World混乱C语言的源代码下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C++的编译器g++才能编程通过。 hello1.c 01     #define _________ }   02 ...…

查看全部问答>

谈谈天线锡焊要点

锡焊要点可以简单归纳如下:   1.使用烙铁(包括火烙铁)前,必须使烙铁头表面蒙上一层锡(俗称“吃锡”),这样烙铁头才能拉住锡。上锡的方法是在烙铁未加热前,将烙铁头挫光,除去氧化物或污垢,然后对刮亮后的烙铁头加热,直到光亮部分变成紫 ...…

查看全部问答>

请教Modbus高手makesoft:实现Modbus协议一定需要超时检测吗?

首先声明,我对Modbus不熟悉,尤其是如何实现它,最近才从网上下载了协议研究了一下,特此向高手请教。搞清楚这些问题,才能有效地在芯片中实现相应的功能,满足大家的需要。此帖的目的是继续另一帖的讨论:建议STM32的芯片加上串口超时功能, ...…

查看全部问答>

向高手请教一个关于STM32的PF,PG口的问题

                                 在STM32的DS里面,管脚介绍的表格中Main function(after reset)一栏中,大部分的IO口都是如PA7样式的口 ...…

查看全部问答>

关于正弦余弦函数的问题

我用CCS编程调试时,出现了“error: identifier \\"sinwt\\" is undefined”的错误信息,请请教一下是怎么回事?是不是需要加入某个头文件?还是我的写法有问题啊?谢谢大家~~~…

查看全部问答>

关于CCS在软件延时上的探讨

      在使用CCS的过程中,我发现在有关于有软件延时的程序中会出现问题,感觉延时没起到作用,比如一个简单的例子,让灯闪烁,使用delay函数(函数体内用两个for循环嵌套那种),这种延时就不会有效果,而用i=50000;   while ...…

查看全部问答>

STM32F407学习板全部例程+原理图

全部代码都已测试通过,若发现有什么问题请和我联系。因为时间仓促,基本上都是一些硬件测试程序。记得要把例程和固件库放在同一目录下,全部工程共用一个库的。至于SD卡里的文件只是几个测试图片和音 ...…

查看全部问答>

Kernel - Common Problems Booting Linux中文手册改1

Kernel - Common Problems Booting Linux中文手册改1…

查看全部问答>

EK-LM4F120XL ADC参考电压问题

在EK-LM4F120XL Launchpad中, 我分别用 AIN0(PE3口)采样1.3V电压 AIN1(PE2口)采样0.65V电压, AIN8(PE5口)采样1.95V电压, AIN9(PE4口)采样2.6V电压, 假如以3.0V作为参考电压,那么在数据寄存器中采样结果应该是: 1775,对应1.3V电压 ...…

查看全部问答>