亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flash.c

?? STM32不完全手冊 例程源碼 29個
?? C
字號:
#include "flash.h" 
#include "spi.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供學習使用,未經作者許可,不得用于其它任何用途
//Mini STM32開發板
//W25X16 驅動函數	   
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//修改日期:2010/6/13 
//版本:V1.0
//版權所有,盜版必究。
//Copyright(C) 正點原子 2009-2019
//All rights reserved
////////////////////////////////////////////////////////////////////////////////// 	  
 

//4Kbytes為一個Sector
//16個扇區為1個Block
//W25X16
//容量為2M字節,共有32個Block,512個Sector 

//初始化SPI FLASH的IO口
void SPI_Flash_Init(void)
{
	RCC->APB2ENR|=1<<2;       //PORTA時鐘使能 	    
	//這里 
	GPIOA->CRL&=0XFFF000FF; 
	GPIOA->CRL|=0X00033300;//PA2.3.4 推挽 	    
	GPIOA->ODR|=0X7<<2;    //PA2.3.4上拉
	SPIx_Init();		   //初始化SPI
}  

//讀取SPI_FLASH的狀態寄存器
//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
u8 SPI_Flash_ReadSR(void)   
{  
	u8 byte=0;   
	SPI_FLASH_CS=0;                            //使能器件   
	SPIx_ReadWriteByte(W25X_ReadStatusReg);    //發送讀取狀態寄存器命令    
	byte=SPIx_ReadWriteByte(0Xff);             //讀取一個字節  
	SPI_FLASH_CS=1;                            //取消片選     
	return byte;   
} 
//寫SPI_FLASH狀態寄存器
//只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以寫!!!
void SPI_FLASH_Write_SR(u8 sr)   
{   
	SPI_FLASH_CS=0;                            //使能器件   
	SPIx_ReadWriteByte(W25X_WriteStatusReg);   //發送寫取狀態寄存器命令    
	SPIx_ReadWriteByte(sr);               //寫入一個字節  
	SPI_FLASH_CS=1;                            //取消片選     	      
}   
//SPI_FLASH寫使能	
//將WEL置位   
void SPI_FLASH_Write_Enable(void)   
{
	SPI_FLASH_CS=0;                            //使能器件   
    SPIx_ReadWriteByte(W25X_WriteEnable);      //發送寫使能  
	SPI_FLASH_CS=1;                            //取消片選     	      
} 
//SPI_FLASH寫禁止	
//將WEL清零  
void SPI_FLASH_Write_Disable(void)   
{  
	SPI_FLASH_CS=0;                            //使能器件   
    SPIx_ReadWriteByte(W25X_WriteDisable);     //發送寫禁止指令    
	SPI_FLASH_CS=1;                            //取消片選     	      
} 			    
//讀取芯片ID W25X16的ID:0XEF14
u16 SPI_Flash_ReadID(void)
{
	u16 Temp = 0;	  
	SPI_FLASH_CS=0;				    
	SPIx_ReadWriteByte(0x90);//發送讀取ID命令	    
	SPIx_ReadWriteByte(0x00); 	    
	SPIx_ReadWriteByte(0x00); 	    
	SPIx_ReadWriteByte(0x00); 	 			   
	Temp|=SPIx_ReadWriteByte(0xFF)<<8;  
	Temp|=SPIx_ReadWriteByte(0xFF);	 
	SPI_FLASH_CS=1;				    
	return Temp;
}   		    
//讀取SPI FLASH  
//在指定地址開始讀取指定長度的數據
//pBuffer:數據存儲區
//ReadAddr:開始讀取的地址(24bit)
//NumByteToRead:要讀取的字節數(最大65535)
void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
{ 
 	u16 i;    												    
	SPI_FLASH_CS=0;                            //使能器件   
    SPIx_ReadWriteByte(W25X_ReadData);         //發送讀取命令   
    SPIx_ReadWriteByte((u8)((ReadAddr)>>16));  //發送24bit地址    
    SPIx_ReadWriteByte((u8)((ReadAddr)>>8));   
    SPIx_ReadWriteByte((u8)ReadAddr);   
    for(i=0;i<NumByteToRead;i++)
	{ 
        pBuffer[i]=SPIx_ReadWriteByte(0XFF);   //循環讀數  
    }
	SPI_FLASH_CS=1;                            //取消片選     	      
}  
//SPI在一頁(0~65535)內寫入少于256個字節的數據
//在指定地址開始寫入最大256字節的數據
//pBuffer:數據存儲區
//WriteAddr:開始寫入的地址(24bit)
//NumByteToWrite:要寫入的字節數(最大256),該數不應該超過該頁的剩余字節數!!!	 
void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
 	u16 i;  
    SPI_FLASH_Write_Enable();                  //SET WEL 
	SPI_FLASH_CS=0;                            //使能器件   
    SPIx_ReadWriteByte(W25X_PageProgram);      //發送寫頁命令   
    SPIx_ReadWriteByte((u8)((WriteAddr)>>16)); //發送24bit地址    
    SPIx_ReadWriteByte((u8)((WriteAddr)>>8));   
    SPIx_ReadWriteByte((u8)WriteAddr);   
    for(i=0;i<NumByteToWrite;i++)SPIx_ReadWriteByte(pBuffer[i]);//循環寫數  
	SPI_FLASH_CS=1;                            //取消片選 
	SPI_Flash_Wait_Busy();					   //等待寫入結束
} 
//無檢驗寫SPI FLASH 
//必須確保所寫的地址范圍內的數據全部為0XFF,否則在非0XFF處寫入的數據將失敗!
//具有自動換頁功能 
//在指定地址開始寫入指定長度的數據,但是要確保地址不越界!
//pBuffer:數據存儲區
//WriteAddr:開始寫入的地址(24bit)
//NumByteToWrite:要寫入的字節數(最大65535)
//CHECK OK
void SPI_Flash_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{ 			 		 
	u16 pageremain;	   
	pageremain=256-WriteAddr%256; //單頁剩余的字節數		 	    
	if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//不大于256個字節
	while(1)
	{	   
		SPI_Flash_Write_Page(pBuffer,WriteAddr,pageremain);
		if(NumByteToWrite==pageremain)break;//寫入結束了
	 	else //NumByteToWrite>pageremain
		{
			pBuffer+=pageremain;
			WriteAddr+=pageremain;	

			NumByteToWrite-=pageremain;			  //減去已經寫入了的字節數
			if(NumByteToWrite>256)pageremain=256; //一次可以寫入256個字節
			else pageremain=NumByteToWrite; 	  //不夠256個字節了
		}
	};	    
} 
//寫SPI FLASH  
//在指定地址開始寫入指定長度的數據
//該函數帶擦除操作!
//pBuffer:數據存儲區
//WriteAddr:開始寫入的地址(24bit)
//NumByteToWrite:要寫入的字節數(最大65535)  		   
u8 SPI_FLASH_BUF[4096];
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{ 
	u32 secpos;
	u16 secoff;
	u16 secremain;	   
 	u16 i;    

	secpos=WriteAddr/4096;//扇區地址 0~511 for w25x16
	secoff=WriteAddr%4096;//在扇區內的偏移
	secremain=4096-secoff;//扇區剩余空間大小   

	if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096個字節
	while(1) 
	{	
		SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//讀出整個扇區的內容
		for(i=0;i<secremain;i++)//校驗數據
		{
			if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除  	  
		}
		if(i<secremain)//需要擦除
		{
			SPI_Flash_Erase_Sector(secpos);//擦除這個扇區
			for(i=0;i<secremain;i++)	   //復制
			{
				SPI_FLASH_BUF[i+secoff]=pBuffer[i];	  
			}
			SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//寫入整個扇區  

		}else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//寫已經擦除了的,直接寫入扇區剩余區間. 				   
		if(NumByteToWrite==secremain)break;//寫入結束了
		else//寫入未結束
		{
			secpos++;//扇區地址增1
			secoff=0;//偏移位置為0 	 

		   	pBuffer+=secremain;  //指針偏移
			WriteAddr+=secremain;//寫地址偏移	   
		   	NumByteToWrite-=secremain;				//字節數遞減
			if(NumByteToWrite>4096)secremain=4096;	//下一個扇區還是寫不完
			else secremain=NumByteToWrite;			//下一個扇區可以寫完了
		}	 
	};	 	 
}
//擦除整個芯片
//整片擦除時間:
//W25X16:25s 
//W25X32:40s 
//W25X64:40s 
//等待時間超長...
void SPI_Flash_Erase_Chip(void)   
{                                             
    SPI_FLASH_Write_Enable();                  //SET WEL 
    SPI_Flash_Wait_Busy();   
  	SPI_FLASH_CS=0;                            //使能器件   
    SPIx_ReadWriteByte(W25X_ChipErase);        //發送片擦除命令  
	SPI_FLASH_CS=1;                            //取消片選     	      
	SPI_Flash_Wait_Busy();   				   //等待芯片擦除結束
}   
//擦除一個扇區
//Dst_Addr:扇區地址 0~511 for w25x16
//擦除一個山區的最少時間:150ms
void SPI_Flash_Erase_Sector(u32 Dst_Addr)   
{   
	Dst_Addr*=4096;
    SPI_FLASH_Write_Enable();                  //SET WEL 	 
    SPI_Flash_Wait_Busy();   
  	SPI_FLASH_CS=0;                            //使能器件   
    SPIx_ReadWriteByte(W25X_SectorErase);      //發送扇區擦除指令 
    SPIx_ReadWriteByte((u8)((Dst_Addr)>>16));  //發送24bit地址    
    SPIx_ReadWriteByte((u8)((Dst_Addr)>>8));   
    SPIx_ReadWriteByte((u8)Dst_Addr);  
	SPI_FLASH_CS=1;                            //取消片選     	      
    SPI_Flash_Wait_Busy();   				   //等待擦除完成
}  
//等待空閑
void SPI_Flash_Wait_Busy(void)   
{   
	while ((SPI_Flash_ReadSR()&0x01)==0x01);   // 等待BUSY位清空
}  
//進入掉電模式
void SPI_Flash_PowerDown(void)   
{ 
  	SPI_FLASH_CS=0;                            //使能器件   
    SPIx_ReadWriteByte(W25X_PowerDown);        //發送掉電命令  
	SPI_FLASH_CS=1;                            //取消片選     	      
    delay_us(3);                               //等待TPD  
}   
//喚醒
void SPI_Flash_WAKEUP(void)   
{  
  	SPI_FLASH_CS=0;                            //使能器件   
    SPIx_ReadWriteByte(W25X_ReleasePowerDown);   //  send W25X_PowerDown command 0xAB    
	SPI_FLASH_CS=1;                            //取消片選     	      
    delay_us(3);                               //等待TRES1
}   


























?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲色图欧美在线| 国产欧美一区二区三区沐欲| 成人在线综合网站| 青青草91视频| 麻豆免费精品视频| 日本特黄久久久高潮| 午夜精品成人在线| 午夜欧美电影在线观看| 亚洲午夜久久久久久久久久久 | 8v天堂国产在线一区二区| 99re成人精品视频| 色哟哟一区二区| 色哟哟精品一区| 欧美性大战久久久久久久| 欧美午夜精品久久久久久孕妇| 欧美综合色免费| 欧美三级一区二区| 日韩欧美国产麻豆| 国产拍揄自揄精品视频麻豆| 欧美激情一区二区三区在线| 中文字幕亚洲区| 亚洲免费av高清| 奇米精品一区二区三区在线观看| 青青国产91久久久久久| 韩国成人在线视频| 成人国产精品免费| 欧美日韩一区精品| 日韩欧美中文字幕制服| 久久久精品天堂| 美女免费视频一区二区| 国产精品白丝av| 成人小视频在线| 欧美系列日韩一区| 久久久久久久久久电影| 亚洲欧美在线视频观看| 日韩精品电影一区亚洲| 国产一区二区福利| 色乱码一区二区三区88| 日韩精品一区二区三区在线观看| 国产欧美日韩久久| 亚洲mv大片欧洲mv大片精品| 国产一区二区在线免费观看| 色综合亚洲欧洲| 精品久久久久99| 亚洲美女屁股眼交3| 麻豆中文一区二区| 91福利在线免费观看| 精品免费视频一区二区| 亚洲欧美国产高清| 国产一区福利在线| 欧美日韩五月天| 国产精品久线观看视频| 麻豆成人免费电影| 欧美日韩在线播放| 亚洲欧美日韩人成在线播放| 国产美女一区二区| 91精品国产福利在线观看| 亚洲欧美另类图片小说| 国产成人高清在线| 精品福利一区二区三区免费视频| 亚洲最新视频在线观看| 99久久婷婷国产综合精品电影| 亚洲精品一区二区三区影院| 一区二区免费在线播放| 不卡av在线网| 欧美极品另类videosde| 久久99精品久久久| 欧美一级欧美三级在线观看| 亚洲一区二区欧美日韩| 在线视频你懂得一区| 18成人在线观看| 国产精品一区免费在线观看| 欧美精三区欧美精三区| 国产精品国产a级| 国产麻豆91精品| 久久婷婷久久一区二区三区| 偷窥国产亚洲免费视频| 91猫先生在线| 国产三级欧美三级日产三级99| 首页综合国产亚洲丝袜| 欧美色图天堂网| 亚洲美腿欧美偷拍| 99国产精品久久久| 2023国产一二三区日本精品2022| 亚洲国产中文字幕| 97久久久精品综合88久久| 国产欧美精品一区二区色综合| 久久精品国产99| 欧美一区午夜视频在线观看 | 国产精品久久久久久久久免费樱桃| 美女性感视频久久| 在线视频中文字幕一区二区| 中文字幕亚洲在| 成人小视频免费在线观看| 亚洲精品在线观看网站| 美女脱光内衣内裤视频久久影院| 精品视频1区2区| 亚洲一区二区3| 日本高清免费不卡视频| 中文字幕一区二区三区乱码在线| 91亚洲精华国产精华精华液| 国产精品视频观看| 99re这里都是精品| 一区二区三区四区精品在线视频 | 精品欧美一区二区在线观看| 亚洲最新视频在线播放| 日韩欧美电影一二三| 男人的天堂久久精品| 精品区一区二区| 国产成人免费在线观看不卡| 国产精品嫩草影院com| aaa亚洲精品| 亚洲一区二区欧美激情| 777a∨成人精品桃花网| 天堂成人国产精品一区| 精品国产免费久久| 国产精品中文字幕欧美| 国产精品久99| 欧美日韩第一区日日骚| 国模无码大尺度一区二区三区| 国产亚洲精品aa| 97se亚洲国产综合自在线| 亚洲国产wwwccc36天堂| 99久久久无码国产精品| 美美哒免费高清在线观看视频一区二区 | 精品一区二区三区蜜桃| 国产精品理伦片| 欧美日韩国产电影| 国产真实乱偷精品视频免| 综合激情成人伊人| 欧美一区在线视频| 不卡在线视频中文字幕| 久久99精品久久久久久动态图| 中文字幕在线不卡| 5566中文字幕一区二区电影| 国产米奇在线777精品观看| 一区二区不卡在线播放 | 亚洲精品日韩一| 91精品福利在线一区二区三区 | 3d动漫精品啪啪1区2区免费| 国产精品88888| 一区二区三区中文免费| 欧美一区二区在线播放| av在线播放一区二区三区| 日本伊人精品一区二区三区观看方式| 亚洲精品一区二区三区在线观看| 欧美午夜一区二区三区免费大片| 国产一区二区三区四| 婷婷久久综合九色综合绿巨人| 久久精品人人做人人综合| 欧美嫩在线观看| 成人免费视频网站在线观看| 成人一区二区三区视频在线观看 | 欧美国产欧美综合| 911精品产国品一二三产区| 欧美网站大全在线观看| av电影在线观看一区| 国产91精品露脸国语对白| 日韩激情一二三区| 亚洲精品高清在线观看| 亚洲欧美视频在线观看视频| 国产欧美一区二区精品性色超碰| 日韩午夜精品视频| 色综合久久综合网| 国产成人综合自拍| 麻豆精品一区二区| 日韩1区2区3区| 亚洲一区二区视频| 久久国产精品99精品国产| 亚洲国产日韩一区二区| 亚洲卡通欧美制服中文| 亚洲欧美另类在线| 欧美经典一区二区| 亚洲欧美激情在线| 亚洲欧美国产毛片在线| 亚洲欧美国产高清| 亚洲一区在线观看免费观看电影高清| 中文字幕视频一区二区三区久| 国产精品久久久久精k8| 中文字幕一区免费在线观看| 国产精品视频看| 国产精品天干天干在观线| 国产精品久久久久久久岛一牛影视| 国产欧美一区二区精品性| 国产精品色哟哟网站| 亚洲欧美日韩久久精品| 亚洲午夜免费电影| 日本vs亚洲vs韩国一区三区二区 | 国产不卡免费视频| 国产美女精品在线| 成人av资源网站| 97精品电影院| 欧美乱熟臀69xxxxxx| 精品精品欲导航| 精品sm捆绑视频| 国产精品久久久久一区二区三区 | 亚洲国产一区二区在线播放| 水野朝阳av一区二区三区| 精品无人区卡一卡二卡三乱码免费卡 | 成人免费观看视频|