STM32-外部FLASH(W25Q64)模拟U盘-开源代码

1. 开发板型号:

STM32F103C8T6
外部FLASH芯片:W25Q64
开发软件:KEIL、基于HAL库

2. 接口连接:

CS-->PA4
MISO-->PA6
MOSI-->PA7
CLK-->PA5

4. 实验结果


在这里插入图片描述
对U盘进行初始化,就可以往FLASH中丢文件拉

5. 源代码

链接:https://pan.baidu.com/s/1iNitk3AQYoklgQ5opJTZag?pwd=wnxo
提取码:wnxo

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
这里提供一个基于STM32F103C8T6和W25Q64的SPI闪存读写的示例代码,仅供参考。 首先,需要在STM32中配置SPI接口,可以使用STM32CubeMX工具进行配置。假设SPI1接口被配置为主机模式,时钟频率为36MHz。 然后,需要定义一些常量和变量: ```c #define W25Q64_CMD_READ 0x03 // 读命令 #define W25Q64_CMD_WRITE_ENABLE 0x06 // 写使能命令 #define W25Q64_CMD_WRITE_DISABLE 0x04 // 写禁止命令 #define W25Q64_CMD_PAGE_PROGRAM 0x02 // 页面编程命令 #define W25Q64_PAGE_SIZE 256 // 页面大小 #define W25Q64_SECTOR_SIZE 4096 // 扇区大小 uint8_t spiTxBuffer[2]; // SPI发送缓冲区 uint8_t spiRxBuffer[2]; // SPI接收缓冲区 ``` 接下来,可以编写读取闪存的函数: ```c void w25q64_read(uint32_t address, uint8_t *data, uint32_t length) { uint32_t i; // 选择闪存 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 发送读命令和地址 spiTxBuffer[0] = W25Q64_CMD_READ; spiTxBuffer[1] = (address >> 16) & 0xFF; spiTxBuffer[2] = (address >> 8) & 0xFF; spiTxBuffer[3] = address & 0xFF; HAL_SPI_Transmit(&hspi1, spiTxBuffer, 4, HAL_MAX_DELAY); // 接收数据 for (i = 0; i < length; i++) { HAL_SPI_TransmitReceive(&hspi1, spiTxBuffer, spiRxBuffer, 1, HAL_MAX_DELAY); data[i] = spiRxBuffer[0]; } // 取消闪存选择 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); } ``` 该函数向闪存发送读命令和地址,并从SPI接口接收数据。注意,需要先选择闪存,然后再取消选择。 接下来,可以编写写入闪存的函数: ```c void w25q64_write(uint32_t address, uint8_t *data, uint32_t length) { uint32_t i, j; uint32_t pageAddress, pageOffset, pageRemain, sectorAddress; // 计算扇区地址和偏移量 sectorAddress = address & ~(W25Q64_SECTOR_SIZE - 1); pageOffset = address & (W25Q64_PAGE_SIZE - 1); // 选择闪存 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 发送写使能命令 spiTxBuffer[0] = W25Q64_CMD_WRITE_ENABLE; HAL_SPI_Transmit(&hspi1, spiTxBuffer, 1, HAL_MAX_DELAY); // 写入数据 for (i = 0; i < length; i += pageRemain) { // 计算页面地址和剩余长度 pageAddress = (address + i) & ~(W25Q64_PAGE_SIZE - 1); pageRemain = W25Q64_PAGE_SIZE - pageOffset; if (pageRemain > length - i) pageRemain = length - i; // 发送页面编程命令和地址 spiTxBuffer[0] = W25Q64_CMD_PAGE_PROGRAM; spiTxBuffer[1] = (pageAddress >> 16) & 0xFF; spiTxBuffer[2] = (pageAddress >> 8) & 0xFF; spiTxBuffer[3] = pageAddress & 0xFF; HAL_SPI_Transmit(&hspi1, spiTxBuffer, 4, HAL_MAX_DELAY); // 发送数据 for (j = 0; j < pageRemain; j++) { spiTxBuffer[0] = data[i + j]; HAL_SPI_Transmit(&hspi1, spiTxBuffer, 1, HAL_MAX_DELAY); } // 等待页面编程完成 while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET) {} // 计算下一个页面地址和偏移量 pageOffset = (pageOffset + pageRemain) & (W25Q64_PAGE_SIZE - 1); if (pageOffset == 0) address += pageRemain; } // 发送写禁止命令 spiTxBuffer[0] = W25Q64_CMD_WRITE_DISABLE; HAL_SPI_Transmit(&hspi1, spiTxBuffer, 1, HAL_MAX_DELAY); // 取消闪存选择 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); } ``` 该函数首先计算扇区地址和页面偏移量,然后根据页面大小将数据分块写入。在写入每个页面之前,需要发送写使能命令和页面编程命令和地址,并等待页面编程完成。最后,发送写禁止命令,并取消闪存选择。 需要注意的是,闪存的写入速度比较慢,需要等待页面编程完成才能进行下一次写入操作。因此,这里使用了一个忙等待的方式,等待页面编程完成。 完整代码如下:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值