關(guān)中斷,還是開(kāi)中斷?這是個(gè)問(wèn)題。
大家知道,在單片機(jī)運(yùn)行的時(shí)候,經(jīng)常有一些數(shù)據(jù)需要保存,而且即使掉電后,這些數(shù)據(jù)也不能丟失。用一片EEPROM,如24C02可以解決,但是這會(huì)增加成本。所以,一個(gè)比較常用的辦法,是把數(shù)據(jù)存入單片機(jī)的Flash,這種方法叫IAP(In Application Programming)。
此方法雖然省錢(qián),但用的不對(duì)也會(huì)帶來(lái)各種困擾,看看大家的討論就知道了:
我們先看一下Flash的原理,然后探討一下寫(xiě)程序時(shí),有什么需要注意的。現(xiàn)在單片機(jī)中集成的一般是Nor Flash,這種技術(shù)是Intel在1988年推出的,它利用浮柵場(chǎng)效應(yīng)管(Floating Gate MOSFET)存儲(chǔ)程序或數(shù)據(jù)。簡(jiǎn)單來(lái)說(shuō),浮柵就像一個(gè)囚禁電子的籠子,通過(guò)在柵極加正向電壓,可以把電子捕獲到籠子里,通過(guò)加負(fù)電壓,可以把電子從籠子里全部趕走。而數(shù)據(jù)的讀取,是通過(guò)檢測(cè)柵極中有沒(méi)有存儲(chǔ)電子,這一過(guò)程不會(huì)導(dǎo)致浮柵中電子的狀態(tài)改變。
(From Technical Note by Macronix International)
這樣,我們很容易理解,在擦寫(xiě)Flash的時(shí)候,不應(yīng)該去讀Flash。回到開(kāi)始的問(wèn)題,在程序擦寫(xiě)Flash期間,是不是應(yīng)該把中斷關(guān)掉呢?因?yàn)槲覀冎乐袛嘞蛄勘恚J(rèn)是存放在Flash中的。真不一定,還是需要具體情況具體分析。一些早期的單片機(jī),擦寫(xiě)Flash的代碼,需要拷貝到RAM里執(zhí)行,并且必須關(guān)閉所有中斷,否則會(huì)出錯(cuò)。但是現(xiàn)在推出的單片機(jī),一般都引入了Stall機(jī)制,在擦寫(xiě)Flash的時(shí)候,讀Flash的操作會(huì)被阻止,擦寫(xiě)完之后,才能繼續(xù)執(zhí)行。
比如STM32F030手冊(cè)中,有以下描述:
我們可以用程序觀察一下。程序里有一個(gè)1ms中斷,每進(jìn)入一次中斷翻轉(zhuǎn)一次引腳,在主程序的循環(huán)中,每1S執(zhí)行一次Flash頁(yè)擦除操作。可以看到擦除Flash一個(gè)頁(yè)用了21.9ms。在擦除期間,1ms中斷停止響應(yīng),擦完后1ms中斷繼續(xù)執(zhí)行。
如果程序?qū)χ袛囗憫?yīng)要求特別高,比如精確計(jì)時(shí),或者中斷需要馬上響應(yīng),可以把中斷向量表和中斷響應(yīng)代碼都放到RAM中執(zhí)行,有興趣的同學(xué)可以自己試一下。
再有一種情況就是,如果單片機(jī)中有兩個(gè)以上的Flash Bank,中斷向量表在一個(gè)Bank中,那么擦寫(xiě)其它Bank時(shí),中斷響應(yīng)是不受影響的。
審核編輯:劉清
-
FlaSh
+關(guān)注
關(guān)注
10文章
1638瀏覽量
148206 -
中斷
+關(guān)注
關(guān)注
5文章
899瀏覽量
41559 -
EEPROM
+關(guān)注
關(guān)注
9文章
1023瀏覽量
81727
原文標(biāo)題:R&D奇譚 第7期: 讀寫(xiě)Flash時(shí),要不要關(guān)中斷?
文章出處:【微信號(hào):TopSemic,微信公眾號(hào):TopSemic嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論