目录

 

一、STM32 的 SPI 特性及架构:

二、SPI 初始化结构体详解:

三、硬件SPI—读写串行 FLASH 实验


一、STM32 的 SPI 特性及架构:

1、引脚简介:

(1)   (Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、 CS,以下用 NSS 表示。

(2) SCK (Serial Clock): 时钟信号线,用于通讯数据同步。两个设备之间通讯时,通讯速率受限于低速设备。

(3) MOSI (Master Output, Slave Input): 主设备输出/从设备输入引脚。

(4) MISO(Master Input,, Slave Output): 主设备输入/从设备输出引脚。

2、STM32 的 SPI 通讯引脚:

       其中 SPI1SPI4SPI5SPI6 APB2 上的设备,最高通信速率达 45Mbtis/s, SPI2SPI3 APB1 上的设备,最高通信速率为 22.5Mbits/s。

3、通讯过程:

4、SPI 的四种模式:

       由 CPOL 及 CPHA 的不同状态, SPI 分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是“模式 0”与“模式 3”。

  • CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
  • CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时
  • CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿
  • CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿

5、 W25Q256内存划分情况:

W25Q256芯片:

每个芯片 0-511个块   --- 每个块64KB

每个块有 0-15个扇区 --- 每个扇区4KB

512块 X 64KB = 32768‬KB = 32M ( 32768‬KB / 1024 )

二、SPI 初始化结构体详解:

       STM32标准库提供了SPI初始化结构体初始化函数来配置SPI外设。初始化结构体及函数定义在库文件“stm32f4xx_spi.h”及“stm32f4xx_spi.c”中。

typedef struct 
{ uint16_t SPI_Direction;       /*设置 SPI 的单双向模式 */ 
uint16_t SPI_Mode;               /*设置 SPI 的主/从机端模式 */ 
uint16_t SPI_DataSize;           /*设置 SPI 的数据帧长度,可选 8/16 位 */ 
uint16_t SPI_CPOL;                /*设置时钟极性 CPOL,可选高/低电平*/ 
uint16_t SPI_CPHA;                /*设置时钟相位,可选奇/偶数边沿采样 */ 
uint16_t SPI_NSS;         /*设置 NSS 引脚由 SPI 硬件控制还是软件控制*/ 
uint16_t SPI_BaudRatePrescaler; /*设置时钟分频因子,fpclk/分频数=fSCK */ 
uint16_t SPI_FirstBit;           /*设置 MSB/LSB 先行 */ 
uint16_t SPI_CRCPolynomial;      /*设置 CRC 校验的表达式 */ 
} SPI_InitTypeDef;

(1) SPI_Direction
本成员设置 SPI 的通讯方向,可设置为双线全双工(SPI_Direction_2Lines_FullDuplex),双线只接收(SPI_Direction_2Lines_RxOnly),单线只接收(SPI_Direction_1Line_Rx)、单线只发送模式(SPI_Direction_1Line_Tx)。

(2) SPI_Mode
本成员设置 SPI 工作在主机模式(SPI_Mode_Master)或从机模式(SPI_Mode_Slave ),这两个模式的最大区别为 SPI 的 SCK 信号线的时序, SCK 的时序是由通讯中的主机产生的。若被配置为从机模式, STM32 的 SPI 外设将接受外来的 SCK 信号。

(3) SPI_DataSize
本成员可以选择 SPI 通讯的数据帧大小是为 8 位(SPI_DataSize_8b)或16 位(SPI_DataSize_16b)。

(4) SPI_CPOLSPI_CPHA


时钟极性 CPOL 成员,可设置为高电平(SPI_CPOL_High)或低电平(SPI_CPOL_Low )。
时钟相位 CPHA 则可以设置为 SPI_CPHA_1Edge(在 SCK 的奇数边沿采集数据) 或SPI_CPHA_2Edge (在 SCK 的偶数边沿采集数据) 。

(5) SPI_NSS
本成员配置 NSS 引脚的使用模式,可以选择为硬件模式(SPI_NSS_Hard )与软件模式(SPI_NSS_Soft ),在硬件模式中的 SPI 片选信号由 SPI 硬件自动产生,而软件模式则需要我们亲自把相应的 GPIO 端口拉高或置低产生非片选和片选信号。实际中软件模式应用比较多。

(6) SPI_BaudRatePrescaler

       本成员设置波特率分频因子,分频后的时钟即为 SPI 的 SCK 信号线的时钟频率。这个成员参数可设置为 fpclk 的 2、 4、 6、 8、 16、 32、 64、 128、 256 分频。

(7) SPI_FirstBit

       所有串行的通讯协议都会有 MSB 先行(高位数据在前)还是 LSB 先行(低位数据在前)的问题,而 STM32 的 SPI 模块可以通过这个结构体成员,对这个特性编程控制。

(8) SPI_CRCPolynomial
这是 SPI 的 CRC 校验中的多项式,若我们使用 CRC 校验时,就使用这个成员的参数(多项式),来计算 CRC 的值。

三、硬件SPI—读写串行 FLASH 实验

       FLSAH 存储器又称闪存,它与 EEPROM 都是掉电后数据不丢失的存储器,但 FLASH存储器容量普遍大于 EEPROM,现在基本取代了它的地位。

       我们生活中常用的 U 盘、 SD卡、 SSD 固态硬盘以及我们 STM32 芯片内部用于存储程序的设备,都是 FLASH 类型的存储器。在存储控制上,最主要的区别是 FLASH 芯片只能一大片一大片地擦写,而 EEPROM 可以单个字节擦写。

       一种使用 SPI 通讯的串行 FLASH 存储芯片的读写实验,实验中 STM32 的 SPI 外设采用主模式, 通过查询事件的方式来确保正常通讯。
1、硬件设计

       本实验中的 FLASH 芯片(型号: W25Q256)是一种使用 SPI 通讯协议的 NOR FLASH存储器,它的 CS/CLK/DIO/DO 引脚分别连接到了 STM32 对应的 SDI 引脚NSS/SCK/MOSI/MISO 上,其中 STM32 的 NSS 引脚是一个普通的 GPIO,不是 SPI 的专用NSS 引脚,所以程序中我们要使用软件控制的方式。
FLASH 芯片中还有 WP 和 HOLD 引脚。 WP 引脚可控制写保护功能,当该引脚为低电平时,禁止写入数据。我们直接接电源,不使用写保护功能。 HOLD 引脚可用于暂停通讯,该引脚为低电平时,通讯暂停,数据输出引脚输出高阻抗状态,时钟和数据输入引脚无效。
我们直接接电源,不使用通讯暂停功能。

2、软件设计

(1)编程要点

  1. 初始化通讯使用的目标引脚及端口时钟;
  2. 使能 SPI 外设的时钟;
  3. 配置 SPI 外设的模式、地址、速率等参数并使能 SPI 外设;
  4. 编写基本 SPI 按字节收发的函数;
  5. 编写对 FLASH 擦除及读写操作的的函数;
  6. 编写测试程序,对读写数据进行校验。

(2)代码分析
       ① SPI 硬件相关宏定义

//SPI 号及时钟初始化函数 
#define FLASH_SPI                          SPI5 
#define FLASH_SPI_CLK                      RCC_APB2Periph_SPI5 
#define FLASH_SPI_CLK_INIT                 RCC_APB2PeriphClockCmd 
//SCK 引脚 
#define FLASH_SPI_SCK_PIN                  GPIO_Pin_7 
#define FLASH_SPI_SCK_GPIO_PORT            GPIOF 
#define FLASH_SPI_SCK_GPIO_CLK             RCC_AHB1Periph_GPIOF 
#define FLASH_SPI_SCK_PINSOURCE            GPIO_PinSource7 
#define FLASH_SPI_SCK_AF                   GPIO_AF_SPI5 
//MISO 引脚 
#define FLASH_SPI_MISO_PIN                 GPIO_Pin_8 
#define FLASH_SPI_MISO_GPIO_PORT           GPIOF 
#define FLASH_SPI_MISO_GPIO_CLK            RCC_AHB1Periph_GPIOF 
#define FLASH_SPI_MISO_PINSOURCE           GPIO_PinSource8 
#define FLASH_SPI_MISO_AF                  GPIO_AF_SPI5 
//MOSI 引脚 
#define FLASH_SPI_MOSI_PIN                 GPIO_Pin_9 
#define FLASH_SPI_MOSI_GPIO_PORT           GPIOF 
#define FLASH_SPI_MOSI_GPIO_CLK            RCC_AHB1Periph_GPIOF 
#define FLASH_SPI_MOSI_PINSOURCE           GPIO_PinSource9 
#define FLASH_SPI_MOSI_AF                   GPIO_AF_SPI5 
//CS(NSS)引脚 
#define FLASH_CS_PIN                        GPIO_Pin_6 
#define FLASH_CS_GPIO_PORT                  GPIOF 
#define FLASH_CS_GPIO_CLK                   RCC_AHB1Periph_GPIOF //控制 CS(NSS)引脚输出低电平 
#define SPI_FLASH_CS_LOW()     {FLASH_CS_GPIO_PORT->BSRRH=FLASH_CS_PIN;} 
//控制 CS(NSS)引脚输出高电平 
#define SPI_FLASH_CS_HIGH()    {FLASH_CS_GPIO_PORT->BSRRL=FLASH_CS_PIN;}

       与 FLASH 通讯使用的 SPI 号 、引脚号、引脚源以及复用功能映射都以宏封装起来,并且定义了控制 CS(NSS)引脚输出电平的宏,以便配置产生起始和停止信号时使用。
       ② 初始化 SPI 的 GPIO

/**
* @brief  SPI_FLASH 初始化 
* @param 无 
* @retval 无 
*/ 
void SPI_FLASH_Init(void) 
{ 
GPIO_InitTypeDef GPIO_InitStructure; 
/* 使能 FLASH_SPI 及 GPIO 时钟 */ 
/*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO, 
SPI_FLASH_SPI_MISO_GPIO 和 SPI_FLASH_SPI_SCK_GPIO 时钟使能 */ RCC_AHB1PeriphClockCmd (FLASH_SPI_SCK_GPIO_CLK | FLASH_SPI_MISO_GPIO_CLK| 
FLASH_SPI_MOSI_GPIO_CLK|FLASH_CS_GPIO_CLK, ENABLE); 
/*!< SPI_FLASH_SPI 时钟使能 */ 
FLASH_SPI_CLK_INIT(FLASH_SPI_CLK, ENABLE); 
//设置引脚复用 GPIO_PinAFConfig(FLASH_SPI_SCK_GPIO_PORT,FLASH_SPI_SCK_PINSOURCE, 
FLASH_SPI_SCK_AF); GPIO_PinAFConfig(FLASH_SPI_MISO_GPIO_PORT,FLASH_SPI_MISO_PINSOURCE, 
FLASH_SPI_MISO_AF); GPIO_PinAFConfig(FLASH_SPI_MOSI_GPIO_PORT,FLASH_SPI_MOSI_PINSOURCE, 
FLASH_SPI_MOSI_AF); 
/*!< 配置 SPI_FLASH_SPI 引脚: SCK */ 
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_SCK_PIN; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 
GPIO_Init(FLASH_SPI_SCK_GPIO_PORT, &GPIO_InitStructure); 
/*!< 配置 SPI_FLASH_SPI 引脚: MISO */ 
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MISO_PIN; 
GPIO_Init(FLASH_SPI_MISO_GPIO_PORT, &GPIO_InitStructure); 
/*!< 配置 SPI_FLASH_SPI 引脚: MOSI */ 
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MOSI_PIN; 
GPIO_Init(FLASH_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure); 
/*!< 配置 SPI_FLASH_SPI 引脚: CS */ 
GPIO_InitStructure.GPIO_Pin = FLASH_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 
GPIO_Init(FLASH_CS_GPIO_PORT, &GPIO_InitStructure); 
/* 停止信号 FLASH: CS 引脚高电平*/ 
SPI_FLASH_CS_HIGH(); 
}

       向 GPIO 初始化结构体赋值,把 SCK/MOSI/MISO 引脚初始化成复用推挽模式。而CS(NSS)引脚由于使用软件控制,我们把它配置为普通的推挽输出模式

       ③ 配置 SPI 的模式

/** 
* @brief  SPI_FLASH 初始化 
* @param 无 
* @retval 无 
*/ 
void SPI_FLASH_Init(void) 
{ 
SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; 
/* 使能 FLASH_SPI 及 GPIO 时钟 */ 
/*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO, 
SPI_FLASH_SPI_MISO_GPIO,SPI_FLASH_SPI_SCK_GPIO 时钟使能 */ 
RCC_AHB1PeriphClockCmd (FLASH_SPI_SCK_GPIO_CLK |FLASH_SPI_MISO_GPIO_CLK|FLASH_SPI_MOSI_GPIO_CLK|FLASH_CS_GPIO_CLK, ENABLE); 
/*!< SPI_FLASH_SPI 时钟使能 */ 
//设置引脚复用
GPIO_PinAFConfig(FLASH_SPI_SCK_GPIO_PORT,FLASH_SPI_SCK_PINSOURCE,FLASH_SPI_SCK_AF); 
GPIO_PinAFConfig(FLASH_SPI_MISO_GPIO_PORT,FLASH_SPI_MISO_PINSOURCE,FLASH_SPI_MISO_AF); 
GPIO_PinAFConfig(FLASH_SPI_MOSI_GPIO_PORT,FLASH_SPI_MOSI_PINSOURCE,FLASH_SPI_MOSI_AF); /*!< 配置 SPI_FLASH_SPI 引脚: SCK */ 
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_SCK_PIN; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(FLASH_SPI_SCK_GPIO_PORT, &GPIO_InitStructure); /*!< 配置 SPI_FLASH_SPI 引脚: MISO */ 
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MISO_PIN; 
GPIO_Init(FLASH_SPI_MISO_GPIO_PORT, &GPIO_InitStructure); /*!< 配置 SPI_FLASH_SPI 引脚: MOSI */ 
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MOSI_PIN; 
GPIO_Init(FLASH_SPI_MOSI_GPIO_PORT, 
&GPIO_InitStructure); /*!< 配置 SPI_FLASH_SPI 引脚: CS */ 
GPIO_InitStructure.GPIO_Pin = FLASH_CS_PIN; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 
GPIO_Init(FLASH_CS_GPIO_PORT, &GPIO_InitStructure); /* 停止信号 FLASH: CS 引脚高电平*/ 
SPI_FLASH_CS_HIGH(); /* FLASH_SPI 模式配置 */ 
// FLASH 芯片 支持 SPI 模式 0 及模式 3,据此设置 CPOL CPHA 
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = 
SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = 
SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; 
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; 
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 
SPI_InitStructure.SPI_CRCPolynomial = 7; 
SPI_Init(FLASH_SPI, &SPI_InitStructure); /* 使能 FLASH_SPI  */ 
SPI_Cmd(FLASH_SPI, ENABLE); /* 使 SPI_FLASH 进入 4 字节地址模式 */ 
SPI_FLASH_Mode_Init(); 
}

         这段代码中,把 STM32 的 SPI 外设配置为主机端双线全双工模式,数据帧长度为 8位,使用 SPI 模式 3(CPOL=1, CPHA=1), NSS 引脚由软件控制以及 MSB 先行模式。最后一个成员为 CRC 计算式,由于我们与 FLASH 芯片通讯不需要 CRC 校验,并没有使能 SPI的 CRC 功能,这时 CRC 计算式的成员值是无效的。最后配置 W25Q256 进入 4 字节地址模式,默认是 3 字节地址模式。

       ④ 使用 SPI 发送和接收一个字节的数据

/*
* @brief 使用 SPI 发送一个字节的数据 
* @param byte:要发送的数据 
* @retval 返回接收到的数据 
*/ 
u8 SPI_FLASH_SendByte(u8 byte) 
{ 
SPITimeout = SPIT_FLAG_TIMEOUT; 
/* 等待发送缓冲区为空,TXE 事件 */ 
while (SPI_I2S_GetFlagStatus(FLASH_SPI, SPI_I2S_FLAG_TXE) == RESET) 
{ 
if ((SPITimeout--) == 0) 
return SPI_TIMEOUT_UserCallback(0); 
} /* 写入数据寄存器,把要写入的数据写入发送缓冲区 */ 
SPI_I2S_SendData(FLASH_SPI, byte); 
SPITimeout = SPIT_FLAG_TIMEOUT; 
/* 等待接收缓冲区非空,RXNE 事件 */ 
while (SPI_I2S_GetFlagStatus(FLASH_SPI, SPI_I2S_FLAG_RXNE) == RESET) 
{ 
if ((SPITimeout--) == 0) 
return SPI_TIMEOUT_UserCallback(1); 
} 
/* 读取数据寄存器,获取接收缓冲区数据 */ 
return SPI_I2S_ReceiveData(FLASH_SPI); 
} 
/** 
* @brief 使用 SPI 读取一个字节的数据 
* @param 无 
* @retval 返回接收到的数据 
*/ 
u8 SPI_FLASH_ReadByte(void) 
{ 
return (SPI_FLASH_SendByte(Dummy_Byte)); 
}

       ⑤ 控制 FLASH 的指令

       ⑥ 定义 FLASH 指令编码表

        FLASH 芯片的常用指令编码使用宏来封装起来,后面需要发送指令编码的时候我们直接使用这些宏即可。

/*命令定义-开头*******************************/ 
#define W25X_WriteEnable         0x06 
#define W25X_WriteDisable        0x04 
#define W25X_ReadStatusReg       0x05 
#define W25X_WriteStatusReg    0x01 
#define W25X_ReadData            0x03 
#define W25X_FastReadData        0x0B 
#define W25X_FastReadDual        0x3B 
#define W25X_PageProgram         0x02 
#define W25X_BlockErase          0xD8 
#define W25X_SectorErase         0x20 
#define W25X_ChipErase           0xC7 
#define W25X_PowerDown           0xB9 
#define W25X_ReleasePowerDown  0xAB 
#define W25X_DeviceID            0xAB 
#define W25X_ManufactDeviceID    0x90 
#define W25X_JedecDeviceID       0x9F 
#define W25X_Enter4ByteMode      0xB7 
#define W25X_ReadStatusRegister3     0x15 #define WIP_Flag                 0x01  
#define Dummy_Byte               0xFF 

       ⑦ 读取 FLASH 芯片 ID

/*
* @param 无 
* @retval FLASH ID 
*/ 
u32 SPI_FLASH_ReadID(void) 
{ u32 Temp = 0, Temp0 = 0, Temp1 = 0, Temp2 = 0; /* 开始通讯:CS 低电平 */ 
SPI_FLASH_CS_LOW(); /* 发送 JEDEC 指令,读取 ID */ 
SPI_FLASH_SendByte(W25X_JedecDeviceID); /* 读取一个字节数据 */ 
Temp0 = SPI_FLASH_SendByte(Dummy_Byte); /* 读取一个字节数据 */ 
Temp1 = SPI_FLASH_SendByte(Dummy_Byte); /* 读取一个字节数据 */ 
Temp2 = SPI_FLASH_SendByte(Dummy_Byte); /* 停止通讯:CS 高电平 */ 
SPI_FLASH_CS_HIGH(); /*把数据组合起来,作为函数的返回值*/ 
Temp = (Temp0 << 16) | (Temp1 << 8) | Temp2; return Temp; 
}

       实现了“ JEDEC ID”指令的时序:发送一个字节的指令编码“ W25X_JedecDeviceID”,然后读取 3 个字节,获取 FLASH 芯片对该指令的响应,最后把读取到的这 3 个数据合并到一个变量 Temp 中,然后作为函数返回值,把该返回值与我们定义的宏“ sFLASH_ID”对比,即可知道 FLASH 芯片是否正常

       ⑧ FLASH 写使能以及读取当前状态
在向 FLASH 芯片存储矩阵写入数据前,首先要使能写操作,通过“ Write Enable”命令即可写使能。

写使能命令

/** 
* @brief 向 FLASH 发送 写使能 命令 
* @param none 
* @retval none 
*/ 
void SPI_FLASH_WriteEnable(void) 
{ 
/* 通讯开始:CS 低 */ 
SPI_FLASH_CS_LOW(); /* 发送写使能命令*/ 
SPI_FLASH_SendByte(W25X_WriteEnable); /*通讯结束:CS 高 */ 
SPI_FLASH_CS_HIGH(); 
}

通过读状态寄存器等待 FLASH 芯片空闲

/*WIP(BUSY)标志:FLASH 内部正在写入*/ 
#define WIP_Flag                 0x01 /** 
* @brief 等待 WIP(BUSY)标志被置 0,即等待到 FLASH 内部数据写入完毕 
* @param none 
* @retval none 
*/ 
void SPI_FLASH_WaitForWriteEnd(void) 
{ 
u8 FLASH_Status = 0; 
/* 选择 FLASH: CS 低 */ 
SPI_FLASH_CS_LOW(); 
/* 发送 读状态寄存器 命令 */ 
SPI_FLASH_SendByte(W25X_ReadStatusReg); 
SPITimeout = SPIT_FLAG_TIMEOUT; 
/* 若 FLASH 忙碌,则等待 */ 
do 
{ 
/* 读取 FLASH 芯片的状态寄存器 */ 
FLASH_Status = SPI_FLASH_SendByte(Dummy_Byte); 
if ((SPITimeout--) == 0) 
{ 
SPI_TIMEOUT_UserCallback(4); 
return; 
} 
} 
while ((FLASH_Status & WIP_Flag) == SET); /* 正在写入标志 */ /* 停止信号 FLASH: CS 高 */ 
SPI_FLASH_CS_HIGH(); 
}

       发送读状态寄存器的指令编码“ W25X_ReadStatusReg”后,在 while 循环里持续获取寄存器的内容并检验它的“ WIP_Flag 标志” (即 BUSY 位),一直等待到该标志表示写入结束时才退出本函数,以便继续后面与 FLASH 芯片的数据通讯。

       ⑨ FLASH 扇区擦除

       由于 FLASH 存储器的特性决定了它只能把原来为“ 1”的数据位改写成“0”,而原来为“ 0”的数据位不能直接改写为“ 1”。所以这里涉及到数据“擦除”的概念。

       扇区擦除指令的第一个字节为指令编码,紧接着发送的 4 个字节用于表示要擦除的存储矩阵地址。要注意的是在扇区擦除指令前,还需要先发送“写使能”指令发送扇区擦除指令后,通过读取寄存器状态等待扇区擦除操作完毕。

/*
* @brief 擦除 FLASH 扇区 
* @param SectorAddr:要擦除的扇区地址 
* @retval 无 
*/ 
void SPI_FLASH_SectorErase(u32 SectorAddr) 
{ 
/* 发送 FLASH 写使能命令 */ 
SPI_FLASH_WriteEnable(); 
SPI_FLASH_WaitForWriteEnd(); 
/* 擦除扇区 */ 
/* 选择 FLASH: CS 低电平 */ 
SPI_FLASH_CS_LOW(); 
/* 发送扇区擦除指令*/ 
SPI_FLASH_SendByte(W25X_SectorErase); 
/*发送擦除扇区地址的高 8 位*/ 
SPI_FLASH_SendByte((SectorAddr & 0xFF000000) >> 24); 
/*发送擦除扇区地址的中前 8 位*/ 
SPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16); 
/* 发送擦除扇区地址的中后 8 位 */ 
SPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8); 
/* 发送擦除扇区地址的低 8 位 */ 
SPI_FLASH_SendByte(SectorAddr & 0xFF); 
/* 停止信号 FLASH: CS 高电平 */ 
SPI_FLASH_CS_HIGH(); 
/* 等待擦除完毕*/ 
SPI_FLASH_WaitForWriteEnd(); 
}                                                                 

       ⑩ FLASH 的页写入

       FLASH 芯片也有页写入命令,使用页写入命令最多可以一次向 FLASH 传输 256 个字节的数据,我们把这个单位为页大小。

/** 
* @brief 对 FLASH 按页写入数据,调用本函数写入数据前需要先擦除扇区 
* @param pBuffer,要写入数据的指针 
* @param WriteAddr,写入地址 
* @param  NumByteToWrite,写入数据长度,必须小于等于 SPI_FLASH_PerWritePageSize 
* @retval 无 
*/ 
void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite) 
{ 
/* 发送 FLASH 写使能命令 */ 
SPI_FLASH_WriteEnable(); 
/* 选择 FLASH: CS 低电平 */ 
SPI_FLASH_CS_LOW(); 
/* 写页写指令*/ 
SPI_FLASH_SendByte(W25X_PageProgram); 
/*发送写地址的高 8 位*/ 
SPI_FLASH_SendByte((WriteAddr & 0xFF000000) >> 24); 
/*发送写地址的中前 8 位*/ 
SPI_FLASH_SendByte((WriteAddr & 0xFF0000) >> 16); 
/*发送写地址的中后 8 位*/ 
SPI_FLASH_SendByte((WriteAddr & 0xFF00) >> 8); 
/*发送写地址的低 8 位*/ 
SPI_FLASH_SendByte(WriteAddr & 0xFF); 
if (NumByteToWrite > SPI_FLASH_PerWritePageSize) 
{ 
NumByteToWrite = SPI_FLASH_PerWritePageSize; 
FLASH_ERROR("SPI_FLASH_PageWrite too large!"); 
} 
/* 写入数据*/ 
while (NumByteToWrite--) 
{ 
/* 发送当前要写入的字节数据 */ 
SPI_FLASH_SendByte(*pBuffer); 
/* 指向下一字节数据 */ 
pBuffer++; 
} 
/* 停止信号 FLASH: CS 高电平 */ 
SPI_FLASH_CS_HIGH(); /* 等待写入完毕*/ 
SPI_FLASH_WaitForWriteEnd(); 
}

       先发送“写使能”命令,接着才开始页写入时序, 然后发送指令编码、地址, 再把要写入的数据一个接一个地发送出去,发送完后结束通讯,检查 FLASH状态寄存器,等待 FLASH 内部写入结束。

       ⑪  不定量数据写入

/** 
* @brief 对 FLASH 写入数据,调用本函数写入数据前需要先擦除扇区 
* @param pBuffer,要写入数据的指针 
* @param WriteAddr,写入地址 
* @param NumByteToWrite,写入数据长度 
* @retval 无 
*/ 
void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite) 
{ 
u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0; 
/*mod 运算求余,若 writeAddr 是 SPI_FLASH_PageSize 整数倍,运算结果 Addr 值为0*/ 
Addr = WriteAddr % SPI_FLASH_PageSize; 
NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize; 
/*mod 运算求余,计算出剩余不满一页的字节数*/ 
NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; 
/* Addr=0,则 WriteAddr 刚好按页对齐 aligned  */ 
if (Addr == 0) 
{ 
/* NumByteToWrite < SPI_FLASH_PageSize */ 
if (NumOfPage == 0) 
{ 
SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); 
} 
else /* NumByteToWrite > SPI_FLASH_PageSize */ 
{ 
/*先把整数页都写了*/ 
while (NumOfPage--) 
{ 
SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); 
WriteAddr += SPI_FLASH_PageSize; 
pBuffer += SPI_FLASH_PageSize; 
} 
/*若有多余的不满一页的数据,把它写完*/ 
SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); 
} 
} 
/* 若地址与 SPI_FLASH_PageSize 不对齐 */ 
else 
{ 
/* NumByteToWrite < SPI_FLASH_PageSize */ 
if (NumOfPage == 0) 
{ 
/*当前页剩余的 count 个位置比 NumOfSingle 小,写不完*/ 
if (NumOfSingle > count) 
{ 
temp = NumOfSingle - count; 
/*先写满当前页*/ 
SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
WriteAddr += count; 
pBuffer += count; 
/*再写剩余的数据*/ 
SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp); 
} 
else /*当前页剩余的 count 个位置能写完 NumOfSingle 个数据*/ 
{ 
SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); 
} 
} 
else /* NumByteToWrite > SPI_FLASH_PageSize */ 
{ 
/*地址不对齐多出的 count 分开处理,不加入这个运算*/ 
NumByteToWrite -= count; 
NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; 
NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); 
WriteAddr += count; 
pBuffer += count; 
/*把整数页都写了*/ 
while (NumOfPage--) 
{ 
SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); 
WriteAddr += SPI_FLASH_PageSize; 
pBuffer += SPI_FLASH_PageSize; 
} 
/*若有多余的不满一页的数据,把它写完*/ 
if (NumOfSingle != 0) 
{ 
SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); 
} 
} 
} 
}

       页的大小以及实际数据写入的时候,使用的是针对 FLASH 芯片的页写入函数,且在实际调用这个“不定量数据写入”函数时,还要注意确保目标扇区处于擦除状态。
       ⑫ 从 FLASH 读取数据

       发送了指令编码及要读的起始地址后, FLASH 芯片就会按地址递增的方式返回存储矩阵的内容,读取的数据量没有限制,只要没有停止通讯, FLASH 芯片就会一直返回数据

/** 
* @brief 读取 FLASH 数据 
* @param  pBuffer,存储读出数据的指针 
* @param  ReadAddr,读取地址 
* @param  NumByteToRead,读取数据长度 
* @retval 无 
*/ 
void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead) 
{ 
/* 选择 FLASH: CS 低电平 */ 
SPI_FLASH_CS_LOW(); 
/* 发送 读 指令 */ 
SPI_FLASH_SendByte(W25X_ReadData); 
/* 发送  读  地址高 8 位  */ 
SPI_FLASH_SendByte((ReadAddr & 0xFF000000) >> 24); 
/* 发送 读 地址中前 8 位 */ 
SPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16); 
/* 发送 读 地址中后 8 位 */ 
SPI_FLASH_SendByte((ReadAddr& 0xFF00) >> 8); 
/* 发送 读 地址低 8 位 */ 
SPI_FLASH_SendByte(ReadAddr & 0xFF); 
/* 读取数据 */ 
while (NumByteToRead--) { 
/* 读取一个字节*/ 
*pBuffer = SPI_FLASH_SendByte(Dummy_Byte); 
/* 指向下一个字节缓冲区 */ 
pBuffer++; 
} 
/* 停止信号 FLASH: CS 高电平 */ 
SPI_FLASH_CS_HIGH(); 
}

(3)main 函数

#define RxBufferSize1   (countof(TxBuffer1) - 1) 
#define countof(a)      (sizeof(a) / sizeof(*(a))) 
#define  BufferSize (countof(Tx_Buffer)-1) #define  FLASH_WriteAddress    0x00000 
#define  FLASH_ReadAddress     FLASH_WriteAddress 
#define  FLASH_SectorToErase   FLASH_WriteAddress /* 发送缓冲区初始化 */ 
uint8_t Tx_Buffer[] = " stm32 开发板\r\n"; 
uint8_t Rx_Buffer[BufferSize]; //读取的 ID 存储位置 IO uint32_t DeviceID = 0; IO uint32_t FlashID = 0; IO TestStatus TransferStatus1 = FAILED; // 函数原型声明 
void Delay(  IO uint32_t nCount); /* 
* 函数名:main 
* 描述  :主函数 
* 输入  :无 
* 输出  :无 
*/ 
int main(void) 
{ 
LED_GPIO_Config(); 
LED_BLUE; 
/* 配置串口 1 为:115200 8-N-1 */ 
Debug_USART_Config(); 
printf("\r\n 这是一个 16M 串行 flash(W25Q128)实验 \r\n"); 
Delay( 200 ); 
/* 获取 SPI Flash ID */  
FlashID = SPI_FLASH_ReadID(); 
/* 检验 SPI Flash ID */ 
if (FlashID == sFLASH_ID || FlashID2 == sFLASH_ID) 
{ 
printf("\r\n 检测到 SPI FLASH W25Q256 !\r\n"); 
/* 擦除将要写入的 SPI FLASH 扇区,FLASH 写入前要先擦除 */ 
SPI_FLASH_SectorErase(FLASH_SectorToErase); 
/*  将发送缓冲区的数据写到 flash 中  */ 
SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize); 
printf("\r\n 写入的数据为:\r\n%s", Tx_Buffer); 
/* 将刚刚写入的数据读出来放到接收缓冲区中 */ 
SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize); 
printf("\r\n 读出的数据为:\r\n%s", Rx_Buffer); 
/* 检查写入的数据与读出的数据是否相等 */ 
TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize); 
if ( PASSED == TransferStatus1 ) 
{ 
LED_GREEN; 
printf("\r\n16M 串行 flash(W25Q256)测试成功!\n\r"); 
} 
else 
{ 
LED_RED; 
printf("\r\n16M 串行 flash(W25Q256)测试失败!\n\r"); 
} 
}// if (FlashID == sFLASH_ID) 
else 
{ 
LED_RED; 
printf("\r\n 获取不到 W25Q256 ID!\n\r"); 
} 
SPI_Flash_PowerDown(); 
while (1); 
}

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Joomla内核SQL注入漏洞(CVE-2018-8045)

    Joomla! Core SQL注入漏洞NSFOCUS ID39158CVE IDCVE-2018-8045受影响版本Joomla! Joomla! 3.5.0-3.8.5漏洞点评Joomla是一套网站内容管理系统,使用PHP语言和MySQL数据库开发。Joomla! 3.5.0 -3.8.5版本对SQL语句内的变量缺少类型转换,导致User Notes列表视图内SQL注 入漏洞,可…...

    2024/4/26 10:37:04
  2. gltf教程系列-基于WebGL的glTF简介(一)

    越来越多的应用程序和服务基于3D内容。在线商店提供带有3D预览的产品配置器。博物馆通过3D扫描将其工件数字化,并允许访问者在虚拟画廊中探索他们的馆藏。城市规划者使用3D城市模型进行规划和信息可视化。教育工作者创建人体的交互式动画3D模型。其中许多应用程序直接在Web浏览…...

    2024/5/5 23:05:27
  3. 微服务(Microservice)那点事

    WHAT - 什么是微服务微服务简介这次参加JavaOne2015最大的困难就是听Microservice相关的session,无论内容多么水,只要题目带microservice,必定报不上名,可见Microservice有多火。最喜欢其中一页。关于这个典故,可以参考this,此图适用于一切高大上的名字——技术有SOA,Ag…...

    2024/5/5 20:42:50
  4. c3p0参数详解

    <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement">3</property> <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> <property name="acquireRetryAt…...

    2024/4/20 14:37:51
  5. STM32F429--按键检测

    说明:此篇文章基于上一篇文章点亮LED灯,实现按键控制LED灯的状态翻转 传送门:STM32F429–标准库点亮LED灯 文件说明 bsp_led.c负责LED的初始化配置bsp_led.h负责外设LED函数的声明,以及宏定义 bsp_key.c负责按键初始化 bsp_key.h负责按键函数的声明,以及宏定义 main.c实现功…...

    2024/5/6 3:03:23
  6. SQL注入漏洞的判断

    一、SQL注入漏洞的判断一般来说,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX等带有参数的ASP动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访…...

    2024/4/11 21:01:38
  7. WebGL(1.0)API

    WebGL (Web图形库) 是一种JavaScript API,用于在任何兼容的Web浏览器中呈现交互式3D和2D图形,而无需使用插件。WebGL通过引入一个与OpenGL ES 2.0紧密相符合的API,可以在HTML5 <canvas> 元素中使用。目前支持 WebGL 的浏览器有:Firefox 4+, Google Chrome 9+, Opera …...

    2024/4/17 19:30:18
  8. c3p0-config.xml模板详解

    c3p0-config.xml模板详解 <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement">3</property> <!--定义在从数据库获取新连接…...

    2024/5/6 3:44:16
  9. 219二队老虎全程直击报道野外生存挑战赛

    [原创]219二队老虎全程直击报道野外生存挑战赛题记:五一生存挑战赛已经结束好几天,直到今天才有时间坐下来好好回想比赛中的每个片段,我决定把这段精彩的时光用文字记录下来,献给我的队友、组委会、驴友家园、关心我的朋友和那些以后将要参加生存活动的驴友。<?xml:nam…...

    2024/5/5 20:04:45
  10. 【STM32~No.1】STM32F429简易模板的构建

    一模板必要文件有那些?注:建议模板文件创建全部在英文目录下1新建4个文件夹lib project user doc一。 lib里面放入固件库的CMSIS和STM32F4xx_StdPeriph_DriverCMSIS中只留下DEVICE和include在目录\STM32F429固件库\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Devic…...

    2024/5/6 2:15:03
  11. 如何学习WebGL和Three.js

    如何学习WebGL和Three.js 本文是Three.js电子书的学前内容 当你开始思考你应该如何学习WebGL和Three.js的时候,相信你至少对相关的关键词了解过了,希望通过WebGL或Three.js实现你想要的Web3D功能,也许你也会去思考通过WebGL或Three.js能不能实现你想要的功能,也许你是因为领…...

    2024/5/5 2:01:00
  12. 泛微OA e-cology WorkflowCenterTreeData前台接口SQL注入漏洞复现

    漏洞描述 泛微e-cology OA系统的WorkflowCenterTreeData接口在使用oracle数据库时,由于内置sql语句拼接不严,导致其存在sql注入漏洞 影响范围 使用oracle数据库的泛微 e-cology OA 系统 漏洞复现 POST /mobile/browser/WorkflowCenterTreeData.jsp?node=wftype_1&scope=23…...

    2024/4/19 23:05:06
  13. jmeter使用beanshell取请求的头部信息

    1、添加beanshell后置处理器 2、代码 获取加载时间 long time=prev.getEndTime()-prev.getStartTime(); vars.put("param",String.valueOf(time));...

    2024/4/17 19:29:18
  14. c3p0连接池配置(转)

    一、配置<c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement">3</property> <!--定义在从数据库获取新连接失败…...

    2024/5/5 22:36:56
  15. 腾讯分布式系统笔记2——服务器系统设计工程实践

    ...

    2024/5/5 16:48:19
  16. 产品经理必须要了解的经济学原理--“口红效应”

    故宫,是一个神奇的地方,里面不光有着众多的历史渊源,最近也向文创产品跨界,推出了自己的众多产品,从原来的星空纸扇,到原创的各种香水,最近又开始向彩妆界进军了……千呼万唤始出来的“故宫口红”被小仙女们刷屏,为什么女生压力大的时候只需要一只口红?更有意思的是,…...

    2024/4/20 7:19:14
  17. SQL注入漏洞产生的原因 ? 如何防止?

    SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。防止SQL注入:开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置执行sql语句时使用addslashes进行sql语句转换Sql语句…...

    2024/5/5 22:53:33
  18. STM32F429的定时器的使用方法

    电子时代,硬件在突飞猛进的发展,频率不断上升,目前的STM32系列,Cortex M系列,Cortex-M4的频率已经为:180MHz了,基本上与之前的ARM7/9频率差不多了,还有Cortex-M7,频率更高,出现了BGA封装与SDRAM DDR等。看来处理器越来越大众化了,物联网上的电子设备联网,也越来越普…...

    2024/5/5 19:07:51
  19. WebGL简易教程(八):三维场景交互

    文章目录1. 概述2. 实例2.1. 重绘刷新2.2. 鼠标事件调整参数3. 结果4. 参考 1. 概述 在上一篇教程《WebGL简易教程(七):绘制一个矩形体》中,通过一个绘制矩形包围盒的实例,进一步理解了模型视图投影变换。其实,三维场景的UI交互工作正是基于模型视图投影变换的基础之上的。…...

    2024/5/5 22:09:07
  20. jmeter BeanShell断言(数据类型转换)

    jmeter正则表达式获取的变量的值是String类型,有时候需要进行加减操作,就需要转换类型,在这里用了BeanShell 下面是代码,以作参考,此处是将String类型转换成了double类型 String frozen_money = vars.get("VACANCY_1"); log.info("冻结金额------"+fr…...

    2024/4/19 14:14:42

最新文章

  1. Tomcat端口占用解决方案

    Windows操作系统 出现这种情况&#xff1a; Error was Port already in use :40001&#xff1b;nested exception is :java.net.BindException: Address already in use : JVM_Bind; 步骤1&#xff1a;按下winR键&#xff0c;输入cmd 步骤2&#xff1a;输入以下命令 netstat …...

    2024/5/9 13:08:10
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 【鸿蒙千帆起】《开心消消乐》完成鸿蒙原生应用开发,创新多端联动用户体验

    《开心消消乐》已经完成鸿蒙原生应用开发&#xff0c;乐元素成为率先完成鸿蒙原生应用开发的20游戏厂商之一。作为一款经典游戏&#xff0c;《开心消消乐》已经拥有8亿玩家&#xff0c;加入鸿蒙原生应用生态&#xff0c;将为其带来更优的游戏性能和更多创新体验。自9月25日华为…...

    2024/5/8 12:38:52
  4. ArcGIS10.8保姆式安装教程

    ArcGIS 10.8是一款非常强大的地理信息系统软件&#xff0c;用于创建、管理、分析和可视化地理数据。以下是ArcGIS 10.8的详细安装教程&#xff1a; 确保系统满足安装要求 在开始安装之前&#xff0c;请确保您的计算机满足以下系统要求&#xff1a; 操作系统&#xff1a;Windo…...

    2024/5/7 11:33:48
  5. Python 潮流周刊#44:Mojo 本周开源了;AI 学会生成音乐了

    △△请给“Python猫”加星标 &#xff0c;以免错过文章推送 你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。本周刊开源&#xff0c;欢迎投稿[1]。另有电报频道[2]作为副刊&#xff0c;补充发布更加丰富的资讯&#xff0c;…...

    2024/5/8 12:18:06
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/8 6:01:22
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/9 4:20:59
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/8 20:48:49
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/8 19:33:07
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/8 20:38:49
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/9 7:32:17
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57