- 1、本文档共15页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
AVR單片機內部EEPROM詳解使用EEPROM倒是挺簡單的,無非是讀和寫操作,首先需要判斷是否在讀寫中,判斷讀寫忙標志,然後要保證讀寫時不能被打斷即要關中斷,接著要寫入到寫數據的地址,接著寫數據,再將地址和數據控制位置位下,數據就寫進了,最後別忘了開中斷。讀數據時,只要寫入地址,然後將讀控制位置位,再從寄存器EEDR中讀出數據即可。
?
? ? 以上用法是簡單用法,當然這種用法不能用在實際工程應用中的,因爲寫數據需要8ms的時間,系統當然不允許一直等待這8ms的,在本文下面介紹了一種比較好的方式,來安排系統工作的時間。當然前提是要理解清楚最簡單的工作模式。
?
一、簡單的工作模式
?
void EEPROM_write(unsigned int uiAddress,unsigned char ucData)
{
?while(EECR(1EEWE)); ? ?//判斷讀寫忙標志
?
?CLI();
?EEAR = uiAddress; ? ? ?//寫入地址
?EEDR = ucData; ? ? ? ? //送入數據
?EECR |=(1EEMWE); ? ? //地址和寫控制位鎖存,即可
?EECR |=(1EEWE);
?
SEI();
}
?
unsigned char EEPROM_read(unsigned int uiAddress)
{
?while(EECR(1EEWE)); ? //判斷讀寫忙標志
?
?CLI();
?EEAR = uiAddress; ? ? ? //送入地址
?EECR |=(1EERE); ? ? ? //讀位置位
?
?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(); ? ? ? ? ? ?
文档评论(0)