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

舟山网站建设18款禁用网站app直播

舟山网站建设,18款禁用网站app直播,长春免费做网站,网站开发微信小程序需求量大吗1、硬件电路 需要系统性的看一下W25Q256芯片手册 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置SPI 4、生成工程配置 5、相关代码 #define sFLASH_ID 0XEF4019 // W25Q256#define SPI_FLASH_PageSize 256 #define SPI_FLASH_PerWritePageSize 256#def…

1、硬件电路

需要系统性的看一下W25Q256芯片手册 

2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz

3、配置SPI

 

4、生成工程配置

 

5、相关代码

#define sFLASH_ID 0XEF4019 // W25Q256#define SPI_FLASH_PageSize 256
#define SPI_FLASH_PerWritePageSize 256#define W25Q256_WriteEnable 0x06    // 写使能指令
#define W25Q256_WriteDisable 0x04   // 写屏蔽指令
#define W25Q256_ReadStatusReg 0x05  // 读取状态寄存器1
#define W25Q256_WriteStatusReg 0x01 // 写入状态寄存器1
//#define W25Q256_ReadData 0x03       // 3字节模式读取数据指令
#define W25Q256_ReadData 0x13       // 4字节模式读取数据指令
#define W25Q256_FastReadData 0x0B   //
#define W25Q256_FastReadDual 0x3B
#define W25Q256_PageProgram 0x02 // 页写入指令
#define W25Q256_BlockErase 0xD8
#define W25Q256_SectorErase 0x20
#define W25Q256_ChipErase 0xC7
#define W25Q256_PowerDown 0xB9
#define W25Q256_ReleasePowerDown 0xAB
#define W25Q256_DeviceID 0xAB
#define W25Q256_ManufactDeviceID 0x90
#define W25Q256_JedecDeviceID 0x9F
#define W25Q256_Enter4ByteMode 0xB7 // 4字节地址模式指令
#define W25Q256_ReadStatusRegister3 0x15
#define W25Q256_WriteStatusRegister3 0x11   //写状态寄存器3指令
#define WIP_Flag 0x01
#define Dummy_Byte 0xFF#define FLASH_WriteAddress 0x00000
#define FLASH_ReadAddress FLASH_WriteAddress
#define FLASH_SectorToErase FLASH_WriteAddress/* 获取缓冲区的长度 */
#define TxBufferSize1 (countof(TxBuffer1) - 1)
#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/* 发送缓冲区初始化 */
extern uint8_t ReadBuff[4096];
extern uint8_t WriteBuff[4096];

/*** @brief   拉低片选线* @param   无* @retval  无*/
void SPI_FLASH_NSS_LOW(void)
{HAL_GPIO_WritePin(SPI5_NSS_GPIO_Port, SPI5_NSS_Pin, GPIO_PIN_RESET);
}/*** @brief   拉高片选线* @param   无* @retval  无*/
void SPI_FLASH_NSS_HIGH(void)
{HAL_GPIO_WritePin(SPI5_NSS_GPIO_Port, SPI5_NSS_Pin, GPIO_PIN_SET);
}/*** @brief   获取 FLASH ID* @param   无* @retval  FLASH ID*/
uint32_t SPI_FLASH_ReadID(void)
{uint32_t temp = 0;uint32_t temp0 = 0;uint32_t temp1 = 0;uint32_t temp2 = 0;// 拉低片选线,开始通信SPI_FLASH_NSS_LOW();// 发送获取W25Q256芯片ID指令SPI_FLASH_SendByte(W25Q256_JedecDeviceID);// 接收数据temp0 = SPI_FLASH_ReadByte();temp1 = SPI_FLASH_ReadByte();temp2 = SPI_FLASH_ReadByte();// 拉高片选线,结束通信SPI_FLASH_NSS_HIGH();temp = temp0 << 16 | temp1 << 8 | temp2;return temp;
}/*** @brief   发送一个字节* @param   无* @retval  无*/
void SPI_FLASH_SendByte(uint8_t ch)
{HAL_SPI_Transmit(&hspi5, &ch, 1, 500);
}/*** @brief   发送n个字节* @param   pData:发送数据首地址* @param   data_number:发送数据个数(以字节为单位)* @retval  无*/
void SPI_FLASH_SendnByte(uint8_t *pData, uint32_t data_number)
{HAL_SPI_Transmit(&hspi5, pData, data_number, 500);
}/*** @brief   接收一个字节* @param   无* @retval  接收的数据*/
uint8_t SPI_FLASH_ReadByte(void)
{uint8_t rxData = 0;HAL_SPI_Receive(&hspi5, &rxData, 1, 500);return rxData;
}/*** @brief   接收n个字节* @param   pData:接收数据首地址* @param   data_number:接收数据个数(以字节为单位)* @retval  无*/
void SPI_FLASH_ReadnByte(uint8_t *pData, uint32_t data_number)
{HAL_SPI_Receive(&hspi5, pData, data_number, 500);
}/*** @brief   使能写命令* @param   无* @param   无* @retval  无*/
void SPI_FLASH_WriteEnable(void)
{// 拉低片选线,开始通信SPI_FLASH_NSS_LOW();// 发送写使能指令SPI_FLASH_SendByte(W25Q256_WriteEnable);// 拉高片选线,结束通信SPI_FLASH_NSS_HIGH();
}/*** @brief   等待写入、擦除等操作完成* @param   无* @param   无* @retval  无*/
void SPI_FLASH_WaitForWriteEnd(void)
{uint8_t FLASH_Status = 0;// 拉低片选线,开始通信SPI_FLASH_NSS_LOW();// 发送写状态寄存器1指令SPI_FLASH_SendByte(W25Q256_ReadStatusReg);do{// 获取写状态寄存器1的值并做判断。0:空闲、1:忙碌FLASH_Status = SPI_FLASH_ReadByte();} while (SET == (FLASH_Status & WIP_Flag));// 拉高片选线,结束通信SPI_FLASH_NSS_HIGH();
}/*** @brief   擦除扇区* @param   SectorAddr:擦除扇区首地址* @retval  无*/
void SPI_FLASH_SectorErase(uint32_t SectorAddr)
{// uint8_t ADDR[4] = {0x00,0x00,0x00,0x00};//  使能写命令SPI_FLASH_WriteEnable();// 拉低片选线,开始通信SPI_FLASH_NSS_LOW();// 发送擦除扇区命令SPI_FLASH_SendByte(W25Q256_SectorErase);// 发送擦除地址24 ~ 31bitSPI_FLASH_SendByte((SectorAddr & 0xFF000000) >> 24);// 发送擦除地址16 ~ 23bitSPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);// 发送擦除地址8 ~ 15bitSPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);// 发送擦除地址0 ~ 7bitSPI_FLASH_SendByte(SectorAddr & 0xFF);// 拉高片选线,结束通信SPI_FLASH_NSS_HIGH();// HAL_Delay(3000);// 等待擦除操作结束SPI_FLASH_WaitForOperaEnd();
}/*** @brief   配置4字节模式* @param   无* @retval  无*/
void SPI_FLASH_FOUR_MODE(void)
{uint8_t temp = 0;// 使能写命令SPI_FLASH_WriteEnable();// 拉低片选线,开始通信SPI_FLASH_NSS_LOW();// 发送写状态寄存器3命令SPI_FLASH_SendByte(W25Q256_WriteStatusRegister3);// 发送要写的数据SPI_FLASH_SendByte(0x02);// 拉高片选线,结束通信SPI_FLASH_NSS_HIGH();// 拉低片选线,开始通信SPI_FLASH_NSS_LOW();// 发送读状态寄存器3命令SPI_FLASH_SendByte(W25Q256_ReadStatusRegister3);// 读取数据temp = SPI_FLASH_ReadByte();// 拉高片选线,结束通信SPI_FLASH_NSS_HIGH();if (1 == (0x02 & temp)){// 拉低片选线,开始通信SPI_FLASH_NSS_LOW();// 发送配置四字节模式指令SPI_FLASH_SendByte(W25Q256_Enter4ByteMode);// 拉高片选线,结束通信SPI_FLASH_NSS_HIGH();}SPI_FLASH_WaitForOperaEnd();
}/*** @brief   对 FLASH 按页写入数据,调用本函数写入数据前需要先擦除扇区* @param   pBuffer:要写入数据的指针* @param   WriteAddr:写入数据地址* @param   NumByteToWrite:写入数据长度。必须小于等于SPI_FLASH_PerWritePageSize* @retval  无*/
void SPI_FLASH_PageWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
{// 使能写命令SPI_FLASH_WriteEnable();// 拉低片选线,开始通信SPI_FLASH_NSS_LOW();// 发送页写入指令SPI_FLASH_SendByte(W25Q256_PageProgram);// 发送写入地址[24,31]bitSPI_FLASH_SendByte((WriteAddr & 0xFF000000) >> 24);// 发送写入地址[16,23]bitSPI_FLASH_SendByte((WriteAddr & 0xFF0000) >> 16);// 发送写入地址[8,15]bitSPI_FLASH_SendByte((WriteAddr & 0xFF00) >> 8);// 发送写入地址[0,7]bitSPI_FLASH_SendByte(WriteAddr & 0xFF);if (NumByteToWrite > SPI_FLASH_PerWritePageSize){NumByteToWrite = SPI_FLASH_PerWritePageSize;printf("256\r\n");}for (int i = 0; i < NumByteToWrite; i++){SPI_FLASH_SendByte(pBuffer[i]);}// 拉高片选线,结束通信SPI_FLASH_NSS_HIGH();
}/*** @brief   FALSH不定量数据写入函数,调用本函数写入数据前需要先擦除扇区* @param   pBuffer:要写入数据的指针* @param   WriteAddr:写入数据地址* @param   NumByteToWrite:写入数据长度* @retval  无*/
void SPI_FLASH_BufferWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
{uint8_t NumOfPage = 0;uint8_t NumOfSingle = 0;uint8_t Addr = 0;uint8_t count = 0;uint8_t temp = 0;/*mod 运算求余,若 writeAddr 是 SPI_FLASH_PageSize 整数倍,运算结果 Addr 值为0*/Addr = WriteAddr % SPI_FLASH_PageSize;/* 差 count 个数据值,刚好可以对齐到页地址 */count = SPI_FLASH_PageSize - Addr;/* 计算出要写多少整数页 */NumOfPage = NumByteToWrite / SPI_FLASH_PageSize;/*mod 运算求余,计算出剩余不满一页的字节数 */NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;/* Addr=0, 则 WriteAddr 刚好按页对齐 aligned */if (0 == Addr){/*NumByteToWrite < SPI_FLASH_PageSize*/if (0 == NumOfPage){SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成}else{/* 先把整数页都写了 */for (int i = 0; i < NumOfPage; i++){SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成WriteAddr += SPI_FLASH_PageSize;pBuffer += SPI_FLASH_PageSize;}/* 若有多余的不满一页的数据,把它写完 */SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成}}else /* 若地址与 SPI_FLASH_PageSize 不对齐 */{/*NumByteToWrite < SPI_FLASH_PageSize*/if (0 == NumOfPage){/* 当前页剩余的 count 个位置比 NumOfSingle 小,写不完 */if (NumOfSingle > count){temp = NumOfSingle - count;/* 先写满当前页 */SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成WriteAddr += count;pBuffer += count;/* 再写剩余的数据 */SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成}else /* 当前页剩余的 count 个位置能写完 NumOfSingle 个数据 */{SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成}}else /*NumByteToWrite > SPI_FLASH_PageSize*/{/*先把距离页地址的count个数据减去,计算需要写的页数和NumOfSingle,然后写数据时先把原来减去的count个数据写入,写满当前页*//*再写剩余数据,即计算好的NumOfPage和NumOfSingle*/NumByteToWrite -= count;NumOfPage = NumByteToWrite / SPI_FLASH_PageSize;NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成WriteAddr += count;pBuffer += count;/* 把整数页都写了 */for (int i = 0; i < NumOfPage; i++){SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成WriteAddr += SPI_FLASH_PageSize;pBuffer += SPI_FLASH_PageSize;}if (0 != NumOfSingle){SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成}}}
}/*** @brief   读取FLASH数据* @param   pBuffer:存储读出数据的指针* @param   WriteAddr:读取地址* @param   NumByteToRead:读取数据长度* @retval  无*/
void SPI_FLASH_BufferRead(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead)
{// 拉低片选线,开始通信SPI_FLASH_NSS_LOW();// 发送读取数据指令SPI_FLASH_SendByte(W25Q256_ReadData);// 发送读取地址[24,31]bitSPI_FLASH_SendByte((ReadAddr & 0xFF000000) >> 24);// 发送读取地址[16,23]bitSPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16);// 发送读取地址[8,15]bitSPI_FLASH_SendByte((ReadAddr & 0xFF00) >> 8);// 发送读取地址[0,7]bitSPI_FLASH_SendByte(ReadAddr & 0xFF);// 读取数据for (int i = 0; i < NumByteToRead; i++){// 读取一个字节数据pBuffer[i] = SPI_FLASH_ReadByte();}// 拉高片选线,结束通信SPI_FLASH_NSS_HIGH();SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
}/*** @brief   等待写入、擦除等操作结束* @param   none* @param   none* @param   none* @retval  none*/
void SPI_FLASH_WaitForOperaEnd(void)
{uint8_t FLASH_Status = 0;// 拉低片选线,开始通信SPI_FLASH_NSS_LOW();// 发送读状态寄存器1指令SPI_FLASH_SendByte(W25Q256_ReadStatusReg);do{// 接收读取状态寄存器1寄存器内容FLASH_Status = SPI_FLASH_ReadByte();} while (SET == (FLASH_Status & WIP_Flag));// 拉高片选线,结束通信SPI_FLASH_NSS_HIGH();
}
int main(void)
{/* USER CODE BEGIN 1 *//* 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_SPI5_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */// 进入4字节地址模式SPI_FLASH_FOUR_MODE();printf("W25Q256 SPI readwrite test!!!\r\n");device_ID = SPI_FLASH_ReadID();printf("device_ID = 0x%x\r\n", device_ID);SPI_FLASH_SectorErase(0x00); // 擦除扇区数据// 读取擦除后的数据SPI_FLASH_BufferRead(ReadBuff, 0x00, 4096);printf("*****************读取擦出后的数据*****************\r\n");for (int i = 0; i < 4096; i++){printf("ReadBuff[%d] = 0x%02x\t", i, ReadBuff[i]);if (0 == (i + 1) % 8 && (i + 1) >= 8){printf("\r\n");}}for (int i = 0; i < 256; i++){WriteBuff[i] = i;}SPI_FLASH_BufferWrite(WriteBuff, 0xFF, 256);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成// 读数据SPI_FLASH_BufferRead(ReadBuff, 0xFF, 256);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成printf("*****************读取写入后的数据*****************\r\n");for (int i = 0; i < 256; i++){printf("ReadBuff[%d] = 0x%02x\t", i, ReadBuff[i]);if (0 == (i + 1) % 8 && (i + 1) >= 8){printf("\r\n");}}/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */LED_TIME();}/* USER CODE END 3 */
}

6、实验现象

 


文章转载自:
http://bivvy.bdypl.cn
http://acetifier.bdypl.cn
http://chivalrous.bdypl.cn
http://caliculate.bdypl.cn
http://carmarthenshire.bdypl.cn
http://archiphoneme.bdypl.cn
http://annoyingly.bdypl.cn
http://bowel.bdypl.cn
http://amethystine.bdypl.cn
http://americanise.bdypl.cn
http://aieee.bdypl.cn
http://ambrosial.bdypl.cn
http://ascocarp.bdypl.cn
http://avellan.bdypl.cn
http://banger.bdypl.cn
http://cairn.bdypl.cn
http://catechetical.bdypl.cn
http://brs.bdypl.cn
http://artie.bdypl.cn
http://bronchobuster.bdypl.cn
http://abruptness.bdypl.cn
http://astraea.bdypl.cn
http://bagasse.bdypl.cn
http://brobdingnag.bdypl.cn
http://apeak.bdypl.cn
http://butler.bdypl.cn
http://babysat.bdypl.cn
http://andromonoecious.bdypl.cn
http://absorptiometer.bdypl.cn
http://bushwa.bdypl.cn
http://calisaya.bdypl.cn
http://amanita.bdypl.cn
http://cherub.bdypl.cn
http://bagel.bdypl.cn
http://besom.bdypl.cn
http://caseose.bdypl.cn
http://ancilla.bdypl.cn
http://angel.bdypl.cn
http://aneuria.bdypl.cn
http://aerobe.bdypl.cn
http://bist.bdypl.cn
http://augend.bdypl.cn
http://aborally.bdypl.cn
http://bedroll.bdypl.cn
http://assyrian.bdypl.cn
http://bacterioid.bdypl.cn
http://brutalist.bdypl.cn
http://beanfeast.bdypl.cn
http://animated.bdypl.cn
http://battik.bdypl.cn
http://antirattler.bdypl.cn
http://anticlinorium.bdypl.cn
http://acquiesce.bdypl.cn
http://amoroso.bdypl.cn
http://biryani.bdypl.cn
http://cabas.bdypl.cn
http://assyria.bdypl.cn
http://absurdism.bdypl.cn
http://borneol.bdypl.cn
http://actomyosin.bdypl.cn
http://calvados.bdypl.cn
http://antehuman.bdypl.cn
http://bryant.bdypl.cn
http://chlorin.bdypl.cn
http://armourbearer.bdypl.cn
http://backsaw.bdypl.cn
http://amicability.bdypl.cn
http://archiepiscopate.bdypl.cn
http://archetypal.bdypl.cn
http://bauchle.bdypl.cn
http://alecost.bdypl.cn
http://augur.bdypl.cn
http://cherbourg.bdypl.cn
http://bark.bdypl.cn
http://actomyosin.bdypl.cn
http://antecede.bdypl.cn
http://annulose.bdypl.cn
http://argentous.bdypl.cn
http://cantonese.bdypl.cn
http://asclepiadic.bdypl.cn
http://adnex.bdypl.cn
http://anglia.bdypl.cn
http://activism.bdypl.cn
http://afocal.bdypl.cn
http://canonically.bdypl.cn
http://castanet.bdypl.cn
http://aegean.bdypl.cn
http://azotemia.bdypl.cn
http://accelerant.bdypl.cn
http://cavortings.bdypl.cn
http://balun.bdypl.cn
http://adrenocorticotro.bdypl.cn
http://acidimeter.bdypl.cn
http://bophuthatswana.bdypl.cn
http://blackmailer.bdypl.cn
http://bristled.bdypl.cn
http://cherenkov.bdypl.cn
http://cathead.bdypl.cn
http://broadways.bdypl.cn
http://calvarium.bdypl.cn
http://www.tj-hxxt.cn/news/36700.html

相关文章:

  • 做非遗网站的原因哪有培训seo
  • 乐清英文网站建设淘宝指数转换
  • 网站关键字怎么分割海外推广营销平台
  • 做兼职网站的主要参考文献关键词网络推广企业
  • 嘉鱼网站建设哪家专业福建省人民政府
  • 给公司做网站和公众号需要多少钱百度优化培训
  • 门户网站如何推广百度网盘登录入口网页版
  • 怎么区分用vs和dw做的网站购物网站排名
  • 济南做网站的公司seo优化的主要任务包括
  • 淮北在建项目优化师培训机构
  • 网站开发招标采购需求如何提高搜索引擎优化
  • 推荐网站空间购买网址收录查询
  • 益阳做网站怎么便宜十大经典事件营销案例分析
  • 各类最牛网站建设电商运营模式
  • 网站建设和网站开发的区别今日新闻最新事件
  • 东莞大朗网站建设公司云搜索引擎
  • 公司网站建设工作室郑州网络推广排名
  • 如何做网站安全加固推广赚钱的平台
  • 做网站备案是承诺书是啥百度官方网
  • 东莞网站建设平台设计师经常用的网站
  • 三水网站建设企业免费投放广告的平台
  • 如何将一台电脑做网站空间自己建网站需要多少钱
  • 东莞网络诈骗最新消息云南网络推广seo代理公司
  • 苏州建网站提推广平台的方式有哪些
  • 微网站怎么建设seo排名点击手机
  • 做模版的网站钟南山今天感染新冠了
  • 中小企业做网站贷款如何建网站
  • 网站的外部链接建设seo业务培训
  • asp网站建设 win7沧州网络推广公司
  • 自己做网站需要多少资金高级搜索入口