找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1506|回复: 21
打印 上一主题 下一主题
收起左侧

现在的很多单片机都有内置的EEPROM为什么还是有很多人使用外接的呢?

  [复制链接]
跳转到指定楼层
楼主
ID:978375 发表于 2022-11-25 13:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有什么优势吗?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:675287 发表于 2022-11-25 15:26 | 只看该作者
内置的好像是FLASH,不能像外置EEPROM那样一个字节的读写,只能按块或扇区操作,写之前要先擦除块或扇区,才能写入
回复

使用道具 举报

板凳
ID:978375 发表于 2022-11-25 15:46 | 只看该作者
zh_junwei 发表于 2022-11-25 15:26
内置的好像是FLASH,不能像外置EEPROM那样一个字节的读写,只能按块或扇区操作,写之前要先擦除块或扇区,才 ...

刚刚了解到很多单片机内置EEPROM是用FLASH模拟的,可能稳定性不如硬件的
回复

使用道具 举报

地板
ID:1043747 发表于 2022-11-25 17:31 来自手机 | 只看该作者
内置的擦写寿命短
回复

使用道具 举报

5#
ID:401564 发表于 2022-11-25 20:31 | 只看该作者
单片机内部的EEPROM是FLASH的,只能块写入,一般有EEPROM存储数据不会每次都存上一个块的,有时候是单独改一个地址的数据而已,FLASH不能像24C01那样操作的
回复

使用道具 举报

6#
ID:419909 发表于 2022-11-25 21:52 | 只看该作者
应该是不习惯吧。个人觉得内置的EEPROM方便使用。虽然是块操作,但是需要保存的数据一般也不多。存在一个数组里,每次全部重写一次就可以了。擦写寿命这个,官方说明里好像也挺多的。又不是每时每刻要更新。
回复

使用道具 举报

7#
ID:101869 发表于 2022-11-26 10:11 | 只看该作者
内置EEPROM最大缺点就是存一个数据就要整页擦除,比如你这一页有200个数据,修改任何一个数据就要先把这200个保存到缓存,然后擦除,然后再把这200个数据写入.
回复

使用道具 举报

8#
ID:997026 发表于 2022-11-26 10:35 来自手机 | 只看该作者
好多人说单片机内置eeprom是flash的完全是误导,估计都是只用过stc的,用内部flash模拟eeprom大多是国产厂商的做法,因为便宜,我用过microchip的,人家就是真正的eeprom,按字节写入,不需要擦除,小一些的都没有页的概念,直接按地址写
回复

使用道具 举报

9#
ID:963918 发表于 2022-11-26 12:21 | 只看该作者
看内置EEPROM是不是真正的EEPROM,如果是FLASH模拟的,就要慎用,在某些时候擦写会影响到主程序区。
回复

使用道具 举报

10#
ID:401564 发表于 2022-11-26 12:30 | 只看该作者
hxdby 发表于 2022-11-26 10:35
好多人说单片机内置eeprom是flash的完全是误导,估计都是只用过stc的,用内部flash模拟eeprom大多是国产厂 ...

但PIC单片机一样的,有很多电路要外置EEPROM
因为,PIC单片机的EEPROM内存没几个是超过1K,有的型号甚至只有256B
回复

使用道具 举报

11#
ID:996773 发表于 2022-11-26 14:58 | 只看该作者
看使用情况,我是做收音机程序的,写入数据次数一天内也只有几次,按字节写24c02,毕竟多一个元件浪费,后来才用内部eeprom,因为只改动几个字节的数据,eeprom只能整个扇区写,我是先把整个扇区全读到单片机扩展内存,改动几个字节后再一下子全写入eeprom,很方便,程序也不复杂,多几条读出写入指令,很稳定,不要听别人乱讲啥的不稳定,但那种一秒钟就要写一次的甚至几十次的还是用外置的片子,内置模拟eeprom肯定扛不住几天十多万次的读写
回复

使用道具 举报

12#
ID:624769 发表于 2022-11-26 16:19 | 只看该作者
如果标题是: "论坛里有没有人在做项目时,明明单片机内部有Eeprom, 但是还外接Eeprom, 请问基于什么原因你还要外接Eeprom"
可能,我会举几个实际例子,再说一下理由。

偏偏来个“很多人”,最讨厌猜别人的心思。尤其是猜对了没奖,猜错了还有喷子。鬼知道“很多人”为什么要外接?有人不会用内部的,有人为了打一块学习板,有人为了堆料。谁知道?
大多数单片机,内部的Eeprom 也是可以单字节读写,并且不需要擦除可以直接修改的,和国内国外没有关系。
无非论坛里提问题的人多是不说单片机型号,而大部分问问题的人又是用的STC, 才会有了不少人回答问题先入为主用 STC来举例子。这不是作为认为别人只用过STC的理由或者依据,更不能自己除了 STC没用过或者学过其他国内的单片机,或者只了解了几款国内的单片机和几款国外的单片机,就片面以为 STC 能代表 “大多数国内”的单片机,就片面的认为,国产的单片机才会用 flash 模拟 Eeprom.
撇开成本不谈,在都是片内“Eeprom” 的前提下,flash 模拟 Eeprom 是有优势的,除了擦除比较麻烦,读/写 上,flash 模拟的 Eeprom 远比真实Eeprom要快,尤其是读上面,所以,对于频繁读取,偶尔写入,这样的需求,懂得人,会优先选择flash 模拟 的Eeprom 而不是真实的"Eeprom"。
正因为有不同的需求,会有不同的选择,所以有不少的单片机,也会同时提供 片内 真实Eeprom 的读写,以及片内Flash 的读写的 两种方式,让程序员按需使用。

撇开实际应用的需要,以偏盖面的下结论毫无意义。


回复

使用道具 举报

13#
ID:584814 发表于 2022-11-26 18:48 | 只看该作者
使用习惯且外置的价格可以忽略。
回复

使用道具 举报

14#
ID:401564 发表于 2022-11-27 12:15 | 只看该作者
188610329 发表于 2022-11-26 16:19
如果标题是: "论坛里有没有人在做项目时,明明单片机内部有Eeprom, 但是还外接Eeprom, 请问基于什么原因你 ...

如果不算成本
对于频繁读写,真正的应该选外部铁电EEPROM
铁电近乎完美,因为不用等待写入,整体读写速度还是很快的
回复

使用道具 举报

15#
ID:308903 发表于 2022-11-28 08:13 | 只看该作者
能不能延伸讨论下,外置咋用
回复

使用道具 举报

16#
ID:420836 发表于 2022-11-28 08:55 | 只看该作者
单片机内置的EEPROM体积不够大,设计者习惯于外加EEPROM来扩展存储空间。
回复

使用道具 举报

17#
ID:958310 发表于 2022-11-28 09:07 | 只看该作者
片外eeprom是独立于单片机的,如果软件要升级把单片机的flash擦了后升级就会把保存的数据清除了。但是独立的eeprom就不会。
回复

使用道具 举报

18#
ID:1054345 发表于 2022-11-28 11:29 | 只看该作者
他们最大差异就是:FLASH按块/扇区进行读写操作,EEPROM支持按字节读写操作。    其次,容量大小不同:FLASH容量可以做到很大,但EEPROM容量一般都很小。    再次,就是它们的应用场景不同:EERPOM存储零散小容量数据,比如:标志位、一组数据等。FLASH存储大容量数据,比如:程序代码、图片信息等。    再次,内部结构不同,Flash结构更简单,成本更低,类似前面和大家分享的《单片机中RAM少的原因》。    当然,还有很多其他区别,但随着技术的提升,它们二者已经很接近了。以前它们不能满足的功能,现在基本都能满足了。
回复

使用道具 举报

19#
ID:1054345 发表于 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 发表于 2022-11-28 13:57 | 只看该作者
Y_G_G 发表于 2022-11-27 12:15
如果不算成本
对于频繁读写,真正的应该选外部铁电EEPROM
铁电近乎完美,因为不用等待写入,整体读写速度 ...

对于频繁读来讲, 外部不管用什么材料的 Eeprom,受限IO口的速度,就算你用的并口传输,发出读指令,到IO口收到返回数据,速度都比不过 读片内的速度。
而且,你也说了如果不算成本,所以架空项目去讨论,意义真的不大。
回复

使用道具 举报

21#
ID:401564 发表于 2022-11-28 14:58 | 只看该作者
188610329 发表于 2022-11-28 13:57
对于频繁读来讲, 外部不管用什么材料的 Eeprom,受限IO口的速度,就算你用的并口传输,发出读指令,到IO ...

我说的是读写,不是单纯的读
STC8G的擦除扇区时间为4-6mS,其它型号的也都差不多
FLASH就算只更改一个地址的数据,都得先读取,保存,再擦除扇区,也就是说,你只更改一个数据,用时也至少是4mS起步
铁电就是IIC一个起始写入停止的过程而已
而且,FLASH的寿命比起铁电来,差太多了
回复

使用道具 举报

22#
ID:378108 发表于 2022-11-29 23:40 | 只看该作者
用 外接的这帮人,不会用内部的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表