基于STM32+SPI+W25Qxx存储芯片指令,时序和函数讲解

article/2025/11/7 13:37:52

前言     

        本次我们学习一下STM32F103关于SPI对存储芯片的读写,介绍W25QXX芯片和对芯片内部讲解和代码解读,学习W25QXX芯片的各种读写指令,操作芯片读写,认识底层驱动,本篇内容主要目的是教会大家看手册写代码,读代码。

本篇博客大部分是自己收集和整理,如有侵权请联系我删除。

本次实验板子使用的是正点原子精英版,芯片是STM32F103ZET6,需要资料可以@我拿取。

本博客内容原创,创作不易,转载请注明

没有初步认识SPI协议的,可以先看看我之前的博客:SPI协议讲解

一 . W25QXX 存储芯片介绍

应用:需要存储较多数据的时候,比如字库,图片,各种模块数据等等

总述:W25Q16,W25Q32 ,W25Q64 系列的FLASH存储器可以为用户提供存储解决方案。

存储芯片大小:这是其中几个,其他都差不多,具体要查一下

W25Q16
16M比特 (bit)  / 2M字节(byte)
W25Q3232M比特 (bit)  / 4M字节(byte)
W25Q6464M比特 (bit)  / 8M字节(byte)
W25Q128128M比特 (bit)  / 16M字节(byte)

本篇文章我们用W25Q16来介绍,内存容量大小为:2*1024*1024->内存地址

W25Q16,W25Q32 ,W25Q64 系列的FLASH存储器分别有8192,16384,32768可编程页,每页256个字节。芯片内部分为了块,扇区,页的编程指令和擦除指令,下面来看看他们之间的关系。
内部区分是从 块 -> 扇区 -> 页

1 块   = 16个扇区 = 64 K
扇区1 扇区= 16页 = 4096 字节 = 4 K
1 页    = 256 个字节
字节1 字节 = 8 位

1.用“页编程指令”每次就可以编程256个字节,意思就是每次都能一次性最多写入256个字节,因为芯片规定了不能跨页来写入数据,所以需要我们自己修改程序代码。

2.用 扇区擦除指令 每次可以擦除16页 ,不能自己删除指定的页区,每次使用这个指令都是直接擦除16页

3.用 块擦除指令 每次可以擦除256页 , 用 整片擦除指令 可擦除整个芯片。

标准的SPI接口:

 地址和区域分布(在英文手册有描述):

二 . 引脚说明和SPI初始化

通过手册我们可以看到SPI的配置模式选择:

 SPI 配置我们就不多说了,不懂去看看我博客的SPI协议讲解,现在直接上代码:

#include "spi.h"//SPI口初始化
void spi1_init(void)
{	 RCC->APB2ENR|=1<<2;  	//PORTA时钟使能 	 RCC->APB2ENR|=1<<12;   	//SPI1时钟使能 GPIOA->CRL&=0X000FFFFF; GPIOA->CRL|=0XB8B00000;	//PA5 PA7复用推挽输出    GPIOA->ODR|=0X07<<5;   	//PA6   上拉输入SPI1->CR1|=0<<11;		//8bit数据格式	SPI1->CR1|=0<<10;		//全双工模式	SPI1->CR1|=1<<9; 		//软件nss管理SPI1->CR1|=1<<8;  SPI1->CR1|=0<<7; 		//MSB first SPI1->CR1|=3<<3; 		//Fsck=Fpclk1/16,对SPI1属于APB2的外设.时钟频率最大为72M.SPI1->CR1|=1<<2; 		//SPI主机SPI1->CR1|=1<<1; 		//空闲模式下SCK为1 CPOL=1SPI1->CR1|=1<<0; 		//数据采样从第二个时间边沿开始,CPHA=1  SPI1->CR1|=1<<6; 		//SPI设备使能}//spi1发送数据
void spi1_send_byte(u8 data)
{//等待前面的发送完成while((SPI1->SR&(1<<1))==0);	//等待发送区空			//给数据DR寄存器SPI1->DR = data;	//这一步执行完成后并不会马上传输完成//spi是一个数据交换协议,发送一个字节,必然可以收到一个字节while((SPI1->SR&(1<<0))==0); //等待接收完成(无用的数据)data = SPI1->DR; 							//读取接收到无用的数据
}
/********************************************************************
* Function:   spi2_receive_byte
* Description: spi2接收数据
* Return : 接收到的数据
*********************************************************************/
u8 spi1_receive_byte(void)
{u8 data;//等待前面的发送完成while(!(SPI1->SR&(1<<1)));//给数据DR寄存器SPI1->DR = 0xaa;		// 读的时候传的值,这个值不重要,什么值都可以(0x01等)给这个值的目的主要是维持有时钟(时序图可以看出)//等待接收完成while(!(SPI1->SR&(1<<0)));data = SPI1->DR;	//读取数据return data;  //返回的是我们需要的数据。
}//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 spi1_read_write_byte(u8 data)
{				
//写功能	while((SPI1->SR&1<<1)==0);		//等待发送区空	--等待发送缓冲为空	
//这一步执行完成后并不会马上传输完成	SPI1->DR=data;	 	  		//发送一个byte ,写进去之后会自动的发出去//到这里其实发送函数已经发送完成了//SPI是一个数据交换协议,发送一个字节,必然可以接收到一个字节while((SPI1->SR&1<<0)==0) ;		//等待接收完一个byte  					    return SPI1->DR;          		//返回收到的数据				    
}

 三 . W25Q16读写指令时序讲解

芯片本身自带有一个控制和状态寄存器,要控制他读写,我们就需要控制操作寄存器来编写代码。

1. 状态寄存器位了解

这个第0位 和 第1位,都是只读位,在执行操作的时候才会置1,所以平常默认为 0;

 

 这两个为是可读可写位,根据自己想要执行的操作,给上对应的位,就可以通过SPI写入读出。

         通过以上的寄存器了解,我们就可以读出状态数据知道芯片的存储器阵列是否可写或者不可写,会是否处于写保护状态。

2.W25QXX 的指令了解和代码讲解

        在学习这个指令之前,我们要先了解清楚SPI的工作模式,以及使用到SPI的读写函数,这个不清楚可以看我往期博客,这里就不细说了;

        函数的基本执行流程:一般来说就是拉低片选,然后发送指令,从机会随机返回一个数据,这个数据可以由你自己决定,执行相应操作后,拉高片选,这个函数就实现了对应的指令功能了,

1.读状态寄存器指令(05h)

 

1.通过介绍,我们首先就是先拉低片选引脚
2.然后通过SPI协议编写的读写函数,把0X05的指令发送过去
3.接着从机返回一个随机数据,这里我们读取一个0xff
4.发送完成后,拉高片选,这样我们就完成了读状态寄存器的指令函数的编写了

因为这次是读取从机的数据,所以需要返回值

//读取W25QXX的状态寄存器
//BIT7  6   5   4   3   2   1   0
//SPR   RV  TB BP2 BP1 BP0 WEL BUSY
//SPR:默认0,状态寄存器保护位,配合WP使用
//TB,BP2,BP1,BP0:FLASH区域写保护设置
//WEL:写使能锁定
//BUSY:忙标记位(1,忙;0,空闲)
//默认:0x00
//W25QXX_ReadStatusReg    0u8 W25QXX_ReadSR(void)   
{  u8 byte=0;   W25QXX_CS=0;                                   //使能器件   spi1_read_write_byte(W25QXX_ReadStatusReg);    //发送读取状态寄存器命令    byte=spi1_read_write_byte(0Xff);               //读取一个字节  W25QXX_CS=1;                                 //取消片选     return byte;   
} 

2.写状态寄存器命令(01h )

1.通过介绍,我们首先就是先拉低片选引脚
2.然后通过SPI协议编写的读写函数,把 0X01 的指令发送过去

3.然后写好我们需要发送的字节
4.发送完成后,拉高片选,这样我们就完成了写状态寄存器的指令函数的编写了

//写W25QXX状态寄存器
//只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以写!!!// W25X_WriteStatusReg   0x01
void W25QXX_Write_SR(u8 sr)   
{   W25QXX_CS=0;                               //使能器件   spi1_read_write_byte(W25X_WriteStatusReg);//发送写取状态寄存器命令    spi1_read_write_byte(sr);                 //写入一个字节  W25QXX_CS=1;                              //取消片选     	      
}   

3.写使能状态寄存器 (06h)

1.通过介绍,我们首先就是先拉低片选引脚
2.然后通过SPI协议编写的读写函数,把 0X06 的指令发送过去

3.发送完成后,拉高片选,这样我们就完成了写状态寄存器的指令函数的编写了

//W25QXX写使能	
//将WEL置位   
//W25QXX_WriteEnable  0x06void W25QXX_Write_Enable(void)   
{W25QXX_CS=0;                            //使能器件   spi1_read_write_byte(W25QXX_WriteEnable);      //发送写使能  W25QXX_CS=1;                            //取消片选     	      
} 


4.页编程指令(02h)

        我们要通过写入数据进去flash,就需要用到这个页编程指令,在页内写入我们的数据,写这个函数都要用到上面的读写函数,所以我们要先写好其他的函数,才能执行其他的指令。

 为什么要发送24位地址,这个24位地址又是什么东西?

1.首先我们要先知道,SPI每次只能发送8位地址,所以这个24位地址我们需要分三次发
2.这个24位的地址,本质上就是数据存放的位置,为什么是24位呢,因为这个地址就是24位的,我们看手册就能知道。

3.比如我们要发送0X123456怎么发呢,SPI是高位先发的,所以我们要用上点位运算就可以了


4.发完24位地址之后,我们就可以发送我们的字节了,最大只能发送256个字节,超过就不行了

下面直接上代码讲解一下实现过程:

//SPI在一页(0~32768)内写入少于256个字节的数据,按照你的芯片规格计算大小
//在指定地址开始写入最大256字节的数据 (不能跨扇区写)
//调用这个函数必须确保写入的区域已经擦除了
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!	 
//W25QXX_PageProgram  0void W25QXX_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{u16 i;  W25QXX_Write_Enable();                  //SET WEL 	发送写使能,WEL位自动置1W25QXX_CS=0;                            //使能器件   spi1_read_write_byte(W25QXX_PageProgram);      //发送写页命令   spi1_read_write_byte((u8)((WriteAddr)>>16)); //发送24bit地址    spi1_read_write_byte((u8)((WriteAddr)>>8));   spi1_read_write_byte((u8)WriteAddr);   for(i=0;i<NumByteToWrite;i++)spi1_read_write_byte(pBuffer[i]);						//循环写数  W25QXX_CS=1;                             //取消片选 W25QXX_Wait_Busy();					  				  //等待写入结束
} 

1.根据手册描述,首先我们先写使能,使用到刚才的写使能函数
2.拉低片选,保证区域内没有数据,如果不确定就需要先擦除
3.发送页编程的指令0x02
4.发送24 bit的地址,右移16先发高位,然后右移8位,最后不用右移了
5.使用一个for循环,写入数组或者指针内的数据,可以连续写入,最多可以写256个
6.拉高片选,写入数据结束
7.根据手册,最后还要一个等待写入结束,这时候我们写一个函数判断一下就行,后面也会用到这个函数的

u8 texttowrite[]="12345ABCDE";  //要发送的数据
#define SIZE sizeof(texttowrite)    .
W25QXX_Write(texttowrite,88,SIZE);    

//等待空闲
void W25QXX_Wait_Busy(void)   
{   while((W25QXX_ReadSR()&0x01)==0x01);   // 等待BUSY位清空
}  

 5.读数据寄存器(03h)

 

1.根据手册描述,首先我们先拉低片选
2.发送页编程的指令0x03
4.发送24 bit的地址,右移16先发高位,然后右移8位,最后不用右移了
5.使用一个for循环,读取数组或者指针内的数据,同时返回随机数据
6.拉高片选,读取数据结束
本质上和页编程差不多,对着时序和手册都能简单的写出来了

//读取SPI FLASH  
//在指定地址开始读取指定长度的数据
//pBuffer:数据存储区
//ReadAddr:开始读取的地址(24bit)
//NumByteToRead:要读取的字节数(最大32768)
//W25QXX_ReadData   0void W25QXX_Read(u8* buffer,u32 read_address,u16 NumByteToRead)   
{ u16 i;   										    W25QXX_CS=0;                            //使能器件   spi1_read_write_byte(W25QXX_ReadData);         //发送读取命令   spi1_read_write_byte((u8)((read_address)>>16));  //发送24bit地址    spi1_read_write_byte((u8)((read_address)>>8));   spi1_read_write_byte((u8)read_address);   for(i=0;i<NumByteToRead;i++){ buffer[i]=spi1_read_write_byte(0XFF);   //循环读数 ,发送空字节  }W25QXX_CS=1;  				    	      
}  

6.扇区擦除指令(20h)

1.根据手册描述,首先我们先写使能,使用到刚才的写使能函数
2.拉低片选,发送扇区擦除的指令0x20,等待空闲
3.发送24 bit的地址,右移16先发高位,然后右移8位,最后不用右移了
4.拉高片选,扇区擦除完成,等待空闲

扇区擦除每次擦除4K=4096;在程序里面我们可自己设置擦除哪一个扇区的地址,也可以不设置,直接从写入地址开始擦除,下面看程序:

//擦除一个扇区
//Dst_Addr: 扇区编号,是第几个扇区,不是绝对地址
//擦除一个扇区的最少时间:150ms
// W25QXX_SectorErase   0x20void W25QXX_Erase_Sector(u32 Dst_Addr)  //1 
{  Dst_Addr*=4096;W25QXX_Write_Enable();                  //SET WEL 	 写使能W25QXX_Wait_Busy();   									 //等待空闲W25QXX_CS=0;                            //使能器件   spi1_read_write_byte(W25QXX_SectorErase);      //发送扇区擦除指令 spi1_read_write_byte((u8)((Dst_Addr)>>16));  //发送24bit地址   ,先写高位 spi1_read_write_byte((u8)((Dst_Addr)>>8));   spi1_read_write_byte((u8)Dst_Addr);  W25QXX_CS=1;                            //取消片选     	      W25QXX_Wait_Busy();   				   //等待擦除完成
} 

7.块擦除指令(D8h)

1.根据手册描述,首先我们先写使能,使用到刚才的写使能函数
2.拉低片选,发送扇区擦除的指令0xD8,等待空闲
3.发送24 bit的地址,右移16先发高位,然后右移8位,最后不用右移了
4.拉高片选,扇区擦除完成,等待空闲

程序代码和扇区擦除差不多,因为我懒所以这块没做,留着给大家自己尝试一下

8.芯片擦除指令(C7h)
 

1.根据手册描述,首先我们先写使能,使用到刚才的写使能函数
2.拉低片选,发送扇区擦除的指令0xc7,等待空闲
3.拉高片选,扇区擦除完成,等待空闲

//擦除整个芯片		  
//等待时间超长...
//W25QXX_ChipErase  0xc7void W25QXX_Erase_Chip(void)   
{                                   W25QXX_Write_Enable();                  //SET WEL W25QXX_Wait_Busy();   W25QXX_CS=0;                            //使能器件   spi1_read_write_byte(W25QXX_ChipErase);        //发送片擦除命令  W25QXX_CS=1;                            //取消片选     	      W25QXX_Wait_Busy();   				   //等待芯片擦除结束
}   

9.掉电指令(B9h) 

这个指令实在适合电池供电的情况下使用,我们根据手册要求使用就可以

//进入掉电模式
//W25X_PowerDown    0XB9void W25QXX_PowerDown(void)   
{ W25QXX_CS=0;                           	 	//使能器件   SPI2_ReadWriteByte(W25X_PowerDown);        //发送掉电命令  W25QXX_CS=1;                            	//取消片选     	      delay_us(3);                               //等待TPD  
}

10. 读ID指令(90h)

因为我们这个W25QXX,这个程序大部分都适用,所以当我们使用不同大小的flsah芯片的时候,我们就可以通过读取ID,选到自己对应的芯片了。

//读取芯片ID
//返回值如下:				   
//0XEF13,表示芯片型号为W25Q80  
//0XEF14,表示芯片型号为W25Q16    
//0XEF15,表示芯片型号为W25Q32  
//0XEF16,表示芯片型号为W25Q64 
//0XEF17,表示芯片型号为W25Q128 	  
u16 W25QXX_ReadID(void)
{u16 Temp = 0;	  W25QXX_CS=0;				    SPI2_ReadWriteByte(0x90);//发送读取ID命令	    SPI2_ReadWriteByte(0x00); 	    SPI2_ReadWriteByte(0x00); 	    SPI2_ReadWriteByte(0x00); 	 			   Temp|=SPI2_ReadWriteByte(0xFF)<<8;  Temp|=SPI2_ReadWriteByte(0xFF);	 W25QXX_CS=1;				    return Temp;
}  

         以上就是这个flash芯片的大部分指令函数以及使用了,相信很多人对这个擦除的方式不太了解,为什么每次都整片擦除,那之前写的数据怎么办,又要重新写入吗?

        针对这个问题,那这种方法肯定是我们自己通过程序来实现,随时随地擦除和写入,由于本次内容已经很多了,所以这个问题留到下一个博客,下一个博客讲解一下如何实现随意的擦除和写入,还有对字库以及图片写入数据的讲解,

总结:


        以上就是这篇博客的全部内容了,内容比较多,感觉大家耐心看完,代码其实都是大同小异,大家可以学会使用看手册和时序来编写自己想要实现的函数。

大家如果对我的博客有疑问或者错误,可以@我修改,大家相互交流。

  点赞收藏关注博主,不定期分享单片机知识,互相学习交流。


http://chatgpt.dhexx.cn/article/X9iWNeSk.shtml

相关文章

ButterKnife9.0.0-rc2 配置

升级了AndroidStudio到3.4之后&#xff0c;发现项目中的很多依赖库都不能用&#xff0c;原因是随着AS升级之后&#xff0c;Gradle随之升级到3.4.1&#xff0c;很多第三方库也需要更高版本的支撑&#xff0c;今天遇到ButterKnife失效的问题&#xff0c;原本是8.5.1的版本&#x…

How to install Bromine3 RC2

When I install Bromine RC2, I met bellow issues: “Server could not contact itself at the specified address: 127.0.0.1:80” “Error: Database table jobs for model job was not found.” etc. Now I show my exact way to install RC2 successfully: 1. Downl…

fabric1.4.0-rc2快速入门

软件环境 VMware 10.0.4 CentOS-7-x86_64-Minimal-1708 搭建过程 go安装 docker安装 docker-compose安装 一、fabric的编译和安装 1. 创建目录&#xff08;GOPATH变量在安装go的时候就配置好了&#xff09; mkdir -p $GOPATH/src/github.com/hyperledger 2. 下载fabri…

Cocos2d-JS v3.0 RC2发布说明

Cocos2d-JS是Cocos2d-x的Javascript版本&#xff0c;融合了Cocos2d-html5和Cocos2d-x JavaScript Bindings。它支持Cocos2d-x的所有特性并提供更简单易用的Javascript风格API。 核心特性 极大改进了ccui控件布局库的性能和稳定性&#xff0c;ccui在RC0中被大幅度重构&#xff0…

【GCC】1: RTCP RR接收端生成

m79 代码。参考bytewoods 大神的以下文章:WebRTC 基于GCC的拥塞控制(上) WebRTC 基于GCC的拥塞控制(下)虽然可以拿到估算的带宽但是rtcp 总是malformed packet个 有必要带着问题跟进下整个过程 RR报文 基于丢包率的码率控制运行在发送端,依靠RTCP RR报文进行工作。* report b…

STM32之RCC

STM32 RCC复位与时钟配置&#xff0c;我首先忽略掉复位&#xff0c;首先学习时钟配置&#xff0c;复位以后用到再学习 STM32有多个时钟源&#xff0c;分别是 HSI:上电默认启动&#xff0c;因精度不高所以先不采用&#xff0c;以后如果需要再使用 HSE&#xff1a;外部高速时钟&…

Apache ShardingSphere 4.0.0-RC2发布

处暑无三日,新凉直万金。处暑之日,Apache ShardingSphere 4.0.0-RC2已经发布,欢迎测试使用&#xff01; 本次发布的4.0.0-RC2版本将前不久发布的4.0.0-RC1版本的核心功能不断打磨优化&#xff0c;修复社区反馈的问题&#xff0c;且持续进行微内核重构打磨&#xff1b;在社区建设…

macOS Ventura 13.4 RC2(22F63)发布

系统介绍 根据黑果魏叔官网提供&#xff1a;5 月 12 日消息&#xff0c;苹果今天面向开发人员&#xff0c;发布了 macOS Ventura 13.4 的第 2 个候选 RC 版本&#xff08;内部版本号 22F63&#xff09;&#xff0c;距离上个候选版本相隔数天时间。 macOS Ventura 带来了台前调…

.NET 6 RC2 版本发布

原文&#xff1a;bit.ly/3FS9xm7作者&#xff1a;Richard日期&#xff1a;2021-10-12翻译&#xff1a;精致码农-王亮说明&#xff1a;文中有大量的超链接&#xff0c;这些链接在公众号文章中被自动剔除&#xff0c;一部分包含超链接列表的小段落被我删减了&#xff0c;如果你对…

c#加密:三、对称加密 AES、DES、RC2、Rijndael

一、c#中的对称加密概述 对称加密算法在加密和解密时使用相同的密钥。Framework提供了四种对称加密算法。AES、DES、Rijndael、RC2。 DES&#xff1a;全称为Data Encryption Standard&#xff0c;即数据加密标准&#xff0c;是一种使用密钥加密的块算法&#xff0c;1977年被美…

MFC的.rc 和.rc2文件

一、介绍 rc和rc2都是资源文件,包含了应用程序中用到的所有的资源。它们两指向的是同一个资源。 两者不同在于&#xff1a;rc2文件中的资源可以直接在VS集成环境中以可视化的方法进行编辑和修改; 而rc中的资源是根据需要手工地进行编辑。 二、实例 工程 rc文件 #include …

SEO搜索引擎优化方式

SEO搜索引擎优化方式 SEO搜索引擎优化方式 文章目录 SEO搜索引擎优化方式[TOC](文章目录) 前言一、黑帽SEO1、关键字的堆叠2、隐藏文本3、门页 二、白帽SEO1、 TDK2、 提高网站语义化的html标签占比3、 SSR 总结 前言 利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名&…

seo搜索引擎优化-SEO优化教程附关键词工具以及文章采集软件

seo搜索引擎优化&#xff0c;什么是SEO搜索引擎优化。简单点来说就是用户通过搜索引擎搜索想要的结果第一时间找到你的网站。那我们怎么做好搜索引擎优化呢&#xff1f;要做好搜索引擎优化首先我们得了解首页引擎。怎么才能快速的了解搜索引擎。不管是百度/360/谷歌/搜狗等搜索…

抖音seo搜索排名,源码开发部署/seo排名系统源码分析。

前言&#xff1a;抖音seo搜索排名&#xff0c;源码开发部署/seo排名系统源码分析。抖音seo源码搭建部分代码 抖音seo是什么&#xff1f;其实seo它是搜索引擎优化&#xff0c;不仅这样&#xff0c;抖音里也有搜索引擎优化&#xff0c;抖音seo其实就是优化抖音的搜索结果&#xf…

SEO -- 搜索引擎优化

文章目录 1、SEO简介2、SEO基本介绍3、SEO优化方法分类4、SEO优化策略5、SEO优化的优势6、SEO优化的发展问题7、SEO优化的意义 1、SEO简介 SEO&#xff08;Search Engine Optimization&#xff09;&#xff1a;汉译为搜索引擎优化。是一种方式&#xff1a;利用搜索引擎的规则提…

前端开发之SEO(搜索引擎优化)

前端开发之SEO&#xff08;搜索引擎优化&#xff09; 文章目录 前言一、突出重要内容合理的title、description和keywords语义化书写HTML代码&#xff0c;符合W3C标准利用布局&#xff0c;把重要内容HTML代码放在最前重要内容不要用JS输出尽少使用iframe框架为图片加上alt属性需…

SEO优化之147SEO搜索引擎推送工具

什么是推送&#xff1f; 对于SEO人员应该都不陌生吧&#xff0c;推送就是把网站的链接主动提交给搜索引擎&#xff0c; 确保新的链接可以尽快被收录&#xff0c;同时保护原创&#xff08;防止别人抄袭&#xff0c;以及转载后导致自己的网站没收录&#xff09; 为什么我们要去…

百度搜索排名优化和SEO搜索引擎优化

文章目录 一、前文二、原理和简介三、站内优化3.1 网站地图生成3.2 关键字密度检测 四、站外优化4.1 百度收录4.2 实名实网认证&#xff08;免费&#xff09;4.3 官网认证&#xff08;3000元/年&#xff09;4.4 其他 五、购买服务与付费六、站长工具 一、前文 年前给公司做了几…

SEO搜索引擎优化-引擎排名

SEO搜索引擎优化 引擎排名 SEO是指通过采用易于搜索引擎索引的合理手段&#xff0c;使网站各项基本要素适合搜索引擎检索原则并且对用户更友好(Search Engine Friendly)&#xff0c;从而更容易被搜索引擎收录及优先排序从属于SEM(搜索引擎营销)。 SEO的中文意思是搜索引擎优化。…

浅谈SEO搜索引擎基本工作原理

搜索引擎工作原理一共包括三个过程&#xff1a;网页搜索&#xff0c;预处理信息&#xff0c;建立索引&#xff0c;那么今天铭伟就把搜索引擎的工作原理进行解析一篇。 1、抓取网页。每个独立的搜索引擎都有自己的网页抓取程序爬虫&#xff08;spider&#xff09;。爬虫Spider顺…