关于STM32像EPROM一样可以单字节写内部Flash的理解
都有说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为奇数的话,在写入最后一个数据时,系统会在内存中随便抓一个地址里的数据,写进去,这可能出问题。(究竟有没问题我没有试过)。