当前位置: 首页 > news >正文

有做兼职赚钱的网站吗做网站开发甲方一直要求p图

有做兼职赚钱的网站吗,做网站开发甲方一直要求p图,wordpress怎么设置页面导航,工业企业网站建设STM32CubeMX移植SPI协议驱动W25Q16FLash存储器 SPI简介拓扑结构时钟相位#xff08;CPHA#xff09;和时钟极性#xff08; CPOL#xff09; W25Q16简介什么是Flash#xff0c;有什么特点#xff1f;W25Q16内部块、扇区、页的划分引脚定义通讯方式控制指令原理图 CubeMX配… STM32CubeMX移植SPI协议驱动W25Q16FLash存储器 SPI简介拓扑结构时钟相位CPHA和时钟极性 CPOL W25Q16简介什么是Flash有什么特点W25Q16内部块、扇区、页的划分引脚定义通讯方式控制指令原理图 CubeMX配置驱动代码运行结果 W25Q16 是一种常见的串行闪存Flash存储器芯片由 Winbond 公司生产。它是一种高性能、低功耗的闪存存储器,采用的是SPI通讯协议想要想使用W25Q16就必须要先会SPI协议。 SPI简介 SPISerial Peripheral Interface是一种常用的串行通信协议通常用于在数字集成电路之间进行通信如微控制器、传感器、存储器、显示器等。SPI 协议定义了一种全双工、同步的串行数据传输方式它通常由一个主设备Master和一个或多个从设备Slave组成。 SPI 协议的主要特点包括 全双工通信主设备和从设备可以同时发送和接收数据这使得 SPI 通信速度较快。 同步通信通信时钟由主设备生成主设备控制数据传输的时序。这种同步方式可以提供较高的通信速率。 多从设备支持SPI 允许主设备与多个从设备进行通信每个从设备都有一个片选信号Chip Select用于选择要通信的目标设备。 单主多从结构在标准的 SPI 总线中通常只有一个主设备多个从设备。但是也有一些扩展协议支持多主设备的情况。 串行传输数据在时钟的边沿进行传输可以是上升沿或下降沿取决于设备的配置。 SPI 协议通常由以下几条信号线组成 SCLKSerial Clock时钟信号由主设备产生用于同步数据传输。 MOSIMaster Out Slave In主设备输出、从设备输入的数据线。 MISOMaster In Slave Out主设备输入、从设备输出的数据线。 SS/CSSlave Select/Chip Select片选信号由主设备控制用于选择要通信的从设备。 由于本篇章的重点是W25Q16芯片介绍所以这里不做过多的介绍SPI通讯协议基础内容可以浏览蓝桥杯单片机学习——SPI协议DS1302实时时钟这里介绍以下STM32上SPI的几个重要概念 拓扑结构 时钟相位CPHA和时钟极性 CPOL 时钟极性 CPOL在没有数据传输时时钟线的电平状态0表示空闲时低电平1表示空闲时高电平。时钟相位CPHA时钟线在第几个时钟边沿采集数据0表示在第一个边沿开始采集1表示在第二个边沿开始采集。不同的时钟相位和时钟极性可以得到不同的SPI工作频率 W25Q16简介 W25Q16 是一种常见的串行闪存Flash存储器芯片由 Winbond 公司生产。W25Q16采用的是SPI通讯协议支持STM32的SPI数据传输时序0CPOL 0 CPHA 0和模式3CPOL 1CPHA 1数据格式是长度为8位MSB在前LSB在后。它是一种高性能、低功耗的闪存存储器具有以下特点 存储容量W25Q16 芯片的存储容量为16 MegabitMb相当于2 MegabyteMB其中1 Byte 8 bit。 接口W25Q16 使用 SPISerial Peripheral Interface串行接口进行通信这使得它易于与各种微控制器和数字集成电路进行连接。 工作电压典型的工作电压为2.7V 至 3.6V支持广泛的供电范围适用于各种电源条件下的应用。 工作温度W25Q16 在工业级温度范围内-40°C 至 85°C可靠工作适用于工业和商业应用环境。 封装W25Q16 芯片通常采用表面贴装封装Surface Mount Package如8-pin SOICSmall Outline Integrated Circuit封装方便集成到电路板上。 快速擦除和编程W25Q16 支持快速擦除和编程操作使得数据更新和存储操作更加高效。 多种保护功能W25Q16 芯片提供了多种保护功能如写保护功能、全片擦除保护、写使能锁定等有助于提高数据的安全性和可靠性。 其他型号的Flas芯片主要差距体现在存储器大小比如W25Q32就是存储容量为32Mb 4MB 什么是Flash有什么特点 FLASH是常用的用于储存数据的半导体器件它具有容量大可重复擦写、按“扇区/块”擦除、掉电后数据可继续保存的特性。FLASH是有一个物理特性只能写0不能写1写1靠擦除。FLASH主要有NOR Flash和NAND Flash两种类型NOR和NAND是两种数字门电路。NOR Flash基于字节读写读取速度快独立地址/数据线无坏块支持XIP常见的应用有25QXX系列芯片和存储程序的ROMNAND FLASH基于块读写读取速度稍慢地址数据线共用有坏块不支持XIP常见的应用有EMMC、SSD、U盘等 XIP一般来说处理器都是在flash上读取代码到RAM里面执行这样读取效率相对会低而XIP则是支持处理器直接在FLash上读取程序并执行可以提高运行效率。 W25Q16内部块、扇区、页的划分 W25Q16将内部的存储空间分为了32个块每个块大小64KB每个块分为16个扇区大小为4KB每个扇区分作16个页每个页为256个字节页是Flash读写操作的最小单位。W25Q16共有16 * 16 * 32 8192个页 Flash存储器存在坏块的情况当某一个页损坏而无法读写时可能会导致整个块读写过程中某个数据读写异常而无法使用且这种损坏是不可逆的换句话来说一个页损坏会导致整个块无法正常读写只能使用其他块进行读写导致Flash容量下降。 引脚定义 /CS片选信号低电平有效用作SPI通讯使用DOIO1数据输出引脚MISO/WPIO2写保护引脚低电平有效GND接地DIIO4数据输入引脚MOSICLKSPI时钟引脚/HOLDIO3暂停通讯引脚高电平有效VCC电源引脚 通讯方式 控制指令 在对W25Q16进行操作之前需要先发送指令以控制W25Q16以下是所有的指令集 通常我们对W25Q16进行读写操作只需要以下几条指令即可完成 原理图 CubeMX配置 SPI配置注意芯片引脚和原理图对应上。 GPIO配置配置的是片选信号使其默认高电平即可。 定时器配置用于试下微妙延时以实现W25Q16的底层代码时序要求。 其他部分的配置自行完成由于不涉及W25Q16的驱动所以不做展示。 驱动代码 关于驱动代码这里我是采用的正点原子提供的源码然后修改以一部分用作CubeMX配置移植使用仅作个人学习使用 norflash.c #include norflash.h #include spi.h #include delay.h #include usart.h #include stm32f4xx_hal_gpio.h // //本程序只供学习使用未经作者许可不得用于其它任何用途 //ALIENTEK NANO STM32F4开发板 //W25QXX驱动代码 //正点原子ALIENTEK //技术论坛:www.openedv.com //创建日期:2019/4/23 //版本V1.0 //版权所有盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2019-2029 //All rights reserved //uint16_t NORFLASH_TYPE NM25Q16; //默认就是NM25Q16//4Kbytes为一个Sector //16个扇区为1个Block //W25X16 //容量为2M字节,共有32个Block,512个Sector//初始化SPI FLASH的IO口 void Norflash_Init(void) { // GPIO_InitTypeDef GPIO_Initure;// __HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟// GPIO_Initure.Pin GPIO_PIN_12; //PB12 // GPIO_Initure.Mode GPIO_MODE_OUTPUT_PP; //推挽输出 // GPIO_Initure.Pull GPIO_PULLUP; //上拉 // GPIO_Initure.Speed GPIO_SPEED_HIGH; //高速 // HAL_GPIO_Init(GPIOB, GPIO_Initure); //初始化NORFLASH_CS 1; //SPI FLASH不选中 // SPI2_Init(); //初始化SPI // SPI2_SetSpeed(SPI_BAUDRATEPRESCALER_4); //设置为24M时钟,高速模式NORFLASH_TYPE Norflash_ReadID(); //读取FLASH ID. }//读取SPI_FLASH的状态寄存器 //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 uint8_t Norflash_ReadSR(void) {uint8_t byte 0;NORFLASH_CS 0; //使能器件SPI2_ReadWriteByte(FLASH_ReadStatusReg); //发送读取状态寄存器命令byte SPI2_ReadWriteByte(0Xff); //读取一个字节NORFLASH_CS 1; //取消片选return byte; } //写SPI_FLASH状态寄存器 //只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以写!!! void Norflash_Write_SR(uint8_t sr) {NORFLASH_CS 0; //使能器件SPI2_ReadWriteByte(FLASH_WriteStatusReg); //发送写取状态寄存器命令SPI2_ReadWriteByte(sr); //写入一个字节NORFLASH_CS 1; //取消片选 } //SPI_FLASH写使能 //将WEL置位 void Norflash_Write_Enable(void) {NORFLASH_CS 0; //使能器件SPI2_ReadWriteByte(FLASH_WriteEnable); //发送写使能NORFLASH_CS 1; //取消片选 } //SPI_FLASH写禁止 //将WEL清零 void Norflash_Write_Disable(void) {NORFLASH_CS 0; //使能器件SPI2_ReadWriteByte(FLASH_WriteDisable); //发送写禁止指令NORFLASH_CS 1; //取消片选 } //读取芯片ID W25X16的ID:0XEF14 uint16_t Norflash_ReadID(void) {uint16_t Temp 0;NORFLASH_CS 0;SPI2_ReadWriteByte(0x90);//发送读取ID命令SPI2_ReadWriteByte(0x00);SPI2_ReadWriteByte(0x00);SPI2_ReadWriteByte(0x00);Temp | SPI2_ReadWriteByte(0xFF) 8;Temp | SPI2_ReadWriteByte(0xFF);NORFLASH_CS 1;return Temp; } //读取SPI FLASH //在指定地址开始读取指定长度的数据 //pBuffer:数据存储区 //ReadAddr:开始读取的地址(24bit) //NumByteToRead:要读取的字节数(最大65535) void Norflash_Read(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) {uint16_t i;NORFLASH_CS 0; //使能器件SPI2_ReadWriteByte(FLASH_ReadData); //发送读取命令SPI2_ReadWriteByte((uint8_t)((ReadAddr) 16)); //发送24bit地址SPI2_ReadWriteByte((uint8_t)((ReadAddr) 8));SPI2_ReadWriteByte((uint8_t)ReadAddr);for (i 0; i NumByteToRead; i){pBuffer[i] SPI2_ReadWriteByte(0XFF); //循环读数}NORFLASH_CS 1; //取消片选 } //SPI在一页(0~65535)内写入少于256个字节的数据 //在指定地址开始写入最大256字节的数据 //pBuffer:数据存储区 //WriteAddr:开始写入的地址(24bit) //NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!! void Norflash_Write_Page(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) {uint16_t i;Norflash_Write_Enable(); //SET WELNORFLASH_CS 0; //使能器件SPI2_ReadWriteByte(FLASH_PageProgram); //发送写页命令SPI2_ReadWriteByte((uint8_t)((WriteAddr) 16)); //发送24bit地址SPI2_ReadWriteByte((uint8_t)((WriteAddr) 8));SPI2_ReadWriteByte((uint8_t)WriteAddr);for (i 0; i NumByteToWrite; i)SPI2_ReadWriteByte(pBuffer[i]); //循环写数NORFLASH_CS 1; //取消片选Norflash_Wait_Busy(); //等待写入结束 } //无检验写SPI FLASH //必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败! //具有自动换页功能 //在指定地址开始写入指定长度的数据,但是要确保地址不越界! //pBuffer:数据存储区 //WriteAddr:开始写入的地址(24bit) //NumByteToWrite:要写入的字节数(最大65535) //CHECK OK void Norflash_Write_NoCheck(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) {uint16_t pageremain;pageremain 256 - WriteAddr % 256; //单页剩余的字节数if (NumByteToWrite pageremain)pageremain NumByteToWrite; //不大于256个字节while (1){Norflash_Write_Page(pBuffer, WriteAddr, pageremain);if (NumByteToWrite pageremain)break; //写入结束了else //NumByteToWritepageremain{pBuffer pageremain;WriteAddr pageremain;NumByteToWrite - pageremain; //减去已经写入了的字节数if (NumByteToWrite 256)pageremain 256; //一次可以写入256个字节else pageremain NumByteToWrite; //不够256个字节了}}; } //写SPI FLASH //在指定地址开始写入指定长度的数据 //该函数带擦除操作! //pBuffer:数据存储区 //WriteAddr:开始写入的地址(24bit) //NumByteToWrite:要写入的字节数(最大65535) uint8_t W25QXX_BUFFER[4096]; void Norflash_Write(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) {uint32_t secpos;uint16_t secoff;uint16_t secremain;uint16_t i;secpos WriteAddr / 4096; //扇区地址 0~511 for w25x16secoff WriteAddr % 4096; //在扇区内的偏移secremain 4096 - secoff; //扇区剩余空间大小if (NumByteToWrite secremain)secremain NumByteToWrite; //不大于4096个字节while (1){Norflash_Read(W25QXX_BUFFER, secpos * 4096, 4096); //读出整个扇区的内容for (i 0; i secremain; i) //校验数据{if (W25QXX_BUFFER[secoff i] ! 0XFF)break; //需要擦除}if (i secremain) //需要擦除{Norflash_Erase_Sector(secpos);//擦除这个扇区for (i 0; i secremain; i) //复制{W25QXX_BUFFER[i secoff] pBuffer[i];}Norflash_Write_NoCheck(W25QXX_BUFFER, secpos * 4096, 4096); //写入整个扇区}else Norflash_Write_NoCheck(pBuffer, WriteAddr, secremain); //写已经擦除了的,直接写入扇区剩余区间.if (NumByteToWrite secremain)break; //写入结束了else//写入未结束{secpos;//扇区地址增1secoff 0; //偏移位置为0pBuffer secremain; //指针偏移WriteAddr secremain; //写地址偏移NumByteToWrite - secremain; //字节数递减if (NumByteToWrite 4096)secremain 4096; //下一个扇区还是写不完else secremain NumByteToWrite; //下一个扇区可以写完了}} } //擦除整个芯片 //整片擦除时间: //W25X16:25s //W25X32:40s //W25X64:40s //等待时间超长... void Norflash_Erase_Chip(void) {Norflash_Write_Enable(); //SET WELNorflash_Wait_Busy();NORFLASH_CS 0; //使能器件SPI2_ReadWriteByte(FLASH_ChipErase); //发送片擦除命令NORFLASH_CS 1; //取消片选Norflash_Wait_Busy(); //等待芯片擦除结束 } //擦除一个扇区 //Dst_Addr:扇区地址 0~511 for w25x16 //擦除一个山区的最少时间:150ms void Norflash_Erase_Sector(uint32_t Dst_Addr) {Dst_Addr * 4096;Norflash_Write_Enable(); //SET WELNorflash_Wait_Busy();NORFLASH_CS 0; //使能器件SPI2_ReadWriteByte(FLASH_SectorErase); //发送扇区擦除指令SPI2_ReadWriteByte((uint8_t)((Dst_Addr) 16)); //发送24bit地址SPI2_ReadWriteByte((uint8_t)((Dst_Addr) 8));SPI2_ReadWriteByte((uint8_t)Dst_Addr);NORFLASH_CS 1; //取消片选Norflash_Wait_Busy(); //等待擦除完成 } //等待空闲 void Norflash_Wait_Busy(void) {while ((Norflash_ReadSR() 0x01) 0x01); // 等待BUSY位清空 } //进入掉电模式 void Norflash_PowerDown(void) {NORFLASH_CS 0; //使能器件SPI2_ReadWriteByte(FLASH_PowerDown); //发送掉电命令NORFLASH_CS 1; //取消片选delay_us(3); //等待TPD } //唤醒 void Norflash_WAKEUP(void) {NORFLASH_CS 0; //使能器件SPI2_ReadWriteByte(FLASH_ReleasePowerDown); // send W25X_PowerDown command 0xABNORFLASH_CS 1; //取消片选delay_us(3); //等待TRES1 } norflash.h #ifndef __NORFLASH_H #define __NORFLASH_H #include main.h // //本程序只供学习使用未经作者许可不得用于其它任何用途 //ALIENTEK NANO STM32F4开发板 //W25QXX驱动代码 //正点原子ALIENTEK //技术论坛:www.openedv.com //创建日期:2019/4/23 //版本V1.0 //版权所有盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2019-2029 //All rights reserved ////W25X系列/Q系列芯片列表 #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 NM25Q16 0X6814 /* NM25Q16 芯片ID */ #define NM25Q64 0X5216 /* NM25Q64 芯片ID */ #define NM25Q128 0X5217 /* NM25Q128 芯片ID */ #define BY25Q64 0X6816 /* BY25Q64 芯片ID */ #define BY25Q128 0X6817 /* BY25Q128 芯片ID */extern uint16_t NORFLASH_TYPE;//定义我们使用的flash芯片型号#define NORFLASH_CS PBout(12) //W25QXX的片选信号 extern uint8_t W25QXX_BUFFER[4096];//指令表 #define FLASH_WriteEnable 0x06 #define FLASH_WriteDisable 0x04 #define FLASH_ReadStatusReg 0x05 #define FLASH_WriteStatusReg 0x01 #define FLASH_ReadData 0x03 #define FLASH_FastReadData 0x0B #define FLASH_FastReadDual 0x3B #define FLASH_PageProgram 0x02 #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 0x9Fvoid Norflash_Init(void); uint16_t Norflash_ReadID(void); //读取FLASH ID uint8_t Norflash_ReadSR(void); //读取状态寄存器 void Norflash_Write_SR(uint8_t sr); //写状态寄存器 void Norflash_Write_Enable(void); //写使能 void Norflash_Write_Disable(void); //写保护 void Norflash_Read(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead); //读取flash void Norflash_Write(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); //写入flash void Norflash_Erase_Chip(void); //整片擦除 void Norflash_Erase_Sector(uint32_t Dst_Addr);//扇区擦除 void Norflash_Wait_Busy(void); //等待空闲 void Norflash_PowerDown(void); //进入掉电模式 void Norflash_WAKEUP(void); //唤醒#endif spi.c在spi.c中添加以下内容。同时注意在spi.h中声明该函数 /SPI2 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 u8 SPI2_ReadWriteByte(u8 TxData) {u8 Rxdata;HAL_SPI_TransmitReceive(hspi2,TxData,Rxdata,1, 1000); return Rxdata; //返回收到的数据 }delay.c // Core\Src\delay.c #include tim.h #include delay.h /*** brief 微秒延时* param Delay_us —— 指定延迟时间长度单位为微秒。* retval None*/ void delay_us(uint32_t Delay_us) {__HAL_TIM_SetCounter(htim11, 0);__HAL_TIM_ENABLE(htim11);while(__HAL_TIM_GetCounter(htim11) Delay_us);/* Disable the Peripheral */__HAL_TIM_DISABLE(htim11); } delay.h // Core\Inc\delay.h #ifndef __DELAY_H__ #define __DELAY_H__#include main.h #include tim.hvoid delay_us(uint32_t Delay_us);#endif /* __DELAY_H__ */ main.h添加以下代码 //定义一些常用的数据类型短关键字 typedef int32_t s32; typedef int16_t s16; typedef int8_t s8;typedef const int32_t sc32; typedef const int16_t sc16; typedef const int8_t sc8; typedef __IO int32_t vs32; typedef __IO int16_t vs16; typedef __IO int8_t vs8;typedef __I int32_t vsc32; typedef __I int16_t vsc16; typedef __I int8_t vsc8; typedef uint32_t u32; typedef uint16_t u16; typedef uint8_t u8;typedef const uint32_t uc32; typedef const uint16_t uc16; typedef const uint8_t uc8; typedef __IO uint32_t vu32; typedef __IO uint16_t vu16; typedef __IO uint8_t vu8;typedef __I uint32_t vuc32; typedef __I uint16_t vuc16; typedef __I uint8_t vuc8; //位带操作,实现51类似的GPIO控制功能 //具体实现思想,参考CM3权威指南第五章(87页~92页). //IO口操作宏定义 #define BITBAND(addr, bitnum) ((addr 0xF0000000)0x2000000((addr 0xFFFFF)5)(bitnum2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) //IO口地址映射 #define GPIOA_ODR_Addr (GPIOA_BASE20) //0x40020014 #define GPIOB_ODR_Addr (GPIOB_BASE20) //0x40020414 #define GPIOC_ODR_Addr (GPIOC_BASE20) //0x40020814 #define GPIOD_ODR_Addr (GPIOD_BASE20) //0x40020C14 #define GPIOA_IDR_Addr (GPIOA_BASE16) //0x40020010 #define GPIOB_IDR_Addr (GPIOB_BASE16) //0x40020410 #define GPIOC_IDR_Addr (GPIOC_BASE16) //0x40020810 #define GPIOD_IDR_Addr (GPIOD_BASE16) //0x40020C10 //IO口操作,只对单一的IO口! //确保n的值小于16! #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入 #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出 #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入 #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出 #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入 main.c //要写入到W25Q16的字符串数组 const uint8_t TEXT_Buffer[] {HelloThe man who dont write code!}; #define SIZE sizeof(TEXT_Buffer) #define FLASH_SIZE 2 * 1024 * 1024 //FLASH 大小为2M字节;int main(void) {/* USER CODE BEGIN 1 */ // uint8_t len;uint8_t datatemp[100]; //flash读取到的内容/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_SPI2_Init();MX_TIM11_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(huart1, (unsigned char* )aRxBuffer, 1); //串口接收中断用作调试Norflash_Init(); //W25QXX初始化printf(SPI TEST\r\n);NORFLASH_TYPE Norflash_ReadID();//读取FLASH IDprintf(id:%#x\r\n,NORFLASH_TYPE); /* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){ // if(USART_RX_STA0x8000) // { // lenUSART_RX_STA0x3fff;//得到此次接收到的数据长度 // printf(\r\n您发送的消息为:\r\n); // HAL_UART_Transmit(huart1,(uint8_t*)USART_RX_BUF,len,1000); //发送接收到的数据 // while(__HAL_UART_GET_FLAG(huart1,UART_FLAG_TC)!SET); //等待发送结束 // printf(\r\n\r\n);//插入换行 // USART_RX_STA0; // }Norflash_Write((uint8_t *)TEXT_Buffer, FLASH_SIZE - 100, sizeof(TEXT_Buffer)); //从倒数第100个地址处开始,写入SIZE长度的数据HAL_Delay(1000);printf(Write:%s\r\n, TEXT_Buffer); //显示读到的字符串Norflash_Read(datatemp, FLASH_SIZE - 100, sizeof(TEXT_Buffer)); //从倒数第100个地址处开始,读出SIZE个字节HAL_Delay(1000);printf(Read:%s\r\n, datatemp); //显示读到的字符串/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */ } 以上就是所有W25Q16的驱动代码仅供个人学习哈如果有哪里有误还请斧正。 运行结果
文章转载自:
http://www.morning.rfyk.cn.gov.cn.rfyk.cn
http://www.morning.xmwdt.cn.gov.cn.xmwdt.cn
http://www.morning.kskpx.cn.gov.cn.kskpx.cn
http://www.morning.ktbjk.cn.gov.cn.ktbjk.cn
http://www.morning.nwzcf.cn.gov.cn.nwzcf.cn
http://www.morning.i-bins.com.gov.cn.i-bins.com
http://www.morning.dnphd.cn.gov.cn.dnphd.cn
http://www.morning.gqflj.cn.gov.cn.gqflj.cn
http://www.morning.bqmdl.cn.gov.cn.bqmdl.cn
http://www.morning.gzgwn.cn.gov.cn.gzgwn.cn
http://www.morning.azxey.cn.gov.cn.azxey.cn
http://www.morning.kqxwm.cn.gov.cn.kqxwm.cn
http://www.morning.npbgj.cn.gov.cn.npbgj.cn
http://www.morning.pqsys.cn.gov.cn.pqsys.cn
http://www.morning.kkysz.cn.gov.cn.kkysz.cn
http://www.morning.qbzfp.cn.gov.cn.qbzfp.cn
http://www.morning.yrck.cn.gov.cn.yrck.cn
http://www.morning.hrqfl.cn.gov.cn.hrqfl.cn
http://www.morning.tqhpt.cn.gov.cn.tqhpt.cn
http://www.morning.fchkc.cn.gov.cn.fchkc.cn
http://www.morning.qnzgr.cn.gov.cn.qnzgr.cn
http://www.morning.gycyt.cn.gov.cn.gycyt.cn
http://www.morning.xprq.cn.gov.cn.xprq.cn
http://www.morning.8yitong.com.gov.cn.8yitong.com
http://www.morning.sxfmg.cn.gov.cn.sxfmg.cn
http://www.morning.xqjz.cn.gov.cn.xqjz.cn
http://www.morning.ggnfy.cn.gov.cn.ggnfy.cn
http://www.morning.zxfdq.cn.gov.cn.zxfdq.cn
http://www.morning.pbtdr.cn.gov.cn.pbtdr.cn
http://www.morning.qxgmp.cn.gov.cn.qxgmp.cn
http://www.morning.dxqwm.cn.gov.cn.dxqwm.cn
http://www.morning.lhztj.cn.gov.cn.lhztj.cn
http://www.morning.dqkcn.cn.gov.cn.dqkcn.cn
http://www.morning.ldqzz.cn.gov.cn.ldqzz.cn
http://www.morning.wcqxj.cn.gov.cn.wcqxj.cn
http://www.morning.xxwhz.cn.gov.cn.xxwhz.cn
http://www.morning.pyxtn.cn.gov.cn.pyxtn.cn
http://www.morning.kcbml.cn.gov.cn.kcbml.cn
http://www.morning.drrt.cn.gov.cn.drrt.cn
http://www.morning.tcfhs.cn.gov.cn.tcfhs.cn
http://www.morning.qrwnj.cn.gov.cn.qrwnj.cn
http://www.morning.ycgrl.cn.gov.cn.ycgrl.cn
http://www.morning.jmwrj.cn.gov.cn.jmwrj.cn
http://www.morning.pyncx.cn.gov.cn.pyncx.cn
http://www.morning.ssmhn.cn.gov.cn.ssmhn.cn
http://www.morning.mxbks.cn.gov.cn.mxbks.cn
http://www.morning.bndkf.cn.gov.cn.bndkf.cn
http://www.morning.pzcqz.cn.gov.cn.pzcqz.cn
http://www.morning.xqndf.cn.gov.cn.xqndf.cn
http://www.morning.lhhkp.cn.gov.cn.lhhkp.cn
http://www.morning.nhzps.cn.gov.cn.nhzps.cn
http://www.morning.glcgy.cn.gov.cn.glcgy.cn
http://www.morning.fcwxs.cn.gov.cn.fcwxs.cn
http://www.morning.wtdyq.cn.gov.cn.wtdyq.cn
http://www.morning.dkzwx.cn.gov.cn.dkzwx.cn
http://www.morning.nxnrt.cn.gov.cn.nxnrt.cn
http://www.morning.stsnf.cn.gov.cn.stsnf.cn
http://www.morning.nbhft.cn.gov.cn.nbhft.cn
http://www.morning.zsgbt.cn.gov.cn.zsgbt.cn
http://www.morning.hsjfs.cn.gov.cn.hsjfs.cn
http://www.morning.ygbq.cn.gov.cn.ygbq.cn
http://www.morning.rdlxh.cn.gov.cn.rdlxh.cn
http://www.morning.rhgtc.cn.gov.cn.rhgtc.cn
http://www.morning.xclgf.cn.gov.cn.xclgf.cn
http://www.morning.nlglm.cn.gov.cn.nlglm.cn
http://www.morning.cgntj.cn.gov.cn.cgntj.cn
http://www.morning.shprz.cn.gov.cn.shprz.cn
http://www.morning.qbfkz.cn.gov.cn.qbfkz.cn
http://www.morning.mmzfl.cn.gov.cn.mmzfl.cn
http://www.morning.stmkm.cn.gov.cn.stmkm.cn
http://www.morning.hrzhg.cn.gov.cn.hrzhg.cn
http://www.morning.ncwgt.cn.gov.cn.ncwgt.cn
http://www.morning.tqjks.cn.gov.cn.tqjks.cn
http://www.morning.cpwmj.cn.gov.cn.cpwmj.cn
http://www.morning.jrpmf.cn.gov.cn.jrpmf.cn
http://www.morning.divocn.com.gov.cn.divocn.com
http://www.morning.lhrxq.cn.gov.cn.lhrxq.cn
http://www.morning.pzbqm.cn.gov.cn.pzbqm.cn
http://www.morning.dgwrz.cn.gov.cn.dgwrz.cn
http://www.morning.znqxt.cn.gov.cn.znqxt.cn
http://www.tj-hxxt.cn/news/255690.html

相关文章:

  • 网站架设软件近三年成功的营销案例
  • 手机网站开发入门宁波网站建设优化的公司排名
  • 做图必备素材网站外贸营销网站建设介绍
  • 网站开发培训费多少android游戏开发教程
  • 河南睢县筑宇建设网站盐城高端网站建设
  • 做论坛网站怎么样备案长沙营销推广公司
  • 任县网站建设网络公司小程序找不到怎么办
  • 网站中文域名好吗定州市住房和城乡建设局 网站
  • 北京设计网站的公司哪家好wordpress wp play
  • 网站建设公司走进深圳易百讯自己给网站做logo
  • 网站虚拟主机 会计处理怎样用微信做购物网站
  • 专注WordPress网站建设开发外观设计
  • 北流网站建设中卫网站定制开发设计
  • 西安网站开发工资网页转app工具
  • 如何做网站的充值功能校园网站建设的意义
  • 句容建设网站天津的公司能在北京做网站备案吗
  • 清迈城市建设网站区块链网站开发体app开发
  • 网站建设设计方案书重庆做网站开发的公司有哪些
  • wordpress建站 产品详情页天津seo托管
  • 百度做网站公司建站系统
  • 做视频播放网站wordpress商城建站
  • 怎样做微商网站wordpress安装错误310
  • 高培淇自己做的网站百度推广开户怎么开
  • 英铭网站建设什么是网上商店
  • 网站推广方案书太原seo霸屏
  • 请简述网站建设的方法搭建网站源码
  • 用php做网站用什么软件网站制作公司网站源码
  • 淘宝建设网站的好处网站建设工作室有几个部门
  • 可以将自己做的衣服展示的网站怎么看网站用什么代码做的
  • 微信页面设计网站ps如何做网站专题