亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
精品日产卡一卡二卡麻豆| 国产高清不卡一区二区| 一本大道久久a久久精二百| 亚洲欧洲美洲综合色网| 岛国av在线一区| 久久精品亚洲国产奇米99| 高清久久久久久| 日本一区免费视频| 麻豆一区二区三| 久久久精品免费免费| 国产一区二区三区在线观看免费视频| 久久嫩草精品久久久精品一| 夫妻av一区二区| 亚洲丝袜制服诱惑| 911精品产国品一二三产区| 午夜精品福利一区二区三区蜜桃| 欧美日韩免费一区二区三区视频| 日本不卡1234视频| 久久综合九色欧美综合狠狠 | 日韩精品三区四区| 日韩欧美区一区二| 国产成人综合精品三级| 欧美精品一区二区三区蜜臀 | 日韩国产精品久久久| 成人性生交大片免费看中文网站| 久久久久国产精品人| 91色九色蝌蚪| 亚洲国产视频一区| 色综合色狠狠天天综合色| 视频在线观看国产精品| 亚洲精品一区在线观看| 精品综合久久久久久8888| 久久久国际精品| 在线欧美日韩精品| 精品少妇一区二区| 国产成人午夜精品影院观看视频| 亚洲美女少妇撒尿| 欧美一卡2卡3卡4卡| 国产一区二区三区免费| 亚洲一线二线三线久久久| 日韩一区二区免费在线电影| 美女脱光内衣内裤视频久久网站 | 99久久久久久| 亚洲国产精品嫩草影院| 国产日韩av一区| 欧美日韩一区二区不卡| 久久9热精品视频| 亚洲另类春色校园小说| 日韩一级大片在线| 白白色亚洲国产精品| 天天操天天色综合| 国产精品久久看| 精品国产乱码久久久久久久| 色综合久久久久综合| 麻豆成人91精品二区三区| 香蕉久久一区二区不卡无毒影院| 久久久久9999亚洲精品| 欧美亚洲另类激情小说| 激情文学综合插| 亚洲成人一区二区在线观看| 欧美国产视频在线| 欧美一卡在线观看| 欧美一级一区二区| 欧美性猛片aaaaaaa做受| 99久久国产免费看| 国产麻豆精品一区二区| 亚洲成av人片在www色猫咪| 一区二区三区中文字幕在线观看| 亚洲精品一区二区三区99| 欧美日韩中文一区| 欧美主播一区二区三区| 99精品久久久久久| 午夜天堂影视香蕉久久| 亚洲资源中文字幕| 国产精品久久久久久久久免费相片| 久久先锋影音av| 日韩免费观看2025年上映的电影| 欧美性一区二区| 在线精品观看国产| 99久久伊人精品| www.综合网.com| 99久久精品免费看国产免费软件| 国产精品亚洲专一区二区三区 | 国产精品538一区二区在线| 免播放器亚洲一区| 久久99久久99小草精品免视看| 亚洲电影激情视频网站| 亚洲午夜久久久久久久久久久 | 欧美无砖专区一中文字| 91免费精品国自产拍在线不卡| 不卡的电影网站| 成人av免费在线播放| 大桥未久av一区二区三区中文| 成熟亚洲日本毛茸茸凸凹| 国产精品一二三在| 国产自产高清不卡| 成人久久18免费网站麻豆 | 欧美人伦禁忌dvd放荡欲情| 色婷婷久久综合| 一本到高清视频免费精品| 精品视频1区2区3区| 91.com在线观看| 精品久久久久久久久久久久久久久 | 亚洲卡通动漫在线| 一区二区高清免费观看影视大全 | 国产精品一区二区三区99| 日韩va欧美va亚洲va久久| 日韩成人一区二区三区在线观看| 日本系列欧美系列| 国产成人精品亚洲午夜麻豆| 成人激情电影免费在线观看| 成人免费毛片片v| 欧美剧在线免费观看网站| 日韩一本二本av| 久久久久久久电影| 午夜在线成人av| 九九精品视频在线看| www.欧美亚洲| 精品1区2区3区| 久久久一区二区三区| 亚洲免费观看高清完整版在线| 亚洲制服丝袜av| 久久 天天综合| 日本久久一区二区三区| 日韩欧美激情一区| 欧美精品一区二区三区很污很色的 | 成人免费观看av| 狠狠色丁香久久婷婷综合_中| 91一区二区在线| 欧美天堂亚洲电影院在线播放| 7777精品伊人久久久大香线蕉经典版下载 | 高清久久久久久| 91久久久免费一区二区| 欧美一区日本一区韩国一区| 在线免费不卡视频| 6080日韩午夜伦伦午夜伦| 国产精品嫩草影院av蜜臀| 国产精品久久久久精k8| 亚洲精品国产视频| 国产成人午夜高潮毛片| 欧美日韩在线电影| 国产精品蜜臀av| 免费成人在线网站| 91同城在线观看| 国产亚洲欧美一级| 午夜激情一区二区三区| 成人看片黄a免费看在线| 精品处破学生在线二十三| 亚洲最大成人网4388xx| 精久久久久久久久久久| 欧美高清一级片在线| 亚洲欧美日韩在线| 国产精品一线二线三线| 精品国产自在久精品国产| 亚洲一区二区高清| 极品少妇xxxx精品少妇偷拍| 日韩精品一区在线| 亚洲国产精品嫩草影院| 大胆欧美人体老妇| 欧美变态凌虐bdsm| 五月婷婷色综合| 欧美精品久久99久久在免费线| 亚洲欧美日韩国产手机在线 | 国产日产欧美一区| 极品少妇xxxx偷拍精品少妇| 日韩女优电影在线观看| 亚洲狠狠爱一区二区三区| 91天堂素人约啪| 亚洲综合区在线| 91免费看视频| 国产欧美精品一区二区三区四区| 狠狠网亚洲精品| 欧美大片免费久久精品三p| 亚洲一区精品在线| 欧美喷潮久久久xxxxx| 一区二区三区在线免费观看| 91年精品国产| 亚洲三级免费观看| 99精品热视频| 一区二区三区鲁丝不卡| 91久久精品网| 一区二区三区欧美久久| 欧美日韩国产一级| 日本在线不卡视频| 欧美丝袜自拍制服另类| 视频在线观看国产精品| 日韩亚洲欧美一区二区三区| 中文字幕的久久| 色网站国产精品| 一级做a爱片久久| 欧美日韩国产欧美日美国产精品| 日日摸夜夜添夜夜添精品视频| 欧美精品一二三| 国产一区在线观看视频| 国产欧美一区二区精品仙草咪 | 中文字幕精品—区二区四季| 色欧美片视频在线观看在线视频| 午夜精品福利一区二区蜜股av| 欧美成人一区二区三区在线观看| 国产成人aaaa|