写EEPROM,写FLASH经验记录

本文分享了一款产品从EEPROM向STM32105芯片移植用户数据的经验。详细介绍了需求分析、资源评估、模拟EEPROM实现及调试过程中遇到的问题与解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    最近在做一款产品移植。用户数据一共7块内容。老产品都是用EEPROM的读写方式通信,内在的东西不熟悉,看不到。

然而在STM32105里面,自己开始琢磨用户数据的保存,开始搬迁。首次玩此款芯片,经验不多经历了很多坎坷,写篇文章记录:

1、明确需求很重要。我的数据有4块是小数据而且经常要改动,有1块 数据不常用,内容几十字节。有1块数据接近2K,有1块数据大于2K。

2、明确平台资源。STM32105RC, 64KRAM,256KROM, flash的页大小2K一页。

3、寻找轮子,向前进。官网模拟EEPROM的例程:STM32F10x_AN2594_FW_V3.1.0优化(FLASH模拟EEPROM)

4、耐心磨刀。特别是经验不足的新手(我)。

    a.在第1调需求没明确,导致个别区块大小定义不准确。同样影响常用数据分类,数据大小分类的准确性

    b.七块数据保守估计4K,没理解透第2条,天真的去申请操作4K的数据。  

    c.没理解号轮子的特性,竟然误解优化的方法,想拿掉;竟然以为模拟EEPROM,一页可以存2K数据;实际上优化的方法方便读写数据的速度,模拟EEPROM,一半存的是虚拟地址,一半存的数据,准确来说还要预留4个字节存页状态,实际数据不足1K每页。

     d.实战经验缺乏,乱搞了很多次。例如模拟EEPROM写满一页需要回收有效数据,然后转移到新页

     e.折腾了好机会,开始独创新模式,采用模拟EEPROM的原则、理论、方法,单独定义页面来存储接近2K的数据,大于2K的块数据。无奈换页的时候,要么内存数据会被影响,要么换页数据不准确,大小 不到位。不过好事多磨还是解决 了。

总结:再好的记忆也比不上一个烂笔头。数据模型,FLASH存储,MEM申请和释放,数据编辑和换页操作。这4快都是要一笔一划清晰用笔头描绘出来。


### FPGA 中实现 FLASHEEPROM 的读操作 #### 1. FLASH原理 FLASH 存储器是一种非易失性存储设备,支持电可擦除和编程功能。为了通过 FPGA 对 FLASH 进行读操作,通常需要遵循特定的协议来发送命令序列给 FLASH 芯片。 对于大多数 SPI 接口的 FLASH 设备来说,基本的操作流程如下: - 发送指令字节(例如 `0x03` 表示读取) - 如果有地址,则继续发送目标位置的高、中、低三个字节 - 开始传输数据流直到完成所需长度的数据交换 针对 I2C 或者其他类型的接口,过程会有所不同但是核心概念相似——即按照规定的通信标准向器件传递控制信号并接收反馈信息[^2]。 #### 示例代码 (Verilog) ```verilog // 定义SPI模块用于与Flash通讯 module spi_master ( input wire clk, output reg sclk, mosi, inout wire miso, ... ); always @(posedge clk) begin : proc_spi_write_flash case(state) IDLE: if(start_write) state <= SEND_CMD; SEND_CMD: /* Send command byte */ // Code to send the write enable instruction first... // Then switch states as necessary. WRITE_ADDR: /* Transmit address bytes */ ; TRANSFER_DATA: /* Write data into Flash memory */; DONE: /* Finish and reset internal flags */; endcase end ``` 这段伪码展示了如何构建一个简单的状态机去管理 SPI 总线上的事务处理逻辑;实际应用时还需要考虑更多细节比如错误检测机制等[^3]。 #### 2. EEPROM方法 EEPROM 是另一种形式的非挥发性随机存取内存,允许位级别的改而不需要整体抹掉整个区块的内容。当利用 FPGA 控制 EEPROM 工作的时候,同样依赖于相应的硬件连接方式(如I²C/SPI),并且依据具体型号查阅其手册获取详细的寄存器映射表以及访问规则。 以常见的 I2C 协议为例,以下是简化版的 Verilog 描述片段用来说明启动一次 EEPROM 数据记录的过程: ```verilog initial begin iic_start(); // Generate start condition on bus send_byte(DEVICE_ADDR_WRITE); // Address of device with R/W bit set low for writing wait_acknowledge(); send_byte(addr_high); send_byte(addr_low); // Specify location within EEPROM where we want to store our value(s). wait_acknowledge(); send_data(data_to_store); // Actually transmit what you wish to save here. iic_stop(); // End communication session properly after all actions are done. end ``` 上述例子假设存在辅助函数可以执行像开始/停止条件生成这样的底层任务,并且能够正确地等待来自从属方的认可响应[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值