关于STM32像EPROM一样可以单字节写内部Flash的理解

本文探讨了STM32内部Flash试图模仿EPROM操作的局限性,包括Flash写入原理、页擦除指令的影响及内存需求。提出了通过缓冲区实现任意长度数据写入的解决方案,并讨论了在RTOS环境下实现的注意事项。

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

    都有说STM32的内部Flash可以像EPROM一样操作,单个字节单个字节的写入。根据本人的拙见,其实也就仅仅是“像”而已。原因有以下几点:


1.首先Flash这种东西,其写入数据的原理是便是将1变成0,所以你的某地址Flash一旦已经写过数据而且不为0,则当你再次需要向该地址写数据时,必须要先擦除,即把该地址先全部变成1,否则你将数据写入该地址后,基本上该地址里面的值已经不是你写入的值了。


2.STM32对内部Flash有页(1k或者2K)擦除指令,也就是STM32不能单独对某一个或者某几个字节进行擦除。而擦除操作并不需要大量内存。


3.如果要像EPROM一样操作Flash,其原理是先把该一页里面的数据全部读到一个buf里面,如果你希望整页的数据不丢失,那么buf的大小至少应该和页大小一样,即为1K或者2K(大小视MCU型号而定)。然后对整页进行擦除,再把要写入的数据先写到之前的buf里面(用要写入的数据替换buf里相应位置的原来的数据),再把整个buf写到Flash里面。如此便实现了任意数据长度的数据写入Flash。


4.正如第3点,如果你跑的是系统,诸如(UCOS,RTX,FRERTOS)等,那么你进行此操作的task的堆栈至少应该为1K+N或者2K+N。否则直接堆栈溢出而进hard fault。我想这是我们大家所不能忍受的。


      当然,对于上述问题有一些变通的方法,如果你要写入的数据比较少,比如几十个Byte,那么你可以将buf改小,只要大于等于你要保存的数据数量就可以了,这样便可以大大减小内存。另外,STM32支持字(4Byte)或者半字(2Byte)写入,所以你的buf应该为偶数。如果你要写入的数量为奇数,buf也应该为偶数,不足的在buf里补0或任意一个数就好。因为,如果你的buf为奇数的话,在写入最后一个数据时,系统会在内存中随便抓一个地址里的数据,写进去,这可能出问题。(究竟有没问题我没有试过)。

### STM32EPROM的操作 对于STM32微控制器而言,通常并不直接支持EPROM存储器的内置集成。STM32系列主要集成了闪存(Flash)、静态随机存取存储器(SRAM),以及某些型号可能具备的一次性可编程(OTP)区域[^1]。 然而,在特定应用场景下,如果需要利用外部EPROM进行数据存储或程序烧录,则可以通过SPI、I²C或其他串行通信接口连接外置EPROM芯片实现这一功能。具体操作流程如下: #### 数据写入EPROM实例 为了向外部EPROM写入数据,首先需通过相应的硬件接口初始化配置,并按照EPROM的数据手册规定完成擦除、编程等命令序列发送。下面给出一段基于SPI接口访问EPROM的简化代码示例: ```c #include "stm32f4xx_hal.h" // 假设已经完成了必要的HAL库初始化工作... void EPROM_WriteByte(uint8_t data, uint16_t address){ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // CS低电平选通 SPI_HandleTypeDef hspi1; uint8_t cmd[3]; cmd[0] = WRITE_COMMAND; // 指令 cmd[1] = (uint8_t)(address>>8);// 高地址字节 cmd[2] = (uint8_t)address; // 低地址字节 HAL_SPI_Transmit(&hspi1, cmd, 3, HAL_MAX_DELAY); HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // CS高电平取消选通 } ``` 需要注意的是上述代码仅为示意性质,实际应用时应参照所使用的EPROM器件规格书调整参数设置并加入错误处理逻辑。 当涉及到程序烧录至EPROM时,通常是先将编译好的ELF文件转换为目标设备能够识别的二进制镜像格式,再借助专用工具如ST-Link Utility软件经由调试接口下载到STM32内部RAM中运行专门编的小型加载程序负责最终把该映像复制到外部EPROM里去[^2][^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值