欢迎来到天天文库
浏览记录
ID:40524724
大小:84.00 KB
页数:15页
时间:2019-08-04
《AVR内部EEPROM使用》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、AVR單片機內部EEPROM詳解使用EEPROM倒是挺簡單的,無非是讀和寫操作,首先需要判斷是否在讀寫中,判斷讀寫忙標志,然後要保證讀寫時不能被打斷即要關中斷,接著要寫入到寫數據的地址,接著寫數據,再將地址和數據控制位置位下,數據就寫進了,最後別忘了開中斷。讀數據時,只要寫入地址,然後將讀控制位置位,再從寄存器EEDR中讀出數據即可。 以上用法是簡單用法,當然這種用法不能用在實際工程應用中的,因爲寫數據需要8ms的時間,系統當然不允許一直等待這8ms的,在本文下面介紹了一種比較好的方式,來安排系統工作的時間。當然前提是要
2、理解清楚最簡單的工作模式。 一、簡單的工作模式 voidEEPROM_write(unsignedintuiAddress,unsignedcharucData){ while(EECR&(1<3、=(1<4、=(1<5、ntuiAddress){ while(EECR&(1<6、=(1<7、寫緩衝區,把需要寫的數據放入到寫緩衝區中,由于在AVR單片機中,寫一個數據時比較慢的大概要8ms吧,這麽長的時間肯定不能一直while等下去,因此我們用中斷在處理,等單片機EEPROM程序寫好了就有ready中斷,這時就能讀寫操作了,寫的時候從寫緩衝區中取出數據,寫的時候要注意不允許讀,經過一段時間後就完成了,而且我們發現寫的時候只是把數據送入到單片機中的一個寄存器中,至于EEPROM什麽時候來讀這個寄存器直至寫完,我們也沒有必要管他,因爲他操作好了會中斷告訴我們,從而這8ms還可以用來執行其它的程序了,就這樣直到所有的數8、據都寫完了。 #pragmainterrupt_handlervIvEeReady:iv_EE_READYvoidvIvEeReady(void){ if(!fgEepromBufEmpty())//緩衝區數據還沒完全寫到EPPROM中 { CLI(); //寫的時候不希望有別的中斷 EEAR=_sEepromBuf[_bEepromBufRdPtr].wAddress; EEDR=_sEepromBuf[_bEepromBufRdPtr].bVal; //數據寫入 EECR9、=BIT(EEMW10、E); EECR11、=BIT(EEWE); SEI(); //寫好這個就打開,盡可能滿足實時性 _bEepromBufRdPtr++; //指向下一個緩衝數據 if(_bEepromBufRdPtr>=EEPROM_WRITE_BUF_SIZE)//到了緩衝區頂了 { _bEepromBufRdPtr=0;//從頭部開始計數 } _bEepromBufNs--; //當前還沒有寫入EEPROM的數 } else { EECR&=~BIT(EERI12、E); //都寫好了就把中斷關閉掉 }} ucharbWriteData2Eeprom(uintwAddress,ucharbVal){ if(fgEepromBufFull()) //是否達到緩衝定義的最大值 { returnRET_BUSY; } CLI(); //關中斷?這裏應該放在中斷函數裏面的 _sEepromBuf[_bEepromBufWrPtr].wAddress=wAddress; _sEepromBuf[_bEepromBufWrPtr].13、bVal=bVal; _bEepromBufWrPtr++; if(_bEepromBufWrPtr>=EEPROM_WRITE_BUF_SIZE)//寫滿了就從頭開始寫 { //需要保證數據不丟失 _bEepromBufWrPtr=0
3、=(1<4、=(1<5、ntuiAddress){ while(EECR&(1<6、=(1<7、寫緩衝區,把需要寫的數據放入到寫緩衝區中,由于在AVR單片機中,寫一個數據時比較慢的大概要8ms吧,這麽長的時間肯定不能一直while等下去,因此我們用中斷在處理,等單片機EEPROM程序寫好了就有ready中斷,這時就能讀寫操作了,寫的時候從寫緩衝區中取出數據,寫的時候要注意不允許讀,經過一段時間後就完成了,而且我們發現寫的時候只是把數據送入到單片機中的一個寄存器中,至于EEPROM什麽時候來讀這個寄存器直至寫完,我們也沒有必要管他,因爲他操作好了會中斷告訴我們,從而這8ms還可以用來執行其它的程序了,就這樣直到所有的數8、據都寫完了。 #pragmainterrupt_handlervIvEeReady:iv_EE_READYvoidvIvEeReady(void){ if(!fgEepromBufEmpty())//緩衝區數據還沒完全寫到EPPROM中 { CLI(); //寫的時候不希望有別的中斷 EEAR=_sEepromBuf[_bEepromBufRdPtr].wAddress; EEDR=_sEepromBuf[_bEepromBufRdPtr].bVal; //數據寫入 EECR9、=BIT(EEMW10、E); EECR11、=BIT(EEWE); SEI(); //寫好這個就打開,盡可能滿足實時性 _bEepromBufRdPtr++; //指向下一個緩衝數據 if(_bEepromBufRdPtr>=EEPROM_WRITE_BUF_SIZE)//到了緩衝區頂了 { _bEepromBufRdPtr=0;//從頭部開始計數 } _bEepromBufNs--; //當前還沒有寫入EEPROM的數 } else { EECR&=~BIT(EERI12、E); //都寫好了就把中斷關閉掉 }} ucharbWriteData2Eeprom(uintwAddress,ucharbVal){ if(fgEepromBufFull()) //是否達到緩衝定義的最大值 { returnRET_BUSY; } CLI(); //關中斷?這裏應該放在中斷函數裏面的 _sEepromBuf[_bEepromBufWrPtr].wAddress=wAddress; _sEepromBuf[_bEepromBufWrPtr].13、bVal=bVal; _bEepromBufWrPtr++; if(_bEepromBufWrPtr>=EEPROM_WRITE_BUF_SIZE)//寫滿了就從頭開始寫 { //需要保證數據不丟失 _bEepromBufWrPtr=0
4、=(1<5、ntuiAddress){ while(EECR&(1<6、=(1<7、寫緩衝區,把需要寫的數據放入到寫緩衝區中,由于在AVR單片機中,寫一個數據時比較慢的大概要8ms吧,這麽長的時間肯定不能一直while等下去,因此我們用中斷在處理,等單片機EEPROM程序寫好了就有ready中斷,這時就能讀寫操作了,寫的時候從寫緩衝區中取出數據,寫的時候要注意不允許讀,經過一段時間後就完成了,而且我們發現寫的時候只是把數據送入到單片機中的一個寄存器中,至于EEPROM什麽時候來讀這個寄存器直至寫完,我們也沒有必要管他,因爲他操作好了會中斷告訴我們,從而這8ms還可以用來執行其它的程序了,就這樣直到所有的數8、據都寫完了。 #pragmainterrupt_handlervIvEeReady:iv_EE_READYvoidvIvEeReady(void){ if(!fgEepromBufEmpty())//緩衝區數據還沒完全寫到EPPROM中 { CLI(); //寫的時候不希望有別的中斷 EEAR=_sEepromBuf[_bEepromBufRdPtr].wAddress; EEDR=_sEepromBuf[_bEepromBufRdPtr].bVal; //數據寫入 EECR9、=BIT(EEMW10、E); EECR11、=BIT(EEWE); SEI(); //寫好這個就打開,盡可能滿足實時性 _bEepromBufRdPtr++; //指向下一個緩衝數據 if(_bEepromBufRdPtr>=EEPROM_WRITE_BUF_SIZE)//到了緩衝區頂了 { _bEepromBufRdPtr=0;//從頭部開始計數 } _bEepromBufNs--; //當前還沒有寫入EEPROM的數 } else { EECR&=~BIT(EERI12、E); //都寫好了就把中斷關閉掉 }} ucharbWriteData2Eeprom(uintwAddress,ucharbVal){ if(fgEepromBufFull()) //是否達到緩衝定義的最大值 { returnRET_BUSY; } CLI(); //關中斷?這裏應該放在中斷函數裏面的 _sEepromBuf[_bEepromBufWrPtr].wAddress=wAddress; _sEepromBuf[_bEepromBufWrPtr].13、bVal=bVal; _bEepromBufWrPtr++; if(_bEepromBufWrPtr>=EEPROM_WRITE_BUF_SIZE)//寫滿了就從頭開始寫 { //需要保證數據不丟失 _bEepromBufWrPtr=0
5、ntuiAddress){ while(EECR&(1<6、=(1<7、寫緩衝區,把需要寫的數據放入到寫緩衝區中,由于在AVR單片機中,寫一個數據時比較慢的大概要8ms吧,這麽長的時間肯定不能一直while等下去,因此我們用中斷在處理,等單片機EEPROM程序寫好了就有ready中斷,這時就能讀寫操作了,寫的時候從寫緩衝區中取出數據,寫的時候要注意不允許讀,經過一段時間後就完成了,而且我們發現寫的時候只是把數據送入到單片機中的一個寄存器中,至于EEPROM什麽時候來讀這個寄存器直至寫完,我們也沒有必要管他,因爲他操作好了會中斷告訴我們,從而這8ms還可以用來執行其它的程序了,就這樣直到所有的數8、據都寫完了。 #pragmainterrupt_handlervIvEeReady:iv_EE_READYvoidvIvEeReady(void){ if(!fgEepromBufEmpty())//緩衝區數據還沒完全寫到EPPROM中 { CLI(); //寫的時候不希望有別的中斷 EEAR=_sEepromBuf[_bEepromBufRdPtr].wAddress; EEDR=_sEepromBuf[_bEepromBufRdPtr].bVal; //數據寫入 EECR9、=BIT(EEMW10、E); EECR11、=BIT(EEWE); SEI(); //寫好這個就打開,盡可能滿足實時性 _bEepromBufRdPtr++; //指向下一個緩衝數據 if(_bEepromBufRdPtr>=EEPROM_WRITE_BUF_SIZE)//到了緩衝區頂了 { _bEepromBufRdPtr=0;//從頭部開始計數 } _bEepromBufNs--; //當前還沒有寫入EEPROM的數 } else { EECR&=~BIT(EERI12、E); //都寫好了就把中斷關閉掉 }} ucharbWriteData2Eeprom(uintwAddress,ucharbVal){ if(fgEepromBufFull()) //是否達到緩衝定義的最大值 { returnRET_BUSY; } CLI(); //關中斷?這裏應該放在中斷函數裏面的 _sEepromBuf[_bEepromBufWrPtr].wAddress=wAddress; _sEepromBuf[_bEepromBufWrPtr].13、bVal=bVal; _bEepromBufWrPtr++; if(_bEepromBufWrPtr>=EEPROM_WRITE_BUF_SIZE)//寫滿了就從頭開始寫 { //需要保證數據不丟失 _bEepromBufWrPtr=0
6、=(1<7、寫緩衝區,把需要寫的數據放入到寫緩衝區中,由于在AVR單片機中,寫一個數據時比較慢的大概要8ms吧,這麽長的時間肯定不能一直while等下去,因此我們用中斷在處理,等單片機EEPROM程序寫好了就有ready中斷,這時就能讀寫操作了,寫的時候從寫緩衝區中取出數據,寫的時候要注意不允許讀,經過一段時間後就完成了,而且我們發現寫的時候只是把數據送入到單片機中的一個寄存器中,至于EEPROM什麽時候來讀這個寄存器直至寫完,我們也沒有必要管他,因爲他操作好了會中斷告訴我們,從而這8ms還可以用來執行其它的程序了,就這樣直到所有的數8、據都寫完了。 #pragmainterrupt_handlervIvEeReady:iv_EE_READYvoidvIvEeReady(void){ if(!fgEepromBufEmpty())//緩衝區數據還沒完全寫到EPPROM中 { CLI(); //寫的時候不希望有別的中斷 EEAR=_sEepromBuf[_bEepromBufRdPtr].wAddress; EEDR=_sEepromBuf[_bEepromBufRdPtr].bVal; //數據寫入 EECR9、=BIT(EEMW10、E); EECR11、=BIT(EEWE); SEI(); //寫好這個就打開,盡可能滿足實時性 _bEepromBufRdPtr++; //指向下一個緩衝數據 if(_bEepromBufRdPtr>=EEPROM_WRITE_BUF_SIZE)//到了緩衝區頂了 { _bEepromBufRdPtr=0;//從頭部開始計數 } _bEepromBufNs--; //當前還沒有寫入EEPROM的數 } else { EECR&=~BIT(EERI12、E); //都寫好了就把中斷關閉掉 }} ucharbWriteData2Eeprom(uintwAddress,ucharbVal){ if(fgEepromBufFull()) //是否達到緩衝定義的最大值 { returnRET_BUSY; } CLI(); //關中斷?這裏應該放在中斷函數裏面的 _sEepromBuf[_bEepromBufWrPtr].wAddress=wAddress; _sEepromBuf[_bEepromBufWrPtr].13、bVal=bVal; _bEepromBufWrPtr++; if(_bEepromBufWrPtr>=EEPROM_WRITE_BUF_SIZE)//寫滿了就從頭開始寫 { //需要保證數據不丟失 _bEepromBufWrPtr=0
7、寫緩衝區,把需要寫的數據放入到寫緩衝區中,由于在AVR單片機中,寫一個數據時比較慢的大概要8ms吧,這麽長的時間肯定不能一直while等下去,因此我們用中斷在處理,等單片機EEPROM程序寫好了就有ready中斷,這時就能讀寫操作了,寫的時候從寫緩衝區中取出數據,寫的時候要注意不允許讀,經過一段時間後就完成了,而且我們發現寫的時候只是把數據送入到單片機中的一個寄存器中,至于EEPROM什麽時候來讀這個寄存器直至寫完,我們也沒有必要管他,因爲他操作好了會中斷告訴我們,從而這8ms還可以用來執行其它的程序了,就這樣直到所有的數
8、據都寫完了。 #pragmainterrupt_handlervIvEeReady:iv_EE_READYvoidvIvEeReady(void){ if(!fgEepromBufEmpty())//緩衝區數據還沒完全寫到EPPROM中 { CLI(); //寫的時候不希望有別的中斷 EEAR=_sEepromBuf[_bEepromBufRdPtr].wAddress; EEDR=_sEepromBuf[_bEepromBufRdPtr].bVal; //數據寫入 EECR
9、=BIT(EEMW
10、E); EECR
11、=BIT(EEWE); SEI(); //寫好這個就打開,盡可能滿足實時性 _bEepromBufRdPtr++; //指向下一個緩衝數據 if(_bEepromBufRdPtr>=EEPROM_WRITE_BUF_SIZE)//到了緩衝區頂了 { _bEepromBufRdPtr=0;//從頭部開始計數 } _bEepromBufNs--; //當前還沒有寫入EEPROM的數 } else { EECR&=~BIT(EERI
12、E); //都寫好了就把中斷關閉掉 }} ucharbWriteData2Eeprom(uintwAddress,ucharbVal){ if(fgEepromBufFull()) //是否達到緩衝定義的最大值 { returnRET_BUSY; } CLI(); //關中斷?這裏應該放在中斷函數裏面的 _sEepromBuf[_bEepromBufWrPtr].wAddress=wAddress; _sEepromBuf[_bEepromBufWrPtr].
13、bVal=bVal; _bEepromBufWrPtr++; if(_bEepromBufWrPtr>=EEPROM_WRITE_BUF_SIZE)//寫滿了就從頭開始寫 { //需要保證數據不丟失 _bEepromBufWrPtr=0
此文档下载收益归作者所有