0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机存储器中提高层次的操作

FPGA之家 来源:CSDN 作者:果果小师弟 2021-03-12 15:55 次阅读

摘要:在单片机开发板上或者是核心板上通常会看到除了MCU之外的的芯片—EEPROM和FLASH,一般是AT24CXX、W25QXX这两颗芯片。但在利用单片机做一些项目的时候,比如做一个小车,驱动一些外设、显示一些温湿度信息等,却发现一般没有用到这些芯片。

在做一些显示的时候却会用到。他们与单片机之间的通信方式就是IIC和SPI通信,在单片机的开发中用到的非常多。很多小伙伴就会说了,用OLED来显示一些数据,IIC通信直接用别人的代码,驱动SD卡或者NRF24L01直接拿别人的SPI代码就可以啊,难道我还自己去写驱动吗?当然需要,学会了这些操作,层次就会提高很多,不信那就接着往下看!

EEPROM AT24C02存储器学单片机的时候大家可能有一个问题,为啥是IIC读写EEPROM,而不是读写其他的东西。为什么大部分的单片机开发教程都教我利用IIC通信来读写EEPROM这颗AT24C02芯片?4针0.96寸OLED也是IIC操作的,为啥他们不叫我如何利用IIC通信来操作OLED?原因很简单,主要是读写EEPROM你学完了没有成就感,会读写EEPROM又怎么样?归根到底是没有掌握IIC体会到IIC通信的重要性。

今年疫情很严重,有一款红外测温芯片mlx90641就是通过IIC来读取温度的。我想如果教程是IIC读写红外测温芯片,大家可能会比较感兴趣。言归正传,来说一说EEPROM。ROM是“Read Only Memory”的缩写,意为只能读的存储器。由于技术的发展,后来设计出了可以方便写入数据的 ROM,而这个“Read Only Memory”的名称被沿用下来了。EEPROM(Electrically Erasable Programmable ROM)是电可擦除存储器。EEPROM 可以重复擦写,EEPROM 是一种掉电后数据不丢失的存储器,常用来存储一些配置信息,以便系统重新上电的时候加载之。它的擦除和写入都是直接使用电路控制,不需要再使用外部设备来擦写。而且可以按字节为单位修改数据,无需整个芯片擦除。现在主要使用的ROM芯片都是EEPROM。24C02是一个2K Bit的串行EEPROM存储器(掉电不丢失),内部含有256个字节,在24C02里面有一个8字节的页写缓冲器。

操作任何的IIC设备一般都要知道从机地址,也就是利用单片机操作读写的那个设备的地址。一般来说对于IIC设备地址是7位,其中高 4 位固定为:1010 b,低 3 位则由 A0/A1/A2信号线的电平决定。所以一个IIC总线上可以挂载2^3=8个EEPROM芯片,当然一般一个单片机只有一块EEPROM芯片,所以我们直接把这个A2A1A0接地即可,当然接VCC也没有问题,如果接GND那么地址就是1010000(0X50),如果接VCC那么地址就是1010111(0X57)。

因为24C02是一个2K Bit的串行EEPROM存储器(掉电不丢失),内部含有256个字节。也就是说有256个存储单元,一个字节就是一个存储单元,因为每个字节可以出存256个数,也就是说每个存储单元可以存0~255个数。我们可以这样理解,AT24C02是一栋教学楼,这个教学楼有256个房间(存储单元),没每个房间可以容纳256个学生(每个存储单元可以存储0 ~ 255个数)。

而且这个芯片在断电的时候数据不会丢失,利用掉电不会丢失以及这款芯片容量不大的特性,可以大致判断它会在哪些地方可以用到。比如我们看电视得时候,正在看CCTV6电影频道,播放的声音比较大,那么这时候正好停电了。那么你下次来电时你打开电视机,电视机默认肯定是CCTV6电影频道,播放的声音也是很大。那么这些“频道”、“音量”这些数据就存在EEPROM里面,至于是不是ATC02就不一定了。

总结:

存储量少,用起来方便

可以任意访问地址数据,每一个存储单片可以独立访问,

写入前是不需要对写入的单片做独立的擦除

这三个特点对我们理解存储器的特性非常重要,因为接下来要说的FLASH芯片的特性就与它完全相反。

FLASH W25Q128存储器

FLSAH字面意思就是闪现、一瞬间的意思,所以FLSAH存储器又称闪存,与 EEPROM都是掉电后数据不丢失的存储器,但FLASH存储器容量普遍大于 EPROM,现在基本取代了它的地位。生活中常用的 U 盘、SD卡、SSD 固态硬盘以及我们 STM32 芯片内部用于存储程序的设备,都是 FLASH 类型的存储器。在存储控制上,最主要的区别是 FLASH 芯片只能一大片一大片地擦写,而 EEPROM可以单个字节擦写。

FLASH 芯片的最小擦除单位为扇区(Sector),而一个块(Block)包含 16 个扇区,4Kbytes为一个Sector,16个扇区为1个Block。W25Q64 容量为8M字节(即 64M bit), 分为128块(Block),每一块的大小为64K字节,每块又分为16个扇区(Sector),那么每个扇区就是4K个字节。W25Q128 容量为16M字节(即 128M bit),分为256块(Block),每一块的大小为64K字节,每块又分为16个扇区(Sector),那么每个扇区就是4K个字节(4096个字节,也就是4096个存储单元)。

W25Qxx的最小擦除单位为一个扇区,也就是每一次必须擦除4K字节。所以必须给W25Qxx开辟至少4K的缓冲区,这样对单片机的RAM的要求比较高,要求芯片必须有4K以上的RAM才能很好的操作。所有的FLASH我们在写之前都要擦出对应的扇区,擦除后的数据是0XFF。我们可以这样理解。我们要改写FLASH芯片W25Q128的一个扇区中某一个数据,就必须在STM32芯片的内部RAM中开辟4K字节(4096字节)的缓冲区域。先把FLASH芯片W25Q128的一个扇区中数据全部读到STM32芯片的内部RAM中开辟4K字节(4096字节)的缓冲区域中去,把我们要改写的数据在缓冲区域改写好之后,再把FLASH芯片W25Q128的一个扇区中的数据全部擦除完毕,擦除完成之后再把数据写回去。这是写入数据的操作,在读数据的时候不需要以扇区为单位,想读哪个扇区就读哪个扇区的数据。

/************************************************************************* * Function Name : SPI_Flash_Write * Description : 在指定地址开始写入指定长度的数据,该函数带擦除操作! * Input : *pBuffer:要写入数据的指针 WriteAddr:开始写入的地址(24bit) NumByteToWrite:要写入的字节数(最大16 x 1024 x 1024) * Output : None * Return : None

****************************************************************************/ void SPI_Flash_Write(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite) { u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0; Addr = WriteAddr % 4096;//mod运算求余,若writeAddr是4096整数倍,运算结果Addr值为0 NumOfPage = NumByteToWrite / 4096;//计算出要写多少整数扇区 NumOfSingle = NumByteToWrite % 4096;//mod

运算求余,计算出剩余不满一扇区的字节数 count = 4096 - Addr;//差count个数据值,刚好可以对齐到扇区地址 if (Addr == 0)//Addr=0,则WriteAddr刚好按扇区对齐或者说小于一个扇区 { //NumByteToWrite 《 4096,写入的字符串大小长度小于一个扇区(4096个字节)的大小,如22 if (NumOfPage == 0) { SPI_Flash_Write_Page(pBuffer, WriteAddr, NumByteToWrite); } else //NumByteToWrite 》 4096,写入的字符串大小长度大与一个扇区(4096个字节)的大小,如4098 { //先把整数扇区都写了 while (NumOfPage--) { SPI_Flash_Write_Page(pBuffer, WriteAddr, 4096); WriteAddr += 4096; pBuffer += 4096; } //若有多余的不满一扇区的数据,把它写完

SPI_Flash_Write_Page(pBuffer, WriteAddr, NumOfSingle); } } //若地址与 4096 不对齐 else //Addr不等于0,则要写入的WriteAddr地址与4096不对齐 { //NumByteToWrite 《 4096 if (NumOfPage == 0)//大小不够一个扇区,如22 { //当前页剩余的count个位置比NumOfSingle小,一扇区写不完 if (NumOfSingle 》 count) { temp = NumOfSingle - count; //先写满当前扇区 SPI_Flash_Write_Page(pBuffer, WriteAddr, count); WriteAddr += count; pBuffer += count; //再写剩余的数据 SPI_Flash_Write_Page(pBuffer, WriteAddr, temp); } else //当前扇区剩余的count个位置能写完

NumOfSingle个数据 { SPI_Flash_Write_Page(pBuffer, WriteAddr, NumByteToWrite); } } else //NumByteToWrite 》 4096 //大小够一个扇区,而且还超出一点点,如4098 { //地址不对齐多出的count分开处理,不加入这个运算 NumByteToWrite -= count; NumOfPage = NumByteToWrite / 4096; NumOfSingle = NumByteToWrite % 4096; //先写完count个数据,为的是让下一次要写的地址对齐 SPI_Flash_Write_Page(pBuffer, WriteAddr, count); //接下来就重复地址对齐的情况

*/ WriteAddr += count; pBuffer += count; //把整数扇区都写了*/ while (NumOfPage--) { SPI_Flash_Write_Page(pBuffer, WriteAddr, 4096); WriteAddr += 1096; pBuffer += 4096; } //若有多余的不满一扇区的数据,把它写完 if (NumOfSingle != 0) { SPI_Flash_Write_Page(pBuffer, WriteAddr, NumOfSingle); } } } }

总结:

/********************************************************************** * Function Name : SPI_Flash_Read * Description : 在指定地址开始读取指定长度的数据 * Input : *pBuffer:存储读出数据的指针 ReadAddr:开始读取的地址(24bit) NumByteToRead:要读取的字节数(最大 16 x 1024 x 1024) * Output : None * Return : None ************************************************************************/ void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead) { u16 i; SPI_FLASH_CS=0; //使能器件

SPI1_ReadWriteByte(CMD_W25X_ReadData); //发送读取命令 SPI1_ReadWriteByte((ReadAddr& 0xFF0000)》》16); //发送扇区地址的高8bit SPI1_ReadWriteByte((ReadAddr& 0xFF00)》》8); //发送扇区地址的中间8bit SPI1_ReadWriteByte( ReadAddr& 0xFF); //发送扇区地址的低8bit for(i=0;i《NumByteToRead;i++) { pBuffer[i]=SPI1_ReadWriteByte(0XFF); //循环读数 } SPI_FLASH_CS=1; //取消片选 } 总结:

存储量大

不能任意访问字节地址数据,每一个存储单片不可以独立访问,最小读取单元是一个扇区

写入前是必须对写入的扇区做独立的擦除操作。擦除的目的是使存储单元的数据全为1

SD卡大容量存储器SD 卡(Secure Digital Memory Card)在我们生活中已经非常普遍了,控制器对 SD卡进行读写通信操作一般有两种通信接口可选,一种是 SPI接口,另外一种是 SDIO 接口。SDIO全称是安全数字输入/输出接口,多媒体卡(MMC)、SD卡、SD I/O 卡(专指使用SDIO 接口的一些输入输出设备)都可使用 SDIO 接口通讯。STM32F10x 系列控制器有一个 SDIO 主机接口,它支持与上述使用 SDIO 接口的设备进行数据传输。

STM32F10x 系列控制器只支持 SD 卡规范版本 2.0,即只支持标准容量SD和高容量 SDHC 标准卡,不支持超大容量 SDXC 标准卡,所以可以支持的最高卡容量是 32GB。SD 卡一般都支持 SDIO 和 SPI 这两种接口。另外,STM32F42x 系列控制器的 SDIO 是不支持 SPI通信模式的,如果需要用到 SPI通信只能使用 SPI外设。因为SPI通信方式操作SD卡的数据线只有一根,而如果用SDIO的通信方式操作SD卡的数据线却又3根。为了节省资源一般在STM32F10x 系列控制器上用SPI的通信方式,而在引脚资源比较多的F4系列上就用SDIO的通信方式了。

1e5d7702-82f5-11eb-8b86-12bb97331649.png

SD容量有8MB、16MB、32MB、64MB、128MB、256MB、512MB、1GB、2GB (磁盘格式FAT12、FAT16)

SDHC容量有2GB、4GB、8GB、16GB、32GB(磁盘格式FAT32)

SDXC容量有32GB、48GB、64GB、128GB、256GB(磁盘格式exFAT)

3.1初始化1、初始化与SD卡连接的硬件条件(MCU的SPI配置,IO口配置);

2、上电延时(》74 个 CLK);

3、复位卡(CMD0),进入IDLE状态;

4、发送CMD8,检查是否支持2.0协议;

5、根据不同协议检查SD卡(命令包括:CMD55、CMD41、CMD58 和 CMD1 等);

6、取消片选,发多 8个CLK,结束初始化

/******************************************************************************* * Function Name : SD_Init * Description : 初始化SD卡 * Input : None * Output : None * Return : u8 * 0:NO_ERR * 1:TIME_OUT * 99:NO_CARD *******************************************************************************/ u8 SD_Init(void) { u8 r1; // 存放SD卡的返回值 u16 retry; // 用来进行超时计数 u8 buf[4]; u16 i; SD_SPI_Init(); //初始化IO SD_SPI_SpeedLow(); //设置到低速模式 //先产生至少74个脉冲,让SD卡自己初始化完成 for(i=0;i《10;i++) { SD_SPI_WriteByte(0XFF);

////80clks } //-----------------SD卡复位到idle开始----------------- //循环连续发送CMD0,直到SD卡返回0x01,进入IDLE状态 //超时则直接退出 retry=0; do { r1=SD_SendCmd(CMD0,0,0x95);//进入IDLE状态,作用是让SD卡进入SPI模式。这里的CRC校验位0x95是固定的,不能修改 retry++; }while((r1!=0X01) && (retry《20));//如果 SD 卡有正确的回应,代码就继续执行,如果没有回应程序就终止执行。 //跳出循环后,检查原因:初始化成功?or 重试超时? if(retry==20) return 1; //超时返回1 SD_Type=0;

//默认无卡 //下面是V2.0卡的初始化 //其中需要读取OCR数据,判断是SD2.0还是SD2.0HC卡 if(r1==0X01) { if(SD_SendCmd(CMD8,0x1AA,0x87)==1)//SD V2.0 { //V2.0的卡,CMD8命令后会传回4字节的数据,要跳过再结束本命令 buf[0]=SD_SPI_ReadByte(); //should be 0x00 buf[1]=SD_SPI_ReadByte(); //should be 0x00 buf[2]=SD_SPI_ReadByte(); //should be 0x01 buf[3]=SD_SPI_ReadByte(); //should be 0xAA if(buf[2]==0X01&&buf[3]==0XAA)//判断卡是否支持2.7~3.6V的电压范围 { retry=0XFFFE; //发卡初始化指令CMD55+CMD41 do { SD_SendCmd(CMD55,0,0X01); //发送CMD55 r1=SD_SendCmd(CMD41,0x40000000,0X01);//发送CMD41 }while(r1&&retry--); //初始化指令发送完成,接下来获取OCR信息

//-----------鉴别SD2.0卡版本开始----------- if(retry&&SD_SendCmd(CMD58,0,0X01)==0)//鉴别SD2.0卡版本开始 { //读OCR指令发出后,紧接着是4字节的OCR信息 buf[0]=SD_SPI_ReadByte(); buf[1]=SD_SPI_ReadByte(); buf[2]=SD_SPI_ReadByte(); buf[3]=SD_SPI_ReadByte(); //检查接收到的OCR中的bit30位(CCS),确定其为SD2.0还是SDHC //如果CCS=1:为SDV2.0HC的2.0高容量卡 CCS=0:为SDV2.0的2.0版本的标准卡 if(buf[0]&0x40) SD_Type=SD_TYPE_V2HC; //检查CCS else SD_Type=SD_TYPE_V2; LCD_ShowNum(164,250,SD_Type,5,16);//显示SD卡容量 //-----------鉴别SD2.0卡版本结束----------- } } } //如果卡片版本信息是v1.0版本的,即r1=0x05,则进行以下初始化

else//SD V1.0/ MMC V3 { //先发CMD55,应返回0x01;否则出错 r1 = SD_SendCmd(CMD55,0,0X01); //发送CMD55 if(r1 != 0x01) return r1; //得到正确响应后,发ACMD41,应得到返回值0x00 r1=SD_SendCmd(CMD41,0,0X01); //发送CMD41 if(r1《=1) { SD_Type=SD_TYPE_V1; retry=0XFFFE; do //等待退出IDLE模式 { SD_SendCmd(CMD55,0,0X01); //发送CMD55 r1=SD_SendCmd(CMD41,0,0X01);//发送CMD41 }while(r1&&retry--); }else//MMC卡不支持CMD55+CMD41识别 { SD_Type=SD_TYPE_MMC;//MMC V3 retry=0XFFFE; do //等待退出IDLE模式 { r1=SD_SendCmd(CMD1,0,0X01);//发送CMD1,发送MMC卡初始化命令

}while(r1&&retry--); } if(retry==0||SD_SendCmd(CMD16,512,0X01)!=0) SD_Type=SD_TYPE_ERR;//错误的卡 } } SD_DisSelect();//取消片选 SD_SPI_SpeedHigh();//高速 if(SD_Type) return 0; else if(r1) return r1; return 0xaa;//其他错误 }

3.2写数据通过 CMD24实现1、发送CMD24;

2、接收卡响应R1;

3、发送写数据起始令牌 0XFE;

4、发送数据;

5、发送2字节的伪CRC;

6、禁止片选之后,发多8个CLK;

/******************************************************************************* * Function Name : SD_WriteDisk * Description : 向SD卡写数据 * Input : buf:数据缓存区 * sector:扇区 * cnt:扇区数 * Output : None * Return : u8 * 0:ok * 其他,失败。 *******************************************************************************/ u8 SD_WriteDisk(u8*buf,u32 sector,u8 cnt) { u8 r1; if(SD_Type!=SD_TYPE_V2HC)sector *= 512;//转换为字节地址 if(cnt==1) { r1=SD_SendCmd(CMD24,sector,0X01);//读命令 if(r1==0)//指令发送成功 { r1=SD_SendBlock(buf,0xFE);//写512个字节 } }else { if(SD_Type!=SD_TYPE_MMC) { SD_SendCmd(CMD55,0,0X01); SD_SendCmd(CMD23,cnt,0X01);//发送指令 } r1=SD_SendCmd(CMD25,sector,0X01);//连续读命令 if(r1==0) { do { r1=SD_SendBlock(buf,0xFC);//接收512个字节 buf+=512; }while(--cnt && r1==0); r1=SD_SendBlock(0,0xFD);//接收512个字节 } } SD_DisSelect();//取消片选,释放SPI总线 return r1; }

3.3读取数据通过 CMD17实现1、发送CMD17;

2、接收卡响应R1;

3、接收数据起始令牌 0XFE;

4、接收数据;

5、接收2个字节的 CRC,如果不使用CRC,这两个字节在读取后可以丢掉。

6、禁止片选之后,发多8个CLK;

/*******************************************************************************

* Function Name : SD_ReadDisk

* Description : 读SD卡数据

* Input : buf:数据缓存区

* sector:扇区

* cnt:扇区数

* Output : None

* Return : u8

* 0:ok

* 其他,失败。

*******************************************************************************/

u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)

{

u8 r1;

if(SD_Type!=SD_TYPE_V2HC)sector 《《= 9;//转换为字节地址

if(cnt==1)

{

r1=SD_SendCmd(CMD17,sector,0X01);//读命令

if(r1==0)//指令发送成功

{

r1=SD_RecvData(buf,512);//接收512个字节

}

}else

{

r1=SD_SendCmd(CMD18,sector,0X01);//连续读命令

do

{

r1=SD_RecvData(buf,512);//接收512个字节

buf+=512;

}while(--cnt && r1==0);

SD_SendCmd(CMD12,0,0X01); //发送停止命令

}

SD_DisSelect();//取消片选

return r1;

}

原文标题:你必须知道的单片机存储器的那些事!

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    452

    文章

    50150

    浏览量

    420499
  • 单片机
    +关注

    关注

    6030

    文章

    44482

    浏览量

    631753
  • 存储器
    +关注

    关注

    38

    文章

    7423

    浏览量

    163486

原文标题:你必须知道的单片机存储器的那些事!

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    51单片机的主要逻辑功能部件是什么

    部件的操作。它包括算术逻辑单元(ALU),用于执行算术和逻辑运算。 2. 存储器 程序存储器(ROM):用于存储程序代码,通常是不可更改的内存,如EPROM或闪存。
    的头像 发表于 10-18 12:49 163次阅读

    单片机存储空间不够用了,有哪些解决办法?

    单片机存储空间不足时,可以考虑几种解决方法。一种是优化程序代码,删除不必要的代码和变量,提高代码的效率和紧凑性;可以采用外部存储器扩展,如使用外部的 EEPROM 或 Flash
    发表于 10-15 22:33

    PIC单片机的优势和不足之处

    的核心优势在于其CPU采用的RISC结构,这一结构精简而高效,分别包含33、35、58条指令,构成了精简指令集。这种设计不仅减少了指令的数量,还提高了指令的执行效率。 同时,PIC单片机采用了Harvard双总线结构,使得程序存储器
    的头像 发表于 09-25 17:22 267次阅读

    存储器层次结构包括哪些

    存储器层次结构是计算机系统中一个关键且复杂的部分,它决定了数据的存储、访问和处理效率。存储器层次结构主要包括多个
    的头像 发表于 09-10 14:28 291次阅读

    单片机烧录程序的线比单片机上的少还能烧录吗

    单片机烧录原理 单片机烧录是指将编写好的程序代码通过一定的方式传输到单片机存储器中,使其能够按照程序的指令运行。这个过程通常需要使用烧录
    的头像 发表于 09-02 09:54 347次阅读

    宙讯科技董事长周冲入选“紫金山英才计划高层次创新创业人才”

    近日,中共南京市委人才工作领导小组发布了南京市“紫金山英才计划高层次创新创业人才项目”评审结果,宙讯科技董事长周冲成为该项目入选人才。
    的头像 发表于 02-26 09:23 774次阅读

    存储器层次结构如何解释?

    存储器层次结构可以从图片中清晰的看出来,图片中共分为六级,越向上的层次存储器速度越快,容量更小,造价越高。
    的头像 发表于 02-19 14:03 850次阅读
    <b class='flag-5'>存储器层次</b>结构如何解释?

    浅谈存储器层次结构

    通过多级存储器的设计,存储器层次结构能够在存储容量和访问速度之间找到一个平衡点。高速缓存存储器和主存储器提供了快速的访问速度,而辅助
    发表于 02-19 13:54 618次阅读
    浅谈<b class='flag-5'>存储器层次</b>结构

    简述存储器层次结构及其分层原因

    存储器层次结构是计算机系统中存储器层次化组织,分为多个层次,每个层次具有不同的访问速度、容量
    发表于 02-05 09:46 1884次阅读

    单片机为何需要Flash和EEPROM?它们有何作用?

    不同的特点和用途。 首先,让我们了解一下Flash存储器。Flash存储器是一种非易失性存储器,可以在断电后保留数据。它以块为单位进行擦除和写入操作,允许多次重写。Flash
    的头像 发表于 01-18 11:43 3296次阅读

    单片机原理及应用有哪些

    单片机(Microcontroller)是一种集成电路芯片,具备中央处理(CPU)、存储器(RAM和ROM)、输入/输出(I/O)接口及定时/计数等功能模块。它是嵌入式系统的核心组
    的头像 发表于 01-15 16:25 1832次阅读

    如何充分利用单片机(MCU)的非易失性存储器呢?

    如何充分利用单片机(MCU)的非易失性存储器 单片机(MCU)的非易失性存储器(NVM)是存储数据和程序的重要组成部分。它可以保留数据,即使
    的头像 发表于 12-15 10:10 1179次阅读

    单片机的烧写次数是不是无限的呢?单片机能烧录多少次?

    单片机的结构和烧写方式 单片机是一种集成电路,它集成了处理存储器、输入输出接口等功能。烧写单片机时,通常使用专用的编程
    的头像 发表于 12-07 13:46 3752次阅读

    使用Vivado高层次综合(HLS)进行FPGA设计的简介

    电子发烧友网站提供《使用Vivado高层次综合(HLS)进行FPGA设计的简介.pdf》资料免费下载
    发表于 11-16 09:33 0次下载
    使用Vivado<b class='flag-5'>高层次</b>综合(HLS)进行FPGA设计的简介

    单片机最小系统的组成部分 使用proteus软件搭建最小单片机系统的操作方法

    单片机是一种集成了微处理存储器、输入/输出接口等功能的集成电路芯片,它可以用来实现各种控制功能。单片机最小系统是指只包含了单片机芯片和必
    的头像 发表于 11-09 16:24 1999次阅读
    <b class='flag-5'>单片机</b>最小系统的组成部分 使用proteus软件搭建最小<b class='flag-5'>单片机</b>系统的<b class='flag-5'>操作</b>方法