AVR内部EEPROM使用.docVIP

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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)

185****7617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档