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

先上效果图 【笔记|STM32使用W25QXX flash闪存芯片基于串口自由写入或读取数据】笔记|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)
两个函数最后的一个数值,代表写入数据量的大小

    推荐阅读