找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2985|回復: 21
打印 上一主題 下一主題
收起左側(cè)

現(xiàn)在的很多單片機都有內(nèi)置的EEPROM為什么還是有很多人使用外接的呢?

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:978375 發(fā)表于 2022-11-25 13:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有什么優(yōu)勢嗎?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:675287 發(fā)表于 2022-11-25 15:26 | 只看該作者
內(nèi)置的好像是FLASH,不能像外置EEPROM那樣一個字節(jié)的讀寫,只能按塊或扇區(qū)操作,寫之前要先擦除塊或扇區(qū),才能寫入
回復

使用道具 舉報

板凳
ID:978375 發(fā)表于 2022-11-25 15:46 | 只看該作者
zh_junwei 發(fā)表于 2022-11-25 15:26
內(nèi)置的好像是FLASH,不能像外置EEPROM那樣一個字節(jié)的讀寫,只能按塊或扇區(qū)操作,寫之前要先擦除塊或扇區(qū),才 ...

剛剛了解到很多單片機內(nèi)置EEPROM是用FLASH模擬的,可能穩(wěn)定性不如硬件的
回復

使用道具 舉報

地板
ID:1043747 發(fā)表于 2022-11-25 17:31 來自觸屏版 | 只看該作者
內(nèi)置的擦寫壽命短
回復

使用道具 舉報

5#
ID:401564 發(fā)表于 2022-11-25 20:31 | 只看該作者
單片機內(nèi)部的EEPROM是FLASH的,只能塊寫入,一般有EEPROM存儲數(shù)據(jù)不會每次都存上一個塊的,有時候是單獨改一個地址的數(shù)據(jù)而已,FLASH不能像24C01那樣操作的
回復

使用道具 舉報

6#
ID:419909 發(fā)表于 2022-11-25 21:52 | 只看該作者
應該是不習慣吧。個人覺得內(nèi)置的EEPROM方便使用。雖然是塊操作,但是需要保存的數(shù)據(jù)一般也不多。存在一個數(shù)組里,每次全部重寫一次就可以了。擦寫壽命這個,官方說明里好像也挺多的。又不是每時每刻要更新。
回復

使用道具 舉報

7#
ID:101869 發(fā)表于 2022-11-26 10:11 | 只看該作者
內(nèi)置EEPROM最大缺點就是存一個數(shù)據(jù)就要整頁擦除,比如你這一頁有200個數(shù)據(jù),修改任何一個數(shù)據(jù)就要先把這200個保存到緩存,然后擦除,然后再把這200個數(shù)據(jù)寫入.
回復

使用道具 舉報

8#
ID:997026 發(fā)表于 2022-11-26 10:35 來自觸屏版 | 只看該作者
好多人說單片機內(nèi)置eeprom是flash的完全是誤導,估計都是只用過stc的,用內(nèi)部flash模擬eeprom大多是國產(chǎn)廠商的做法,因為便宜,我用過microchip的,人家就是真正的eeprom,按字節(jié)寫入,不需要擦除,小一些的都沒有頁的概念,直接按地址寫
回復

使用道具 舉報

9#
ID:963918 發(fā)表于 2022-11-26 12:21 | 只看該作者
看內(nèi)置EEPROM是不是真正的EEPROM,如果是FLASH模擬的,就要慎用,在某些時候擦寫會影響到主程序區(qū)。
回復

使用道具 舉報

10#
ID:401564 發(fā)表于 2022-11-26 12:30 | 只看該作者
hxdby 發(fā)表于 2022-11-26 10:35
好多人說單片機內(nèi)置eeprom是flash的完全是誤導,估計都是只用過stc的,用內(nèi)部flash模擬eeprom大多是國產(chǎn)廠 ...

但PIC單片機一樣的,有很多電路要外置EEPROM
因為,PIC單片機的EEPROM內(nèi)存沒幾個是超過1K,有的型號甚至只有256B
回復

使用道具 舉報

11#
ID:996773 發(fā)表于 2022-11-26 14:58 | 只看該作者
看使用情況,我是做收音機程序的,寫入數(shù)據(jù)次數(shù)一天內(nèi)也只有幾次,按字節(jié)寫24c02,畢竟多一個元件浪費,后來才用內(nèi)部eeprom,因為只改動幾個字節(jié)的數(shù)據(jù),eeprom只能整個扇區(qū)寫,我是先把整個扇區(qū)全讀到單片機擴展內(nèi)存,改動幾個字節(jié)后再一下子全寫入eeprom,很方便,程序也不復雜,多幾條讀出寫入指令,很穩(wěn)定,不要聽別人亂講啥的不穩(wěn)定,但那種一秒鐘就要寫一次的甚至幾十次的還是用外置的片子,內(nèi)置模擬eeprom肯定扛不住幾天十多萬次的讀寫
回復

使用道具 舉報

12#
ID:624769 發(fā)表于 2022-11-26 16:19 | 只看該作者
如果標題是: "論壇里有沒有人在做項目時,明明單片機內(nèi)部有Eeprom, 但是還外接Eeprom, 請問基于什么原因你還要外接Eeprom"
可能,我會舉幾個實際例子,再說一下理由。

偏偏來個“很多人”,最討厭猜別人的心思。尤其是猜對了沒獎,猜錯了還有噴子。鬼知道“很多人”為什么要外接?有人不會用內(nèi)部的,有人為了打一塊學習板,有人為了堆料。誰知道?
大多數(shù)單片機,內(nèi)部的Eeprom 也是可以單字節(jié)讀寫,并且不需要擦除可以直接修改的,和國內(nèi)國外沒有關系。
無非論壇里提問題的人多是不說單片機型號,而大部分問問題的人又是用的STC, 才會有了不少人回答問題先入為主用 STC來舉例子。這不是作為認為別人只用過STC的理由或者依據(jù),更不能自己除了 STC沒用過或者學過其他國內(nèi)的單片機,或者只了解了幾款國內(nèi)的單片機和幾款國外的單片機,就片面以為 STC 能代表 “大多數(shù)國內(nèi)”的單片機,就片面的認為,國產(chǎn)的單片機才會用 flash 模擬 Eeprom.
撇開成本不談,在都是片內(nèi)“Eeprom” 的前提下,flash 模擬 Eeprom 是有優(yōu)勢的,除了擦除比較麻煩,讀/寫 上,flash 模擬的 Eeprom 遠比真實Eeprom要快,尤其是讀上面,所以,對于頻繁讀取,偶爾寫入,這樣的需求,懂得人,會優(yōu)先選擇flash 模擬 的Eeprom 而不是真實的"Eeprom"。
正因為有不同的需求,會有不同的選擇,所以有不少的單片機,也會同時提供 片內(nèi) 真實Eeprom 的讀寫,以及片內(nèi)Flash 的讀寫的 兩種方式,讓程序員按需使用。

撇開實際應用的需要,以偏蓋面的下結(jié)論毫無意義。


回復

使用道具 舉報

13#
ID:584814 發(fā)表于 2022-11-26 18:48 | 只看該作者
使用習慣且外置的價格可以忽略。
回復

使用道具 舉報

14#
ID:401564 發(fā)表于 2022-11-27 12:15 | 只看該作者
188610329 發(fā)表于 2022-11-26 16:19
如果標題是: "論壇里有沒有人在做項目時,明明單片機內(nèi)部有Eeprom, 但是還外接Eeprom, 請問基于什么原因你 ...

如果不算成本
對于頻繁讀寫,真正的應該選外部鐵電EEPROM
鐵電近乎完美,因為不用等待寫入,整體讀寫速度還是很快的
回復

使用道具 舉報

15#
ID:308903 發(fā)表于 2022-11-28 08:13 | 只看該作者
能不能延伸討論下,外置咋用
回復

使用道具 舉報

16#
ID:420836 發(fā)表于 2022-11-28 08:55 | 只看該作者
單片機內(nèi)置的EEPROM體積不夠大,設計者習慣于外加EEPROM來擴展存儲空間。
回復

使用道具 舉報

17#
ID:958310 發(fā)表于 2022-11-28 09:07 | 只看該作者
片外eeprom是獨立于單片機的,如果軟件要升級把單片機的flash擦了后升級就會把保存的數(shù)據(jù)清除了。但是獨立的eeprom就不會。
回復

使用道具 舉報

18#
ID:1054345 發(fā)表于 2022-11-28 11:29 | 只看該作者
他們最大差異就是:FLASH按塊/扇區(qū)進行讀寫操作,EEPROM支持按字節(jié)讀寫操作。    其次,容量大小不同:FLASH容量可以做到很大,但EEPROM容量一般都很小。    再次,就是它們的應用場景不同:EERPOM存儲零散小容量數(shù)據(jù),比如:標志位、一組數(shù)據(jù)等。FLASH存儲大容量數(shù)據(jù),比如:程序代碼、圖片信息等。    再次,內(nèi)部結(jié)構(gòu)不同,F(xiàn)lash結(jié)構(gòu)更簡單,成本更低,類似前面和大家分享的《單片機中RAM少的原因》。    當然,還有很多其他區(qū)別,但隨著技術的提升,它們二者已經(jīng)很接近了。以前它們不能滿足的功能,現(xiàn)在基本都能滿足了。
回復

使用道具 舉報

19#
ID:1054345 發(fā)表于 2022-11-28 11:36 | 只看該作者
#include "stm32f10x.h"  
#include "string.h"
#include "stdio.h"  
void delay(void);  
void GPIO_Configuration(void);
void uart_init();
extern void USART_OUT(USART_TypeDef* USARTx, uint16_t *Data,...);
void RCC_Configuration(void)  
{  
SystemInit();   
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|
RCC_APB2Periph_GPIOA|
RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOD |
RCC_APB2Periph_AFIO|  
RCC_APB2Periph_GPIOC,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
}
void NVIC_Configuration(void)  
{  

  NVIC_InitTypeDef NVIC_InitStructure;   
  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);      
   
  


  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn|USART2_IRQn;  
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);  


}  




void UART_PutChar(USART_TypeDef* USARTx, uint8_t Data)  
{  
    USART_SendData(USARTx, Data);  
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET){}  
}  
void UART_PutStr (USART_TypeDef* USARTx, uint8_t *str)   
{   
    while (0 != *str)   
    {   
        UART_PutChar(USARTx, *str);   
        str++;   
    }   
}




int main(void)  
{  
RCC_Configuration();
GPIO_Configuration();  
NVIC_Configuration();  
uart_init();


while(1)  
  {  
   GPIO_ResetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_13);  
delay();  
   GPIO_SetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_8|GPIO_Pin_13);  
   delay();  
   GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_8|GPIO_Pin_13);
delay();   
   GPIO_SetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_13);  
   delay();   

//USART_SendData(USART1, '1');  
UART_PutStr(USART1,(uint8_t*)("234"));
UART_PutStr(USART2,(uint8_t*)("234"));
  }  
}  




void GPIO_Configuration(void)  
{   
  GPIO_InitTypeDef GPIO_InitStructure;   
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_13;     
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;     
GPIO_Init(GPIOC,&GPIO_InitStructure);  


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   /* Configure USART2 Rx (PA.03) as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_3;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

}  

void uart_init()
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

USART_Init(USART1, &USART_InitStructure);  
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

USART_Init(USART2, &USART_InitStructure);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);

USART_Cmd(USART1, ENABLE);      
USART_Cmd(USART2, ENABLE);      
}


void USART1_IRQHandler(void)      //′®¿ú1 ÖD¶Ï·tÎñ3ìDò  
{  
static u8 RX_dat[256]={0};static int i;     
if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)//USART_IT_RXNE£o½óêÕÖD¶Ï  
{   
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
RX_dat[i++]=USART_ReceiveData(USART1);   
   }
if(RX_dat[0]=='{' &&  RX_dat[i-1]=='}')
{
//UART_PutStr(USART2,"fdg");
}
}  
void USART2_IRQHandler(void)      //′®¿ú2 ÖD¶Ï·tÎñ3ìDò  
{  
  unsigned int i;  
   
}  
回復

使用道具 舉報

20#
ID:624769 發(fā)表于 2022-11-28 13:57 | 只看該作者
Y_G_G 發(fā)表于 2022-11-27 12:15
如果不算成本
對于頻繁讀寫,真正的應該選外部鐵電EEPROM
鐵電近乎完美,因為不用等待寫入,整體讀寫速度 ...

對于頻繁讀來講, 外部不管用什么材料的 Eeprom,受限IO口的速度,就算你用的并口傳輸,發(fā)出讀指令,到IO口收到返回數(shù)據(jù),速度都比不過 讀片內(nèi)的速度。
而且,你也說了如果不算成本,所以架空項目去討論,意義真的不大。
回復

使用道具 舉報

21#
ID:401564 發(fā)表于 2022-11-28 14:58 | 只看該作者
188610329 發(fā)表于 2022-11-28 13:57
對于頻繁讀來講, 外部不管用什么材料的 Eeprom,受限IO口的速度,就算你用的并口傳輸,發(fā)出讀指令,到IO ...

我說的是讀寫,不是單純的讀
STC8G的擦除扇區(qū)時間為4-6mS,其它型號的也都差不多
FLASH就算只更改一個地址的數(shù)據(jù),都得先讀取,保存,再擦除扇區(qū),也就是說,你只更改一個數(shù)據(jù),用時也至少是4mS起步
鐵電就是IIC一個起始寫入停止的過程而已
而且,F(xiàn)LASH的壽命比起鐵電來,差太多了
回復

使用道具 舉報

22#
ID:378108 發(fā)表于 2022-11-29 23:40 | 只看該作者
用 外接的這幫人,不會用內(nèi)部的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表