您的位置 首页 国产IC

AVR单片机内部EEPROM详解

AVR单片机内部EEPROM详解使用EEPROM倒是挺简单的,无非是读和写操作,首先需要判断是否在读写中,判断读写忙标志,然后要保证读写时不能

AVR单片机内部EEPROM详解

运用EEPROM却是挺简略的,无非是读和写操作,首要需求判别是否在读写中,判别读写忙标志,然后要确保读写时不能被打断即要关中止,接着要写入到写数据的地址,接着写数据,再将地址和数据操控方位位下,数据就写进了,最终别忘了开中止。读数据时,只需写入地址,然后将读操控方位位,再从寄存器EEDR中读出数据即可。

以上用法是简略用法,当然这种用法不能用在实践工程运用中的,由于写数据需求8ms的时刻,体系当然不允许一向等候这8ms的,在本文下面介绍了一种比较好的方法,来组织体系作业的时刻。当然条件是要了解清楚最简略的作业形式。

一、简略的作业形式

void EEPROM_write(unsigned int uiAddress,unsigned char ucData)
{
while(EECR&(1< //判别读写忙标志

CLI();
EEAR = uiAddress; //写入地址
EEDR = ucData; //送入数据
EECR |=(1< //地址和写操控位锁存,即可
EECR |=(1<

SEI();
}

unsigned char EEPROM_read(unsigned int uiAddress)
{
while(EECR&(1< //判别读写忙标志

CLI();
EEAR = uiAddress; //送入地址
EECR |=(1< //读方位位

SEI();
return EEDR;//回来数据
}

读和写的操作如下面所示 读写数据时要从0x01开端 ,00地址有bug(数据手册上讲的)

temp=EEPROM_read(0x01);
EEPROM_write(0x01,temp);

二、提高篇-运用缓冲组织的操作

思路是这样的:首要树立读写缓冲区,把需求写的数据放入到写缓冲区中,由于在AVR单片机中,写一个数据时比较慢的大概要8ms吧,这么长的时刻必定不能一向while等下去,因而咱们用中止在处理,等单片机EEPROM程序写好了就有ready中止,这时就能读写操作了,写的时分从写缓冲区中取出数据,写的时分要注意不允许读,通过一段时刻后就完成了,并且咱们发现写的时分仅仅把数据送入到单片机中的一个寄存器中,至于EEPROM什么时分来读这个寄存器直至写完,咱们也没有必要管他,由于他操作好了会中止告知咱们,从而这8ms还可以用来履行其它的程序了,就这样直到一切的数据都写完了。

#pragma interrupt_handler vIvEeReady:iv_EE_READY
void vIvEeReady(void)
{
if(!fgEepromBufEmpty()) //缓冲区数据还没彻底写到EPPROM中
{
CLI(); //写的时分不期望有其他中止
EEAR = _sEepromBuf[_bEepromBufRdPtr].wAddress;
EEDR = _sEepromBuf[_bEepromBufRdPtr].bVal; //数据写入
EECR |= BIT(EEMWE);
EECR |= BIT(EEWE);
SEI(); //写好这个就翻开,尽可能满意实时性
_bEepromBufRdPtr++; //指向下一个缓冲数据
if(_bEepromBufRdPtr >= EEPROM_WRITE_BUF_SIZE) //到了缓冲区顶了
{
_bEepromBufRdPtr = 0; //从头部开端计数
}
_bEepromBufNs–; //当时还没有写入EEPROM的数
}
else
{
EECR &= ~BIT(EERIE); //都写好了就把中止封闭掉
}
}

uchar bWriteData2Eeprom(uint wAddress, uchar bVal)
{
if(fgEepromBufFull()) //是否到达缓冲界说的最大值
{
return RET_BUSY;
}

CLI(); //关中止?这儿应该放在中止函数里边的
_sEepromBuf[_bEepromBufWrPtr].wAddress = wAddress;
_sEepromBuf[_bEepromBufWrPtr].bVal = bVal;
_bEepromBufWrPtr++;
if(_bEepromBufWrPtr >= EEPROM_WRITE_BUF_SIZE) //写满了就从头开端写
{ //需求确保数据不丢掉
_bEepromBufWrPtr = 0;
}
_bEepromBufNs++; //写一个计数就加一下
EECR |= BIT(EERIE); //写一个数据后这儿翻开了中止
SEI();

return RET_SUCCESS;
}

// Notice! The programer must ensure the EEPROM is NOT in writing state.
uchar bReadDataFromEeprom(uint wAddress, uchar *pbVal)
{
if(EECR & BIT(EEWE)) //没有在写时才干读取,一般放在程序开端时
{
return RET_BUSY;
}

EEAR = wAddress; //送入地址
EECR |= BIT(EERE); //读锁存
*pbVal = EEDR; //取出数据
return RET_SUCCESS; //读取成功
}

BYTE bGetEepromWrBuf(void)
{
return _bEepromBufNs; //读取当时剩下的没写入的数据
}

void bClrEepromBuf(void)
{
CLI();
_bEepromBufNs = 0;
_bEepromBufRdPtr = _bEepromBufWrPtr;
EECR &= ~BIT(EERIE);
SEI();
}

BOOL fgEepromWizard(void)
{
BOOL fgRet = FALSE;

return fgRet;
}

void vInitEeprom(void)
{
EECR = 0x00; //EEPROM操控寄存器清零
_bEepromBufWrPtr = 0; //读写指针和数据计数清零
_bEepromBufRdPtr = 0;
_bEepromBufNs = 0;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/259914.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部