先上效果图 【笔记|STM32使用W25QXX flash闪存芯片基于串口自由写入或读取数据】
文章图片
代码 主程序
#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字节 voidw25q16_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)
两个函数最后的一个数值,代表写入数据量的大小
推荐阅读
- 微服务相关教程分享-前言
- C语言|C语言系列(一)(C语言程序概述)
- 笔记|BYOL(Bootstrap your own latent A new approach to self-supervised Learning)算法笔记
- 笔记|java集合
- 笔记|RL强化学习笔记(OpenAI gym建立自己的探索环境)
- 【无标题】
- 蓝桥杯|第十一届蓝桥杯大赛软件类省赛第二场 Java 大学 B 组试题 C: 蛇形填数——投机取巧法
- 单片机|点灯科技esp32函数库+Arduino环境配置+DHT11温湿度
- 智能车|电磁循迹智能车基于stm32cubeMX、HAL库—我的第一辆智能车