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的串口数据

推荐阅读最新更新时间:2024-11-09 22:54

STM32电源框架图解析
STM32的工作电压(VDD )为2.0~3.6V,通过内置的电压调节器提供所需的1.8V电源,当主电源VDD 掉电后,通过VBAT 脚为实时时钟(RTC)和备份寄存器提供电源(下图为STM32F1系列电源框架图,STM32基本大同小异) 1、 名词解释 可以看到上图有VDD、VSS、VDDA、VSSA、VREF+等标识,这些是什么意思呢?有什么特点呢?如何看懂STM32系统的电源框架图呢? 首先对名词进行解析,如下所示: VCC 电路的供电正电压 VDDD 芯片的工作数字正电压 GND 电路的供电负电压 VSSD 芯片的工作数字正电压 VDD 芯片的工作正电压 VREF+ ADC基准参考正电压 VSS 芯片的工作负
[单片机]
<font color='red'>STM32</font>电源框架图解析
STM32学习之路(六)——AD转换
ADC输入通道管理模式可分为规则组和注入组。规则组指正常的转换;而注入组是由外部触发或者软件触发,打断正常的规则组转换。规则组可以是某单一的通道,也可以是某几个通道的组合。多通道的转换次序可编程,转换次序长度最大为16,注入通道最长为4. 1、单词转换模式,即可以通过设置ADC_CR2寄存器的ADON位(只适用于规则通道)启动,也可通过外部触发启动(都适用),此时CONT位为0. 规则通道被转换后:数据存储在ADC_DR中 EOC(转换结果)标志置位 设置了EOCIE,则产生中断 注入通道被转换后:数据存储在ADC_DRJ1中
[单片机]
STM32中对GPIO的配置与使用
其实学习单片机最先熟悉的无非就是I/O口的操作。STM32的GPIO也好理解,就8种模式。了解什么功能使用什么模式,怎么配置就可以了。废话不多说,了解一下GPIO口吧。学习时大家应该都有资料,我就不多贴资料了,下图是GPIO(STM32F10x)的电路图。(51的I/O口不需要配置,电平输送不但简单,而且不能像GPIO集成各种协议一起使用,如SPI,SPI协议后面也会介绍) 我大致将配置模式介绍一下,并将使用该模式的功能也对应一下 输入模式:(相对MCU) 1. 浮空--外部输入何种电平,该引脚就是何种电平。 结构体模式配置:GPIO_Mode_IN_FLOATING 2.上拉--顾名思义,接VDD的开关开启,接上上拉
[单片机]
“看门狗“VS“打狗棒”,谁胜谁负?(STM32篇)—MCU抗干扰实验系列专题(3)
在上两期文章和视频中,为了公平起见,所有的MCU使用的是同一个工程程序,(不同的MCU,时钟和GPIO的配置略有不同,使用宏定义区分MCU),除了使用滴答时钟和基本GPIO操作外,没有任何抗干扰手段,全靠MCU内部自身的抗干扰能力进行的测试。结果,只有芯源CW32MCU没有彻底死机外,其它均有死机现象。 这种死机现象,在我们实际开发产品时,是禁止发生的。为了对付这种干扰,除了硬件上有些技术对策,那软件上又有些什么呢? 当然是我们最熟悉的看门狗了。“看门狗”这个神器在“古老的年代”51时期,那是没有的,需要在外面加一个“昂贵”的芯片来实现。当然,现在新时代,所有的ARM MCU基本上都标配了看门狗外设。 看门狗是啥,我们来看一下
[单片机]
“看门狗“VS“打狗棒”,谁胜谁负?(<font color='red'>STM32</font>篇)—MCU抗干扰实验系列专题(3)
STM32F103C8T6中断特征介绍 用按钮为STM32 MCU触发一个中断
中断是MCU的特征之一,STM32F103C8T6也不例外。以下通过STM32F103C8T6 Blue Pill外接一个按钮,向MCU触发外部中断。 STM32F103C8T6中断特征 中断有硬件中断和软件中断两种,当一个中断发生时,相应的中断服务程序(ISR)和中断处理程序就开始运行了。其中,ISR的指令必须尽可能小,ISR中也不能出现delay ()之类的阻塞函数。 STM32 Blue Pill或者STM32F103C8T6 MCU指定NVIC来管理所有外部中断和外设中断,其应用采用了Arduino IDE。因此,我们可使用相同的句法来配置外部中断,这可通过以下称作 “attachInterrupt ()” 的句法
[单片机]
STM32F103C8T6中断特征介绍 用按钮为<font color='red'>STM32</font> MCU触发一个中断
基于AD9854与STM32设计的频率特性测试仪
随着现代电子技术的飞速发展,频率特性测试仪作为现代电子测量领域的一种重要工具,其设计理念也在不断地革新。频率特性测试仪是一种测试网络或者电路的频率特性的仪器,又称扫频仪;可以用来测量信号传输网络、信号放大电路及滤波电路等双端口网络的幅频特性与相频特性。由于在传统的扫频仪设计方法中,被测网络幅频特性与相频特性的获取,需要通过不同的电路模块分别进行峰值检测与相位差测量,导致其系统由多个模块构成,电路复杂且体积较大。因此本文设计了一种新的频率特性测试仪,其采用直接频率合成(DDS)芯片AD9854产生正交扫频信号,并以低功耗单片机STM32作为任务控制与数据处理的核心部件。 1.总体方案 该频率特性测试仪的设计基于零中频正交解调原
[单片机]
基于AD9854与<font color='red'>STM32</font>设计的频率特性测试仪
STM32基于固件库学习笔记(12)LCD5110显示
前不久使用cc2530写过LCD5110作显示,最近学习stm32就简单的写了,用stm32对lcd5110的初始化及显示功能。 还是和之前写了两种显示的方法: 万能显示(行数要/8,详细见后的数据手册) /* 这个函数可以自己设定显示的内容的大小,需用取模软件得到待显示的数据; 在取模时需注意取模方式,我这里所有的取模都设置是(纵向取模、字节倒序)方式 */ // 设置 X,Y起点; 行(/8)、列大小 数组地址名 void LCD_display(unsigned char X,unsigned char Y,unsigned char row,unsigned char col,unsigned char
[单片机]
<font color='red'>STM32</font>基于固件库学习笔记(12)LCD5110显示
stm32小容量、中容量和大容量产 在选择启动文件时该怎么选
如下图所示,根据flash 的大小将芯片分为大容量 中容量 小容量 可以想象 ,对应的启动文件肯定也分为大容量 中容量 小容量 来看看3.5 的标准库自带的启动文件 根据字面意思, hd(High Density )是大容量, md(Medium Density ) 是中容量 ld (Low Density ) 是小容量 可是启动不止三个,大中小之外还有后面跟vl后缀的 并且还有后缀cl 和 xl 的文件。 解释一下 CL:connective line 指的是互联型产品 stm32f105xx和stm32f107xx 系列 Xl :extreme line 超高密度型 产品 这种应该
[单片机]
<font color='red'>stm32</font>小容量、中容量和大容量产 在选择启动文件时该怎么选
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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