stm32 操作W25Q256 W25Q16 spi flash

article/2025/11/7 13:26:59

硬件连接

今天我使用W25Q16做了一个测试,发现了W25Q16内部是一个环形缓冲区,在0x200000地址处写入数据,我可以在0x000000处读取到0x200000地址的数据,从这里就可以正面W25Q16是一个环形缓冲区的norfalsh

本函数库来自正点原子官方,本人稍作修改和添加注释

W25Q16 2M Byte

在这里插入图片描述

W25Q256 32M Byte

在这里插入图片描述

spi 配置

2022-7-27 经过测试

  1. 华邦的 W25Q256JV 32M 字节 容量的spi flash没有问题 spi配置是 上升沿采集数据 —> CPOL =0 CPOA=0 或者是 CPOL=1 CPOA=1 hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  2. 华邦的 W25Q16JVSSIQ 2M 字节 容量的spi flash没有问题

第1种配置

在这里插入图片描述

第2种配置

在这里插入图片描述

测试代码

  1. 需要修改CS片选引脚
  2. 需要选着spi外设

头文件

/******************************************************************************************************* @file        norflash.h* @author      正点原子团队(ALIENTEK)* @version     V1.0* @date        2021-10-26* @brief       NOR FLASH(25QXX) 驱动代码* @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司***************************************************************************************************** @attention** 实验平台:正点原子 F407电机开发板* 在线视频:www.yuanzige.com* 技术论坛:http://www.openedv.com/forum.php* 公司网址:www.alientek.com* 购买地址:zhengdianyuanzi.tmall.com** 修改说明* V1.0 20211026* 第一次发布******************************************************************************************************/#ifndef __norflash_H
#define __norflash_H#include "main.h"/*2022-7-27 经过测试 华邦的 W25Q256JV   32M 字节 容量的spi flash没有问题  spi配置是  上升沿采集数据 ---> CPOL =0 CPOA=0  或者是 CPOL=1 CPOA=1   hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;华邦的  W25Q16JVSSIQ 2M 字节 容量的spi flash没有问题 *//* SPI总线速度设置 */
#define SPI_SPEED_2         0
#define SPI_SPEED_4         1
#define SPI_SPEED_8         2
#define SPI_SPEED_16        3
#define SPI_SPEED_32        4
#define SPI_SPEED_64        5
#define SPI_SPEED_128       6
#define SPI_SPEED_256       7/******************************************************************************************/
/* NORFLASH 片选 引脚 定义 */#define NORFLASH_CS_GPIO_PORT           GPIOA
#define NORFLASH_CS_GPIO_PIN            GPIO_PIN_2
#define NORFLASH_CS_GPIO_CLK_ENABLE()   do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)   /* PI口时钟使能 *//******************************************************************************************/
//spi外设选择
extern SPI_HandleTypeDef hspi1;
#define HSPI hspi1/* NORFLASH 片选信号 */
#define NORFLASH_CS(x)      do{ x ? \HAL_GPIO_WritePin(NORFLASH_CS_GPIO_PORT, NORFLASH_CS_GPIO_PIN, GPIO_PIN_SET) : \HAL_GPIO_WritePin(NORFLASH_CS_GPIO_PORT, NORFLASH_CS_GPIO_PIN, GPIO_PIN_RESET); \}while(0)/* FLASH芯片列表 */
#define W25Q80      0XEF13          /* W25Q80   芯片ID */
#define W25Q16      0XEF14          /* W25Q16   芯片ID */
#define W25Q32      0XEF15          /* W25Q32   芯片ID */
#define W25Q64      0XEF16          /* W25Q64   芯片ID */
#define W25Q128     0XEF17          /* W25Q128  芯片ID */
#define W25Q256     0XEF18          /* W25Q256  芯片ID */
#define BY25Q64     0X6816          /* BY25Q64  芯片ID */
#define BY25Q128    0X6817          /* BY25Q128 芯片ID */
#define NM25Q64     0X5216          /* NM25Q64  芯片ID */
#define NM25Q128    0X5217          /* NM25Q128 芯片ID */extern uint16_t norflash_TYPE;      /* 定义FLASH芯片型号 *//* 指令表 */
#define FLASH_WriteEnable           0x06 
#define FLASH_WriteDisable          0x04 
#define FLASH_ReadStatusReg1        0x05 
#define FLASH_ReadStatusReg2        0x35 
#define FLASH_ReadStatusReg3        0x15 
#define FLASH_WriteStatusReg1       0x01 
#define FLASH_WriteStatusReg2       0x31 
#define FLASH_WriteStatusReg3       0x11 
#define FLASH_ReadData              0x03 
#define FLASH_FastReadData          0x0B 
#define FLASH_FastReadDual          0x3B 
#define FLASH_FastReadQuad          0xEB  
#define FLASH_PageProgram           0x02 
#define FLASH_PageProgramQuad       0x32 
#define FLASH_BlockErase            0xD8 
#define FLASH_SectorErase           0x20 
#define FLASH_ChipErase             0xC7 
#define FLASH_PowerDown             0xB9 
#define FLASH_ReleasePowerDown      0xAB 
#define FLASH_DeviceID              0xAB 
#define FLASH_ManufactDeviceID      0x90 
#define FLASH_JedecDeviceID         0x9F 
#define FLASH_Enable4ByteAddr       0xB7
#define FLASH_Exit4ByteAddr         0xE9
#define FLASH_SetReadParam          0xC0 
#define FLASH_EnterQPIMode          0x38
#define FLASH_ExitQPIMode           0xFF/* 静态函数 */
static void norflash_wait_busy(void);               /* 等待空闲 */
static void norflash_send_address(uint32_t address);/* 发送地址 */
static void norflash_write_page(uint8_t *pbuf, uint32_t addr, uint16_t datalen);    /* 写入page */
static void norflash_write_nocheck(uint8_t *pbuf, uint32_t addr, uint16_t datalen); /* 写flash,不带擦除 *//* 普通函数 */
void norflash_init(void);                   /* 初始化25QXX */
uint16_t norflash_read_id(void);            /* 读取FLASH ID */
void norflash_write_enable(void);           /* 写使能 */
uint8_t norflash_read_sr(uint8_t regno);    /* 读取状态寄存器 */
void norflash_write_sr(uint8_t regno,uint8_t sr);   /* 写状态寄存器 */void norflash_erase_chip(void);             /* 整片擦除 */
void norflash_erase_sector(uint32_t saddr); /* 扇区擦除 */
void norflash_read(uint8_t *pbuf, uint32_t addr, uint16_t datalen);     /* 读取flash */
void norflash_write(uint8_t *pbuf, uint32_t addr, uint16_t datalen);    /* 写入flash */#endif

源文件

  1. 需要移植 spi读写函数
uint8_t spi2_read_write_byte(uint8_t send_data)
  1. 需要移植spi速度修改函数—也可以不修改–非必要
void spi2_set_speed(uint8_t speed)

spi flash操作库源文件

/******************************************************************************************************* @file        norflash.c* @author      正点原子团队(ALIENTEK)* @version     V1.0* @date        2021-10-26* @brief       NOR FLASH(25QXX) 驱动代码* @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司***************************************************************************************************** @attention** 实验平台:正点原子 F407电机开发板* 在线视频:www.yuanzige.com* 技术论坛:http://www.openedv.com/forum.php* 公司网址:www.alientek.com* 购买地址:zhengdianyuanzi.tmall.com** 修改说明* V1.0 20211026* 第一次发布******************************************************************************************************/#include "norflash.h"
#include "stdio.h"uint16_t g_norflash_type = NM25Q128;     /* 默认是NM25Q128 */
/*需要移植的代码:spi数据收发函数*/
uint8_t spi2_read_write_byte(uint8_t send_data)
{uint8_t recv_data;HAL_SPI_TransmitReceive(&HSPI, &send_data, &recv_data, 1, 0xffff);return recv_data;
}
/**
* @brief SPI2 速度设置函数
* @note SPI2 时钟选择来自 APB1, 即 PCLK1, 为 42Mhz
* SPI 速度 = PCLK1 / 2^(speed + 1)
* @param speed : SPI2 时钟分频系数
取值为 SPI_BAUDRATEPRESCALER_2~SPI_BAUDRATEPRESCALER_2 256
* @retval 无
*/
void spi2_set_speed(uint8_t speed)
{assert_param(IS_SPI_BAUDRATE_PRESCALER(speed));/* 判断有效性 */__HAL_SPI_DISABLE(&HSPI); /* 关闭 SPI */HSPI.Instance->CR1 &= 0xFFC7; /* 位 3-5 清零,用来设置波特率 */HSPI.Instance->CR1 |= speed << 3; /* 设置 SPI 速度 */__HAL_SPI_ENABLE(&HSPI); /* 使能 SPI */
}/*** @brief       初始化SPI NOR FLASH* @param       无* @retval      无*/
void norflash_init(void)
{spi2_set_speed(SPI_SPEED_4);            /* SPI2 切换到高速状态 21Mhz */uint8_t temp=0;g_norflash_type = norflash_read_id();   /* 读取FLASH ID. */if (g_norflash_type == W25Q256)         /* SPI FLASH为W25Q256, 必须使能4字节地址模式 */{temp = norflash_read_sr(3);         /* 读取状态寄存器3,判断地址模式 */if ((temp & 0x01) == 0)             /* 如果不是4字节地址模式,则进入4字节地址模式 */{norflash_write_enable();        /* 写使能 */temp |= 1 << 1;                 /* ADP=1, 上电4位地址模式 */norflash_write_sr(3, temp);     /* 写SR3 */NORFLASH_CS(0);spi2_read_write_byte(FLASH_Enable4ByteAddr);    /* 使能4字节地址指令 */NORFLASH_CS(1);}}// printf("ID:%x\r\n", g_norflash_type);
}/*** @brief       等待空闲* @param       无* @retval      无*/
static void norflash_wait_busy(void)
{while ((norflash_read_sr(1) & 0x01) == 0x01);   /* 等待BUSY位清空 */
}/*** @brief       25QXX写使能*   @note      将S1寄存器的WEL置位* @param       无* @retval      无*/
void norflash_write_enable(void)
{NORFLASH_CS(0);spi2_read_write_byte(FLASH_WriteEnable);   /* 发送写使能 */NORFLASH_CS(1);
}/*** @brief       25QXX发送地址*   @note      根据芯片型号的不同, 发送24ibt / 32bit地址* @param       address : 要发送的地址* @retval      无*/
static void norflash_send_address(uint32_t address)
{if (g_norflash_type == W25Q256) /* 只有W25Q256支持4字节地址模式 */{spi2_read_write_byte((uint8_t)((address) >> 24)); /* 发送 bit31 ~ bit24 地址 */}spi2_read_write_byte((uint8_t)((address) >> 16));   /* 发送 bit23 ~ bit16 地址 */spi2_read_write_byte((uint8_t)((address) >> 8));    /* 发送 bit15 ~ bit8  地址 */spi2_read_write_byte((uint8_t)address);             /* 发送 bit7  ~ bit0  地址 */
}/*** @brief       读取25QXX的状态寄存器,25QXX一共有3个状态寄存器*   @note      状态寄存器1:*              BIT7  6   5   4   3   2   1   0*              SPR   RV  TB BP2 BP1 BP0 WEL BUSY*              SPR:默认0,状态寄存器保护位,配合WP使用*              TB,BP2,BP1,BP0:FLASH区域写保护设置*              WEL:写使能锁定*              BUSY:忙标记位(1,忙;0,空闲)*              默认:0x00**              状态寄存器2:*              BIT7  6   5   4   3   2   1   0*              SUS   CMP LB3 LB2 LB1 (R) QE  SRP1**              状态寄存器3:*              BIT7      6    5    4   3   2   1   0*              HOLD/RST  DRV1 DRV0 (R) (R) WPS ADP ADS** @param       regno: 状态寄存器号,范:1~3* @retval      状态寄存器值*/
uint8_t norflash_read_sr(uint8_t regno)
{uint8_t byte = 0, command = 0;switch (regno){case 1:command = FLASH_ReadStatusReg1;  /* 读状态寄存器1指令 */break;case 2:command = FLASH_ReadStatusReg2;  /* 读状态寄存器2指令 */break;case 3:command = FLASH_ReadStatusReg3;  /* 读状态寄存器3指令 */break;default:command = FLASH_ReadStatusReg1;break;}NORFLASH_CS(0);spi2_read_write_byte(command);      /* 发送读寄存器命令 */byte = spi2_read_write_byte(0xFF);  /* 读取一个字节 */NORFLASH_CS(1);return byte;
}/*** @brief       写25QXX状态寄存器*   @note      寄存器说明见norflash_read_sr函数说明* @param       regno: 状态寄存器号,范:1~3* @param       sr   : 要写入状态寄存器的值* @retval      无*/
void norflash_write_sr(uint8_t regno, uint8_t sr)
{uint8_t command = 0;switch (regno){case 1:command = FLASH_WriteStatusReg1;  /* 写状态寄存器1指令 */break;case 2:command = FLASH_WriteStatusReg2;  /* 写状态寄存器2指令 */break;case 3:command = FLASH_WriteStatusReg3;  /* 写状态寄存器3指令 */break;default:command = FLASH_WriteStatusReg1;break;}NORFLASH_CS(0);spi2_read_write_byte(command);  /* 发送读寄存器命令 */spi2_read_write_byte(sr);       /* 写入一个字节 */NORFLASH_CS(1);
}/*** @brief       读取芯片ID* @param       无* @retval      FLASH芯片ID*   @note      芯片ID列表见: norflash.h, 芯片列表部分*/
uint16_t norflash_read_id(void)
{uint16_t deviceid;NORFLASH_CS(0);spi2_read_write_byte(FLASH_ManufactDeviceID);   /* 发送读 ID 命令 */spi2_read_write_byte(0);    /* 写入一个字节 */spi2_read_write_byte(0);spi2_read_write_byte(0);deviceid = spi2_read_write_byte(0xFF) << 8;     /* 读取高8位字节 */deviceid |= spi2_read_write_byte(0xFF);         /* 读取低8位字节 */NORFLASH_CS(1);return deviceid;
}/*** @brief       读取SPI FLASH*   @note      在指定地址开始读取指定长度的数据* @param       pbuf    : 数据存储区* @param       addr    : 开始读取的地址(最大32bit)* @param       datalen : 要读取的字节数(最大65535)* @retval      无*/
void norflash_read(uint8_t *pbuf, uint32_t addr, uint16_t datalen)
{uint16_t i;NORFLASH_CS(0);spi2_read_write_byte(FLASH_ReadData);       /* 发送读取命令 */norflash_send_address(addr);                /* 发送地址 */for (i = 0; i < datalen; i++){pbuf[i] = spi2_read_write_byte(0xFF);   /* 循环读取 */}NORFLASH_CS(1);
}/*** @brief       SPI在一页(0~65535)内写入少于256个字节的数据*   @note      在指定地址开始写入最大256字节的数据* @param       pbuf    : 数据存储区* @param       addr    : 开始写入的地址(最大32bit)* @param       datalen : 要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!* @retval      无*/
static void norflash_write_page(uint8_t *pbuf, uint32_t addr, uint16_t datalen)
{uint16_t i;norflash_write_enable();    /* 写使能 */NORFLASH_CS(0);spi2_read_write_byte(FLASH_PageProgram);    /* 发送写页命令 */norflash_send_address(addr);                /* 发送地址 */for (i = 0; i < datalen; i++){spi2_read_write_byte(pbuf[i]);          /* 循环读取 */}NORFLASH_CS(1);norflash_wait_busy();       /* 等待写入结束 */
}/*** @brief       无检验写SPI FLASH*   @note      必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败!*              具有自动换页功能*              在指定地址开始写入指定长度的数据,但是要确保地址不越界!** @param       pbuf    : 数据存储区* @param       addr    : 开始写入的地址(最大32bit)* @param       datalen : 要写入的字节数(最大65535)* @retval      无*/
static void norflash_write_nocheck(uint8_t *pbuf, uint32_t addr, uint16_t datalen)
{uint16_t pageremain;pageremain = 256 - addr % 256;  /* 单页剩余的字节数 */if (datalen <= pageremain)      /* 不大于256个字节 */{pageremain = datalen;}while (1){/* 当写入字节比页内剩余地址还少的时候, 一次性写完* 当写入直接比页内剩余地址还多的时候, 先写完整个页内剩余地址, 然后根据剩余长度进行不同处理*/norflash_write_page(pbuf, addr, pageremain);if (datalen == pageremain)      /* 写入结束了 */{break;}else     /* datalen > pageremain */{pbuf += pageremain;         /* pbuf指针地址偏移,前面已经写了pageremain字节 */addr += pageremain;         /* 写地址偏移,前面已经写了pageremain字节 */datalen -= pageremain;      /* 写入总长度减去已经写入了的字节数 */if (datalen > 256)          /* 剩余数据还大于一页,可以一次写一页 */{pageremain = 256;       /* 一次可以写入256个字节 */}else     /* 剩余数据小于一页,可以一次写完 */{pageremain = datalen;   /* 不够256个字节了 */}}}
}/*** @brief       写SPI FLASH*   @note      在指定地址开始写入指定长度的数据, 该函数带擦除操作!*              SPI FLASH 一般是: 256个字节为一个Page, 4Kbytes为一个Sector, 16个扇区为1个Block*              擦除的最小单位为Sector.** @param       pbuf    : 数据存储区* @param       addr    : 开始写入的地址(最大32bit)* @param       datalen : 要写入的字节数(最大65535)* @retval      无*/
uint8_t g_norflash_buf[4096];   /* 扇区缓存 */void norflash_write(uint8_t *pbuf, uint32_t addr, uint16_t datalen)
{uint32_t secpos;uint16_t secoff;uint16_t secremain;uint16_t i;uint8_t *norflash_buf;norflash_buf = g_norflash_buf;secpos = addr / 4096;       /* 扇区地址 */secoff = addr % 4096;       /* 在扇区内的偏移 */secremain = 4096 - secoff;  /* 扇区剩余空间大小 *///printf("ad:%X,nb:%X\r\n", addr, datalen); /* 测试用 */if (datalen <= secremain){secremain = datalen;    /* 不大于4096个字节 */}while (1){norflash_read(norflash_buf, secpos * 4096, 4096);   /* 读出整个扇区的内容 */for (i = 0; i < secremain; i++)   /* 校验数据 */{if (norflash_buf[secoff + i] != 0XFF){break;      /* 需要擦除, 直接退出for循环 */}}if (i < secremain)   /* 需要擦除 */{norflash_erase_sector(secpos);  /* 擦除这个扇区 */for (i = 0; i < secremain; i++)   /* 复制 */{norflash_buf[i + secoff] = pbuf[i];}norflash_write_nocheck(norflash_buf, secpos * 4096, 4096);  /* 写入整个扇区 */}else        /* 写已经擦除了的,直接写入扇区剩余区间. */{norflash_write_nocheck(pbuf, addr, secremain);  /* 直接写扇区 */}if (datalen == secremain){break;  /* 写入结束了 */}else        /* 写入未结束 */{secpos++;               /* 扇区地址增1 */secoff = 0;             /* 偏移位置为0 */pbuf += secremain;      /* 指针偏移 */addr += secremain;      /* 写地址偏移 */datalen -= secremain;   /* 字节数递减 */if (datalen > 4096){secremain = 4096;   /* 下一个扇区还是写不完 */}else{secremain = datalen;/* 下一个扇区可以写完了 */}}}
}/*** @brief       擦除整个芯片*   @note      等待时间超长...* @param       无* @retval      无*/
void norflash_erase_chip(void)
{norflash_write_enable();    /* 写使能 */norflash_wait_busy();       /* 等待空闲 */NORFLASH_CS(0);spi2_read_write_byte(FLASH_ChipErase);  /* 发送读寄存器命令 */NORFLASH_CS(1);norflash_wait_busy();       /* 等待芯片擦除结束 */
}/*** @brief       擦除一个扇区*   @note      注意,这里是扇区地址,不是字节地址!!*              擦除一个扇区的最少时间:150ms** @param       saddr : 扇区地址 根据实际容量设置* @retval      无*/
void norflash_erase_sector(uint32_t saddr)
{//printf("fe:%x\r\n", saddr);   /* 监视falsh擦除情况,测试用 */saddr *= 4096;norflash_write_enable();        /* 写使能 */norflash_wait_busy();           /* 等待空闲 */NORFLASH_CS(0);spi2_read_write_byte(FLASH_SectorErase);    /* 发送写页命令 */norflash_send_address(saddr);   /* 发送地址 */NORFLASH_CS(1);norflash_wait_busy();           /* 等待扇区擦除完成 */
}

测试使用函数

重定向printf函数

/* 重定向printf函数 */
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xffff);return ch;
}

spi flash 测试函数


void spi_flash_test()
{int x = 0;norflash_init();uint8_t buf[256];for(x = 0; x < 256; x++)buf[x] = x;norflash_write(buf, 0, 256);memset(buf, 0, 256);norflash_read(buf, 0, 256);for(x = 0; x < 256; x++){if(buf[x] != x)break;}if(x != 256){printf("spi flash test fail\r\n");}else{printf("spi flash test ok\r\n");}
}

请添加图片描述


http://chatgpt.dhexx.cn/article/449qQ6Nr.shtml

相关文章

W25Q32的使用

一、W25Q32简介 W25Q32是华邦公司推出的大容量“SPI FLASH” 产品。 1、容量 32M-Bit/4M-byte(4,194,304)2、存储结构 页:256-bytes扇区:4K-bytes块:64K_bytes是故: 页:16384个扇区:1024个块:64个3、速度 时钟速度最高:80MHz4、特性 擦除、写次数:高达100,000次数据保…

基于STM32实现W25Q16读写操作(spi)

文章目录 前言一、W25Q161.介绍2.SPI2.1. 简介2.2. 特性2.3. 功能说明2.4. 工作模式2.5. 引脚说明 二、代码开发1.SPI初始化2.读取厂商ID2.1.读写字节2.2.读取ID 3.其他的一些操作4.完整代码 三、效果演示 前言 在之前我们学习了flash闪存&#xff0c;这个更多的是内部数据存储…

GD32F303访问W25Q32异常问题解决

最近在使用国产化GD32F303替换STM32F103芯片&#xff0c;驱动代码使用的STM32的库函数&#xff0c;调试过程中发现MCU通过SPI访问W25Q32芯片时&#xff0c;会出现写入异常的情况&#xff0c;不是全部错误&#xff0c;是中间某段数据错误。 左侧&#xff1a;待写入文件内容 右侧…

stm32读写w25qxx

一&#xff0c;w25qxx简介。 二&#xff0c;stm32CubeIDE配置。 三&#xff0c;代码 1,w25qxx.c #include "W25Qxx.h"/*********************************************************************************** 函数功能: 模块初始化*/ uint8_t BSP_W25Qx_Init(void) …

STM32(八)W25Q(16/32/64/128)芯片学习总结

系列文章目录 文章目录 系列文章目录前言一、硬件和数据手册部分翻译1.W25Q64硬件设计2.数据手册解读 二、指令 前言 按项目需求&#xff0c;近期调试了W25Q32芯片&#xff0c;W25Q系列芯片是华邦公司推出的大容量SPI FLASH产品&#xff0c;W25Q32是3V&#xff0c;32M-bit 串行…

STC89C52驱动W25Q32测试笔记

STC89C52是经典的C51单片机&#xff0c;该芯片不自带硬件SPI接口&#xff0c;正好有手上一块W25Q32的存储模块&#xff08;某宝上买的2.2元&#xff09;&#xff0c;试着使用89C52模拟SPI接口驱动W25Q32&#xff0c;在驱动的过程中遇到了几个问题&#xff0c;首先的问题是电平不…

SPI Flash芯片W25Q32英文版数据手册解读(二)---------存储器知识,寄存器

接着上一篇文章&#xff0c;由于W25Q32芯片是一个存储器芯片&#xff0c;先对这个芯片有关存储器的一些概念进行解读。 一、存储器相关知识 1、存储器的三个单位&#xff1a; 存储器三个等级&#xff1a;页&#xff08;Page&#xff09;&#xff0c;扇区&#xff08;sector&a…

SPI Flash芯片W25Q32英文版数据手册解读(一)---------引脚功能,工作模式

W25Q32芯片是一个可以通过SPI&#xff08;串行外围设备接口&#xff09;操作的flash存储器&#xff0c;这篇文章备忘和总结一下英文版数据手册的一些解读。有关时序及具体用STC单片机编写程序的内容等下一篇文章。 一、芯片引脚功能 我买的是8引脚、SOIC封装的芯片&#xff0…

w25q32 内存分布

说明 ESP826612F/E里面使用w25q32作为了flash存储. 提前说下哈,bit代表位 也就是 0 1 0 1 , Bit代表字节 ,一字节就是8位 w25q32的容量是32Mbit 也就是 32/8 4MB字节 4*1024 4096KB字节 然后 w25q32 这个芯片规定每 64KB字节作为一个块 所以呢w25q32总共分成了 4096…

基于STM32+SPI+W25Qxx存储芯片指令,时序和函数讲解

前言 本次我们学习一下STM32F103关于SPI对存储芯片的读写&#xff0c;介绍W25QXX芯片和对芯片内部讲解和代码解读&#xff0c;学习W25QXX芯片的各种读写指令&#xff0c;操作芯片读写&#xff0c;认识底层驱动&#xff0c;本篇内容主要目的是教会大家看手册写代码&#xf…

ButterKnife9.0.0-rc2 配置

升级了AndroidStudio到3.4之后&#xff0c;发现项目中的很多依赖库都不能用&#xff0c;原因是随着AS升级之后&#xff0c;Gradle随之升级到3.4.1&#xff0c;很多第三方库也需要更高版本的支撑&#xff0c;今天遇到ButterKnife失效的问题&#xff0c;原本是8.5.1的版本&#x…

How to install Bromine3 RC2

When I install Bromine RC2, I met bellow issues: “Server could not contact itself at the specified address: 127.0.0.1:80” “Error: Database table jobs for model job was not found.” etc. Now I show my exact way to install RC2 successfully: 1. Downl…

fabric1.4.0-rc2快速入门

软件环境 VMware 10.0.4 CentOS-7-x86_64-Minimal-1708 搭建过程 go安装 docker安装 docker-compose安装 一、fabric的编译和安装 1. 创建目录&#xff08;GOPATH变量在安装go的时候就配置好了&#xff09; mkdir -p $GOPATH/src/github.com/hyperledger 2. 下载fabri…

Cocos2d-JS v3.0 RC2发布说明

Cocos2d-JS是Cocos2d-x的Javascript版本&#xff0c;融合了Cocos2d-html5和Cocos2d-x JavaScript Bindings。它支持Cocos2d-x的所有特性并提供更简单易用的Javascript风格API。 核心特性 极大改进了ccui控件布局库的性能和稳定性&#xff0c;ccui在RC0中被大幅度重构&#xff0…

【GCC】1: RTCP RR接收端生成

m79 代码。参考bytewoods 大神的以下文章:WebRTC 基于GCC的拥塞控制(上) WebRTC 基于GCC的拥塞控制(下)虽然可以拿到估算的带宽但是rtcp 总是malformed packet个 有必要带着问题跟进下整个过程 RR报文 基于丢包率的码率控制运行在发送端,依靠RTCP RR报文进行工作。* report b…

STM32之RCC

STM32 RCC复位与时钟配置&#xff0c;我首先忽略掉复位&#xff0c;首先学习时钟配置&#xff0c;复位以后用到再学习 STM32有多个时钟源&#xff0c;分别是 HSI:上电默认启动&#xff0c;因精度不高所以先不采用&#xff0c;以后如果需要再使用 HSE&#xff1a;外部高速时钟&…

Apache ShardingSphere 4.0.0-RC2发布

处暑无三日,新凉直万金。处暑之日,Apache ShardingSphere 4.0.0-RC2已经发布,欢迎测试使用&#xff01; 本次发布的4.0.0-RC2版本将前不久发布的4.0.0-RC1版本的核心功能不断打磨优化&#xff0c;修复社区反馈的问题&#xff0c;且持续进行微内核重构打磨&#xff1b;在社区建设…

macOS Ventura 13.4 RC2(22F63)发布

系统介绍 根据黑果魏叔官网提供&#xff1a;5 月 12 日消息&#xff0c;苹果今天面向开发人员&#xff0c;发布了 macOS Ventura 13.4 的第 2 个候选 RC 版本&#xff08;内部版本号 22F63&#xff09;&#xff0c;距离上个候选版本相隔数天时间。 macOS Ventura 带来了台前调…

.NET 6 RC2 版本发布

原文&#xff1a;bit.ly/3FS9xm7作者&#xff1a;Richard日期&#xff1a;2021-10-12翻译&#xff1a;精致码农-王亮说明&#xff1a;文中有大量的超链接&#xff0c;这些链接在公众号文章中被自动剔除&#xff0c;一部分包含超链接列表的小段落被我删减了&#xff0c;如果你对…

c#加密:三、对称加密 AES、DES、RC2、Rijndael

一、c#中的对称加密概述 对称加密算法在加密和解密时使用相同的密钥。Framework提供了四种对称加密算法。AES、DES、Rijndael、RC2。 DES&#xff1a;全称为Data Encryption Standard&#xff0c;即数据加密标准&#xff0c;是一种使用密钥加密的块算法&#xff0c;1977年被美…