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

先上效果图

你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

代码

主程序

#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)
两个函数最后的一个数值,代表写入数据量的大小

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LG小龙哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值