关于STM32像EPROM一样可以单字节写内部Flash的理解
? ? 都有說(shuō)STM32的內(nèi)部Flash可以像EPROM一樣操作,單個(gè)字節(jié)單個(gè)字節(jié)的寫(xiě)入。根據(jù)本人的拙見(jiàn),其實(shí)也就僅僅是“像”而已。原因有以下幾點(diǎn):
 
1.首先Flash這種東西,其寫(xiě)入數(shù)據(jù)的原理是便是將1變成0,所以你的某地址Flash一旦已經(jīng)寫(xiě)過(guò)數(shù)據(jù)而且不為0,則當(dāng)你再次需要向該地址寫(xiě)數(shù)據(jù)時(shí),必須要先擦除,即把該地址先全部變成1,否則你將數(shù)據(jù)寫(xiě)入該地址后,基本上該地址里面的值已經(jīng)不是你寫(xiě)入的值了。
 
2.STM32對(duì)內(nèi)部Flash有頁(yè)(1k或者2K)擦除指令,也就是STM32不能單獨(dú)對(duì)某一個(gè)或者某幾個(gè)字節(jié)進(jìn)行擦除。而擦除操作并不需要大量?jī)?nèi)存。
 
3.如果要像EPROM一樣操作Flash,其原理是先把該一頁(yè)里面的數(shù)據(jù)全部讀到一個(gè)buf里面,如果你希望整頁(yè)的數(shù)據(jù)不丟失,那么buf的大小至少應(yīng)該和頁(yè)大小一樣,即為1K或者2K(大小視MCU型號(hào)而定)。然后對(duì)整頁(yè)進(jìn)行擦除,再把要寫(xiě)入的數(shù)據(jù)先寫(xiě)到之前的buf里面(用要寫(xiě)入的數(shù)據(jù)替換buf里相應(yīng)位置的原來(lái)的數(shù)據(jù)),再把整個(gè)buf寫(xiě)到Flash里面。如此便實(shí)現(xiàn)了任意數(shù)據(jù)長(zhǎng)度的數(shù)據(jù)寫(xiě)入Flash。
 
4.正如第3點(diǎn),如果你跑的是系統(tǒng),諸如(UCOS,RTX,FRERTOS)等,那么你進(jìn)行此操作的task的堆棧至少應(yīng)該為1K+N或者2K+N。否則直接堆棧溢出而進(jìn)hard fault。我想這是我們大家所不能忍受的。
 
? ? ? 當(dāng)然,對(duì)于上述問(wèn)題有一些變通的方法,如果你要寫(xiě)入的數(shù)據(jù)比較少,比如幾十個(gè)Byte,那么你可以將buf改小,只要大于等于你要保存的數(shù)據(jù)數(shù)量就可以了,這樣便可以大大減小內(nèi)存。另外,STM32支持字(4Byte)或者半字(2Byte)寫(xiě)入,所以你的buf應(yīng)該為偶數(shù)。如果你要寫(xiě)入的數(shù)量為奇數(shù),buf也應(yīng)該為偶數(shù),不足的在buf里補(bǔ)0或任意一個(gè)數(shù)就好。因?yàn)?#xff0c;如果你的buf為奇數(shù)的話,在寫(xiě)入最后一個(gè)數(shù)據(jù)時(shí),系統(tǒng)會(huì)在內(nèi)存中隨便抓一個(gè)地址里的數(shù)據(jù),寫(xiě)進(jìn)去,這可能出問(wèn)題。(究竟有沒(méi)問(wèn)題我沒(méi)有試過(guò))。
總結(jié)
以上是生活随笔為你收集整理的关于STM32像EPROM一样可以单字节写内部Flash的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: SVN 常用操作命令 使用笔记
- 下一篇: svn在commit后报错:is sch
