STM32 SPI读写W25Q64(三)

发布者:Zhenai5201314最新更新时间:2024-03-29 来源: elecfans关键字:STM32  SPI读写  W25Q64 手机看文章 扫描二维码
随时随地手机看文章

GPIO口模拟SPI读写W25Q64的基本内容已经跟大家介绍完了,今天跟大家介绍下如何通过串口接收文件并保存到W25Q64中。


由于文件是通过串口中断接收的,如果只定义一个缓冲区,有可能缓冲区的内容在写入W25Q64时就被串口中断接收到的内容覆盖,造成数据丢失,所以通过定义两个缓冲区,分时进行接收和保存数据。



串口中断及变量定义


u8 Usart1_buf[2][USART1_BUF_SIZE] = {0};

u8 Usart1_OK = 0;



u16 cnt = 0;

u8 recStart = 0;

u8 timeout = 0;

u8 pos = 0;

void USART1_IRQHandler()

{

  recStart = 1;

  timeout = 0;


  if((USART1- >SR & (1< < 5)) != 0)    //接收中断

  {

    Usart1_buf[pos][cnt] = USART1- >DR;

    cnt++;

    if(cnt == USART1_BUF_SIZE)

    {

      Usart1_OK = 1;

      cnt = 0;

      pos++;

      pos%=2;

    }  

  }

  else

    USART1- >SR = 0;

}

主函数通过判断接收中断存储串口中断缓冲区数据到W25Q64。并判断接收数据是否超时作为文件接收完成的标志。接收完成后将保存到W25Q64的内容全部读取并打印到串口。


#include 'stm32f4xx.h'

#include 'led.h'

#include 'core_cm4.h'

#include 'usart.h'

#include 'delay.h'

#include 'stdio.h'

#include 'W25Q64.h'



int main()

{

  u32 add = 0;

  u16 i = 0;


  NVIC_SetPriorityGrouping(5);    //4层嵌套,4个响应优先级

  Usart1_Init(115200);  

  W25Q64_Init();


  printf('擦除扇区0、1......rn');

  W25Q64_SectorErase(0);          

  W25Q64_SectorErase(4096);

  printf('擦除完成,请发文件!rn');


  while(1)

  {    

    if(Usart1_OK == 1)

    {  

      Usart1_OK = 0;


      if(pos == 0)  //写缓冲区1

        W25Q64_PageProgram(add,Usart1_buf[1],256);

      else if(pos == 1)  //写缓冲区0

         W25Q64_PageProgram(add,Usart1_buf[0],256);


      add += 256;

    }

    //      //判断是否超时

    if(recStart == 1)

    {

      Systick_Delayms(5);

      timeout++;

      if(timeout >10)

      {

        recStart = 0;

        timeout = 0;

        //存储最后一次接收到数据

        W25Q64_PageProgram(add,Usart1_buf[pos],cnt);

        printf('文件接收完毕!rn');


        add = 0;

        for(i=0;i< 24;i++)

        {

          W25Q64_ReadBytes(add,Usart1_buf[0],USART1_BUF_SIZE-1);

          Usart1_buf[0][USART1_BUF_SIZE-1] = '�';

          printf('%s',(const char *)Usart1_buf[0]);

          add += USART1_BUF_SIZE-1;

        }

      }

    }

  }

}

图片

编译后将程序烧入开发板,打开串口助手发送一个iic.c文件,发送完成后,串口助手接收到的内容和iic.c文件内容完全一致,串口接收文件并保存到W25Q64成功。

图片

关键字:STM32  SPI读写  W25Q64 引用地址:STM32 SPI读写W25Q64(三)

上一篇:STM32 LL库引脚第二功能的配置
下一篇:使用STM32解析Rd-03E的串口数据

推荐阅读最新更新时间:2026-03-20 17:57

STM32 SPI读写W25Q64(三)
GPIO口模拟SPI读写W25Q64的基本内容已经跟大家介绍完了,今天跟大家介绍下如何通过串口接收文件并保存到W25Q64中。 由于文件是通过串口中断接收的,如果只定义一个缓冲区,有可能缓冲区的内容在写入W25Q64时就被串口中断接收到的内容覆盖,造成数据丢失,所以通过定义两个缓冲区,分时进行接收和保存数据。 串口中断及变量定义 u8 Usart1_buf = {0}; u8 Usart1_OK = 0; u16 cnt = 0; u8 recStart = 0; u8 timeout = 0; u8 pos = 0; void USART1_IRQHandler() { recStart = 1; ti
[单片机]
<font color='red'>STM32</font> <font color='red'>SPI</font><font color='red'>读写</font><font color='red'>W25Q64</font>(三)
STM32SPI读写FLASH(W25Q64)
/* 名称:STM32之SPI读写FLASH(W25Q64) 说明: 1.对于SPI读写FLASH和I2C读写EEPROM很相似,都是通过一定的通信协议来操纵外部存储设备。我们需要按照对应的通信协议发送存储设备所支持的指令(如读指令、写指令等),然后等待存储设备根据主机所接收到的指令进行相应的动作。 2.再来说说不同点吧:对于通信协议来说,I2C相对来说要简单些,通信速度也稍微较慢些。而SPI串行通信协议则要相对复杂的多,当然其通信速度也要高不少。对于存储设备来说,EEPROM属于小容量的存储设备,支持字节擦除、页写入,现在一般用于存储小容量的数据;而FLASH属于大容量的存储设备,不支持字节擦除,只支持扇区擦除、块擦除
[单片机]
【STM32Cube-18】使用硬件QSPI读写SPI Flash(W25Q64
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件QSPI外设与 SPI Flash 通信(W25Q64)。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): SPI Flash 小熊派开发板板载一片SPI Flash,型号为 W25Q64,大小为 8 MB,最大支持 80 Mhz的操作频率。 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码; 准备一个串口调试助手,这里我使用的是Serial Port Utility; 2.生成MDK工程 选择芯片型号 打开STM32CubeM
[单片机]
【STM32Cube-18】使用硬件QSPI<font color='red'>读写</font><font color='red'>SPI</font> Flash(<font color='red'>W25Q64</font>)
STM32SPI读写FLASH
FLASH简介 FLASH俗称闪存,和EEPROM一样,都是掉电数据不丢失的非易失行存储器,但FLASH的存储容量普遍大于EEPROM,现在像如U盘、SD卡、SSD固态硬盘以及STM32芯片内部存储程序的设备都是FLASH类型的存储器。由此可见FLASH对于我们学习和工作的重要性,EEPROM可以实现单字节的擦写,而FLASH都是一大片的擦写,就像是大规模杀伤性武器,其最小擦除单位:扇区的大小也是4KB。 我们此次通过SPI对FLASH存储芯片W25Q64进行读写擦除的操作。 对于FLASH内部结构的详细说明博主会专门整理一篇博客来说明,所以关于FLASH芯片的相关原理,本文中只做简单说明,侧重代码部分。 FLASH详细说明的
[单片机]
<font color='red'>STM32</font>—<font color='red'>SPI</font><font color='red'>读写</font>FLASH
STM32 SPI方式读写SD卡
前段时间在51上模拟SPI实现了对SD卡的读取,效果还算不错,最近将其移植到STM32上,不过使用硬件SPI和使用软件SPI还是有差别的。 代码如下: void User_SPIInit(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1,ENABLE); //使能时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO
[单片机]
【GD32F470紫藤派开发板使用手册】第十一讲 SPI-SPI NOR FLASH读写实验
11.1实验内容 通过本实验主要学习以下内容: SPI简介 GD32 F470 SPI简介 SPI NOR FLASH——GD25Q32ESIGR简介 使用GD32F470 SPI 接口 实现对GD25Q32ESIGR的读写操作 11.2实验原理 11.2.1SPI简介 SPI(Serial Peripheral interface),顾名思义是串行外设接口,和 UART 不同的是,SPI是同步通讯接口,所以带有 时钟 线,而UART是异步通讯接口,不需要时钟线。 SPI通常使用4根线,分别为SCK、MOSI、MISO、NSS(CS): SCK:串列时脉,由主机发出 MOSI:主机输出从机输入 信号 (数据由主
[单片机]
【GD32F470紫藤派开发板使用手册】第十一讲 <font color='red'>SPI</font>-<font color='red'>SPI</font> NOR FLASH<font color='red'>读写</font>实验
SPI模式下MMC卡的读写机制
引言 多媒体卡MMC的特点是闪存功耗低,密度高,体积小,可靠性高,可擦除,可重写,容量大;内部控制电路,可以使用在手机、数码相机、MP3、PDA等多种数字设备上,可反复记录30万次,现在市场上的主流容量有128MB-2GB。 SPI最早是由摩托罗拉公司提出的一种串行总线接口,支持MCU与外设的双工、同步串行通信。由于其简单的接口设计,只用4根线即可完成所有的通信工作,因此被大部分的MCU芯片所支持。利用被广泛支持的SPI总线来进行MMC卡的读写,可解决没有MMC控制器的问题。 1 MMC卡 1.1 MMC卡的简介 MMC卡的面积为24mm×32mm,厚度为1.4mm,MMC卡的工作电压
[单片机]
<font color='red'>SPI</font>模式下MMC卡的<font color='red'>读写</font>机制
STM32F0xx_SPI读写(Flash)配置详细过程
Ⅰ、概述 关于SPI(Serial Peripheral Interface)串行外设接口可以说是单片机或者嵌入式软件开发人员必须掌握的一项通信方式,就是你在面试相关工作的时候都可能会问及这个问题。在这里问一个简单的问题:硬件SPI和软件模拟SPI的区别是有哪些?估计这个问题会问倒很多人。 SPI通信中分为SPI主机和从机,在实际应用中作为主机是比较常见的一种,因为SPI的通信速度远比I2C的通信速度大,所以现在市面上有很多SPI从设备。 本文SPI读写操作,以SPI通信的FLASH(25Q16)为从设备进行举例。串口发送10字节数据,接收满10字节自动保存,间隔500ms读写数据,通过串口打印出来。 Ⅱ、下载 文章提
[单片机]
STM32F0xx_<font color='red'>SPI</font><font color='red'>读写</font>(Flash)配置详细过程
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved