當我們在板級初始化的時候,要初始化eeporm,那麼eeprom裏存放了什麼呢?它和flash有什麼區別呢??
這是我在網上找到的答案:《EEPROM和flash的區別》https://blog.csdn.net/yuanlulu/article/details/6163106
之前對各種存儲器一直不太清楚,今天總結一下。存儲器分爲兩大類:ram和rom。ram就不講了,今天主要討論rom。
ROM和RAM指的都是半導體存儲器,ROM是Read Only Memory的縮寫,RAM是Random Access Memory的縮寫。ROM在系統停止供電的時候仍然可以保持數據,而RAM通常都是在掉電之後就丟失數據,典型的RAM就是計算機的內存。
RAM有兩大類,一種稱爲靜態RAM(Static RAM/SRAM),SRAM速度非常快,是目前讀寫最快的存儲設備了,但是它也非常昂貴,所以只在要求很苛刻的地方使用,譬如CPU的一級緩衝,二級緩衝。另一種稱爲動態RAM(Dynamic RAM/DRAM),DRAM保留數據的時間很短,速度也比SRAM慢,不過它還是比任何的ROM都要快,但從價格上來說DRAM相比SRAM要便宜很多,計算機內存就是DRAM的。
DRAM分爲很多種,常見的主要有FPRAM/FastPage、EDORAM、SDRAM、DDR RAM、RDRAM、SGRAM以及WRAM等,這裏介紹其中的一種DDR RAM。
DDR RAM(Date-Rate RAM)也稱作DDR SDRAM,這種改進型的RAM和SDRAM是基本一樣的,不同之處在於它可以在一個時鐘讀寫兩次數據,這樣就使得數據傳輸速度加倍了。這是目前電腦中用得最多的內存,而且它有着成本優勢,事實上擊敗了Intel的另外一種內存標準-Rambus DRAM。在很多高端的顯卡上,也配備了高速DDR RAM來提高帶寬,這可以大幅度提高3D加速卡的像素渲染能力。
ROM也有很多種,PROM是可編程的ROM,PROM和EPROM(可擦除可編程ROM)兩者區別是,PROM是一次性的,也就是軟件灌入後,就無法修改了,這種是早期的產品,現在已經不可能使用了,而EPROM是通過紫外光的照射擦出原先的程序,是一種通用的存儲器。另外一種EEPROM是通過電子擦出,價格很高,寫入時間很長,寫入很慢。
FLASH存儲器又稱閃存,它結合了ROM和RAM的長處,不僅具備電子可擦除可編程(EEPROM)的性能,還不會斷電丟失數據同時可以快速讀取數據(NVRAM的優勢),U盤和MP3裏用的就是這種存儲器。在過去的20年裏,嵌入式系統一直使用ROM(EPROM)作爲它們的存儲設備,然而近年來Flash全面代替了ROM(EPROM)在嵌入式系統中的地位,用作存儲Bootloader以及操作系統或者程序代碼或者直接當硬盤使用(U盤)。
rom最初不能編程,出廠什麼內容就永遠什麼內容,不靈活。後來出現了prom,可以自己寫入一次,要是寫錯了,只能換一片,自認倒黴。人類文明不斷進步,終於出現了可多次擦除寫入的EPROM,每次擦除要把芯片拿到紫外線上照一下,想一下你往單片機上下了一個程序之後發現有個地方需要加一句話,爲此你要把單片機放紫外燈下照半小時,然後才能再下一次,這麼折騰一天也改不了幾次。歷史的車輪不斷前進,偉大的EEPROM出現了,拯救了一大批程序員,終於可以隨意的修改rom中的內容了。
EEPROM的全稱是“電可擦除可編程只讀存儲器”,即Electrically Erasable Programmable Read-Only Memory。是相對於紫外擦除的rom來講的。但是今天已經存在多種EEPROM的變種,變成了一類存儲器的統稱。
狹義的EEPROM:
這種rom的特點是可以隨機訪問和修改任何一個字節,可以往每個bit中寫入0或者1。這是最傳統的一種EEPROM,掉電後數據不丟失,可以保存100年,可以擦寫100w次。具有較高的可靠性,但是電路複雜/成本也高。因此目前的EEPROM都是幾十千字節到幾百千字節的,絕少有超過512K的。
flash:
flash屬於廣義的EEPROM,因爲它也是電擦除的rom。但是爲了區別於一般的按字節爲單位的擦寫的EEPROM,我們都叫它flash。
flash做的改進就是擦除時不再以字節爲單位,而是以塊爲單位,一次簡化了電路,數據密度更高,降低了成本。上M的rom一般都是flash。
flash分爲nor flash和nand flash。nor flash數據線和地址線分開,可以實現ram一樣的隨機尋址功能,可以讀取任何一個字節。但是擦除仍要按塊來擦。
nand flash同樣是按塊擦除,但是數據線和地址線複用,不能利用地址線隨機尋址。讀取只能按頁來讀取。(nandflash按塊來擦除,按頁來讀,norflash沒有頁)
由於nandflash引腳上覆用,因此讀取速度比nor flash慢一點,但是擦除和寫入速度比nor flash快很多。nand flash內部電路更簡單,因此數據密度大,體積小,成本也低。因此大容量的flash都是nand型的。小容量的2~12M的flash多是nor型的。
使用壽命上,nand flash的擦除次數是nor的數倍。而且nand flash可以標記壞塊,從而使軟件跳過壞塊。nor flash 一旦損壞便無法再用。
因爲nor flash可以進行字節尋址,所以程序可以在nor flash中運行。嵌入式系統多用一個小容量的nor flash存儲引導代碼,用一個大容量的nand flash存放文件系統和內核。
void FLASH_Unlock(FLASH_MemType_TypeDef FLASH_MemType)
{
/* Check parameter */
assert_param(IS_FLASH_MEMORY_TYPE(FLASH_MemType));
/* Unlock program memory */
if(FLASH_MemType == FLASH_MemType_Program)
{
FLASH->PUKR = FLASH_RASS_KEY1;
FLASH->PUKR = FLASH_RASS_KEY2;
}
位7:4 | 保留,必須爲0 |
位3 |
EEPM:Flash程序和數據EEPROM IDDQ模式選擇在運行期間,低功耗運行、低功率等模式 0:EEPM在一個Flash程序或數據EEPROM存儲器之後被硬件清除訪問。通過軟件清除這一點不會從IDDQ模式中退出內存。 1:當代碼從RAM中執行時,EEPM位force程序的設置數據EEPROM進入IDDQ模式。 當代碼從程序Flash中執行時,這個位不能被設置。Flash程序和數據EEPROM保持在IDDQ模式下直到下一個Flash程序或數據EEPROM作爲訪問。參考第81頁的低功率運行模式。 |
位2 |
WAITM等待模式:Flash程序和數據EEPROM IDDQ模式在等待模式下這部分是由軟件設置和清除的。 0:當設備處於等待模式時,Flash程序和數據EEPROM不在IDDQ模式下 1:當設備處於等待模式時,在IDDQ模式下的Flash程序和數據EEPROM。 |
位1 |
IE:Flash中斷啓用這部分是由軟件設置和清除的 0:中斷禁用 1:啓用中斷。如果EOP或wrpgdis標誌在 |
位0 |
FIX:固定字節編程時間這部分是由軟件設置和清除的。 0:如果內存已經被擦除和tprog,標準的編程時間(1/2 tprog) 1:在tprog中固定的編程時間。 |
位7 |
OPT:寫選項字節,這部分是由軟件設置和清除的。 0:對禁用選項的寫入權限 1:啓用啓用選項字節的訪問 |
位6 |
第6位WPRG:文字編程這個位是由軟件設置的,當操作完成時由硬件清除。 0:程序操作禁用 1:啓用Word程序操作 |
位5 |
ERASE:塊擦除這個位是由軟件設置的,當操作完成時由硬件清除。 0:塊清除操作禁用 1:啓用塊擦除操作 |
位4 |
FPRG:快速塊編程這個位是由軟件設置的,當操作完成時由硬件清除。 0:快速塊程序操作禁用 1:啓用快速塊程序操作 |
位3:1 |
保留 |
位0 | PRG,標準塊編程,這個位是由軟件設置的,當操作完成時由硬件清除。 |
位7:0 DUK 7:0:數據EEPROM寫解鎖鍵 這個字節是由軟件(所有模式)編寫的。它在讀取時返回0x00。
位7 | 保留 |
位6 |
HVOFF:高電壓標誌的結束,這部分是由硬件設置和清除的。 0:HV,開始實際的編程 1:HV OFF,高電壓結束 |
位5:4 | 保留 |
位3 |
DUL:數據EEPROM區域無鎖標誌,這個比特是由硬件設置的,通過編程將其編程爲0。 0:數據EEPROM區域寫入保護 1:數據EEPROM區域寫保護已被寫入正確的質量鍵 |
位2 |
EOP:編程結束(寫或擦操作)標誌這部分是由硬件設置的。它通過讀取寄存器或新版本的軟件來清除。 寫/擦除操作開始。 0:沒有發生EOP事件 1:發生了EOP操作。如果IE位被設置爲in,則會產生中斷 FLASH_CR1登記。 |
位1 |
PUL:Flash程序內存解鎖標誌這個比特是由硬件設置的,通過編程將其編程爲0。 0:啓用主程序區域的保護 1:編寫正確的質量,使主程序區域的保護失效。 鑰匙。 |
位0 |
wrpgdis:嘗試保護頁面標記,這個比特是由硬件設置的,通過讀取寄存器來清除軟件。 0:沒有wrpgdis事件發生 1:發生寫保護頁面的嘗試。如果IE比特出現了中斷 設置在flashcr1寄存器中。 |
Flash register map and reset values
Flash寄存器映射和重置值
FlagStatus FLASH_GetFlagStatus(FLASH_FLAG_TypeDef FLASH_FLAG)
{
FlagStatus status = RESET;
assert_param(IS_FLASH_FLAGS(FLASH_FLAG));
/* Check the status of the specified flash flag*/
if((FLASH->IAPSR & (uint8_t)FLASH_FLAG) != (uint8_t)RESET)
{
status = SET; /* Flash_FLAG is set*/
}
else
{
status = RESET; /* Flash_FLAG is reset*/
}
/* Return the Flash_FLAG status*/
return status;
}