W25Q64 Flash存储传感器数据
🔥 实际问题:
"野外监测设备需要断电保存最后100条温湿度记录" 🚀 三步解决方案: 硬件接线: [backcolor=var(--ds-md-code-block-banner-wrap-background-color)][color=var(--dsr-text-2)]text
[color=var(--dsr-icon-fg-1)][color=var(--button-text-color)][backcolor=var(--ds-button-color)][color=var(--button-icon-color)]
复制
[color=var(--button-text-color)][backcolor=var(--ds-button-color)][color=var(--button-icon-color)]
下载
PA5 → FLASH_CLK PA6 → FLASH_MISO PA7 → FLASH_MOSI PA4 → FLASH_CS
关键代码(带错误重试机制):
[backcolor=var(--ds-md-code-block-banner-wrap-background-color)][color=var(--dsr-text-2)]c
[color=var(--dsr-icon-fg-1)][color=var(--button-text-color)][backcolor=var(--ds-button-color)][color=var(--button-icon-color)]
复制
[color=var(--button-text-color)][backcolor=var(--ds-button-color)][color=var(--button-icon-color)]
下载
// 读取Flash ID(验证通信)uint32_t Read_ID() { uint8_t cmd[4 = {0x9F, 0, 0, 0}; uint8_t id[3; HAL_SPI_TransmitReceive(&hspi1, cmd, id, 4, 100); return (id[0<<16)|(id[1<<8)|id[2; // 应返回0xEF4017}// 写入数据(含擦除判断)void Flash_Write(uint32_t addr, uint8_t *data, uint16_t len) { W25Q64_WriteEnable(); HAL_SPI_Transmit(&hspi1, "\x02", 1, 100); // 页编程指令 HAL_SPI_Transmit(&hspi1, (uint8_t*)&addr, 3, 100); HAL_SPI_Transmit(&hspi1, data, len, 100); while(W25Q64_Busy()); // 等待写入完成}
数据管理技巧:
使用循环队列存储:addr = (index % 100) * 64 添加CRC校验:HAL_CRC_Calculate(&hcrc, data, len)
|