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