STM32使用W25QXX flash闪存芯片基于串口自由写入或读取数据

先上效果图

STM32使用W25QXX flash闪存芯片基于串口自由写入或读取数据_第1张图片

代码

主程序

#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "stdio.h"
#include "w25qxx.h"


int main(void){

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init();
	uart_init(115200);
	W25QXX_Init();			//W25QXX初始化
	
	
	while(W25QXX_ReadID()!=W25Q16){								//检测不到W25Q16
		delay_ms(1000);
		printf("未检测到W25Q16,请检查!\r\n");
	}
	
	
	while(1){
		w25q16_SHUJU_CHULI();
	}
	   
}

w25qxx.c串口协议程序

#include "w25qxx.h" 
#include "spi.h"
#include "delay.h"
#include "usart.h"

#define MINGLIN 1
#define DIZHI 2
#define SHUJU 3

//要写入到W25Q64的字符串数组
u8 W25Q16_DATA[256];
u8 tishi_bit=9;
u8 r_w=0;
u8 state=MINGLIN;

u16 i=0;
u32 addr;
u8 datatemp[256];
u32 FLASH_SIZE=16*1024*1024;	//FLASH 大小为16M bit  /  2M字节 

void  w25q16_RXBUF_HANDLE(void){
	static u8 k=0;
	u8 Res;
	Res = USART_ReceiveData(USART1);	//读取接收到的数据
	
	if(state==MINGLIN){
		if(Res=='r'){
			k=0;
			r_w=1;
			state=DIZHI;
		}
		else if(Res=='w'){
			k=0;
			r_w=2;
			state=DIZHI;
		}	
	}
	else if(state==DIZHI){
		W25Q16_DATA[k]=Res;
		k++;
		if(k==6){
			k=0;
			tishi_bit=1;
		}
	}
	else if(state==SHUJU){
		if(k>2){
			if((Res=='=')&&(W25Q16_DATA[k-3]=='=')&&(W25Q16_DATA[k-2]=='=')&&(W25Q16_DATA[k-1]=='=')){
				W25Q16_DATA[k-3]='\0';
				tishi_bit=4;
				k=0;
			}
			else{
				W25Q16_DATA[k]=Res;
				k++;
			}
		}
		else{
			W25Q16_DATA[k]=Res;
			k++;
		}
	}
}


void w25q16_SHUJU_CHULI(void){
	
	if(tishi_bit==9){
		printf("请输入读或写指令与地址(000000--ffffff) { r000000或 w000000 }\r\n");
		state=MINGLIN;
		tishi_bit=0;
	}
	else if(tishi_bit==1){
		addr |= ((u32)W25Q16_DATA[0]-48)<<20;
		addr |= ((u32)W25Q16_DATA[1]-48)<<16;
		addr |= ((u32)W25Q16_DATA[2]-48)<<12;
		addr |= ((u32)W25Q16_DATA[3]-48)<<8;
		addr |= ((u32)W25Q16_DATA[4]-48)<<4;
		addr |= ((u32)W25Q16_DATA[5]-48);
		if(r_w==1){
			W25QXX_Read(W25Q16_DATA,addr,255);
			printf("地址:%X处的数据为:\r\n\r\n",addr);
			printf("%s\r\n\r\n",W25Q16_DATA);
			tishi_bit=9;
			r_w=0;
			state=MINGLIN;
			addr=0;
		}
		else if(r_w==2){
			printf("请输入要在地址:%X  处写入的数据,并以四个“====”结束\r\n",addr);
			tishi_bit=0;
			r_w=0;
			state=SHUJU;
		}
	}
	else if(tishi_bit==4){
		printf("已在地址:%X  处成功写入数据\r\n",addr);
		W25QXX_Write(W25Q16_DATA,addr,255);	
		tishi_bit=9;
		state=MINGLIN;
		addr=0;
	}
}

该串口协议程序现仅默认单次最大输入数据为255字节;且每次读取或写入W25QXX flash闪存芯片也默认为255字节;如需修改更大数据,请修改u8 W25Q16_DATA[256]数组缓存的大小,以及W25QXX_Write(W25Q16_DATA,addr,255)
W25QXX_Read(W25Q16_DATA,addr,255)
两个函数最后的一个数值,代表写入数据量的大小

你可能感兴趣的:(笔记,stm32,c语言)