在上一節中我介紹了Flash控制器時鍾頻率的設置,對於一般不需要解保護的Flash操作而言,設置了時鍾頻率就可以開始對Flash控制器的控制寄存器寫入指令從而對之前我們覺得神秘莫測的Flash進行操作了。關於Flash的指令操作,我們首先先介紹其相關的幾個寄存器,以及它們的指令形式,還有如何應用這些指令到寄存器上。
首先我們先看Flash狀態寄存器FSTAT,凡是涉及到狀態的,無非就是標志位,所以在這個寄存器中的所有位都是標志位,由於我們這篇文檔不涉及到寫保護與錯誤處理,所以只需要看其中的兩位,CCIF與MGBUSY。
對CCIF位與MGBUSY位,手冊中都已經做了解釋如下:
CCIF位是指令執行完成中斷標志,我們這里是將其當做中斷標志位查詢來用的(有興趣可以好好看看手冊如何實現中斷),CCIF用來顯示一個Flash指令是否已經執行完成,若CCIF = 0 則表示Flash控制器正在執行指令,若CCIF = 1則表示Flash控制器當前空閑,前一條指令已經執行完畢。除此以外,CCIF的重要作用就是讓Flash控制器開始執行指令,由於Flash控制器的指令內容需要在開始前先行准備到Flash指令寄存器中,當指令准備完成后,通過將CCIF位置1就可以使Flash控制器執行當前寫入在指令寄存器中的指令。需要注意的是,當Flash需要執行下一條指令前,務必要檢查前一條指令是否已經執行完畢,即CCIF是否為1,若CCIF = 1則再寫入1方可執行指令寄存器中的內容。
讀取MGBUSY位與讀取CCIF位功能類似,手冊中關於這一位的描述是這樣的:
當MGBUSY = 0 表示Flash控制器目前空閑,MGBUSY = 1 表示當前Flash控制器正在執行指令。一般而言我們還是用CCIF多一點,看個人喜好了
認識了標志寄存器后,就該隆重介紹Flash擦寫過程中最重要的兩大寄存器——FCCOB寄存器與FCCOBIX寄存器了。
關於FCCOBIX寄存器,由於介紹比較短,我們先來介紹了FCCOBIX寄存器,一樣先看手冊:
這是個只有3位的寄存器最多只能有8個狀態,上面的簡介顯示,這個寄存器是FCCOB的索引寄存器,更進一步來看文檔:
通過手冊中的解釋,也就是說FCCOBIX的兩位決定當前讀取或者寫入FCCOB的是哪一個word(一般而言一個word在單片機中指兩個字節),也就是說FCCOB是一個多word的寄存器,通過FCCOBIX來確定當前操作或者讀取的是哪一位。
下面我們就來看看FCCOB(Flash通用命令對象寄存器,簡稱Flash指令寄存器)這個寄存器的介紹:
第一句說FCCOB是一個六個word長度的數組,通過FCCOBIX寄存器來定位當前操作的是哪個word。一個word是16位的,前[7:0]位Low,后[15:8]為High。我們似乎很少見到這種數組類型的寄存器,但如果我們將它與我們C語言中的數組聯系起來就非常容易理解了。由於FCCOB只有6個word長,所以FCCOBIX范圍為0x00-0x05,也就是說當FCCOBIX = 0x00時,讀寫FCCOB寄存器操作第0個word的內容,當FCCOBIX = 0x01時,讀寫FCCOB寄存器操作第1個word的內容以此類推。也就是說我們操作的FCCOB實際的內容是由FCCOBIX這個索引寄存器來完全控制的。
本篇文檔中着重介紹了Flash擦寫相關的幾個重要寄存器:
1. Flash操作狀態寄存器FSTAT,其中讀取CCIF位可以判斷當前Flash控制器正在執行指令與否。在Flash控制器空閑時,向CCIF中寫入1可以開始指令執行
2. Flash指令寄存器FCCOB與FCCOBIX,其中FCCOB為長度為6個word的數組寄存器,通過FCCOBIX中的內容索引當前操作的是哪一個word
在介紹完執行指令的寄存器后,下面我們將介紹Flash操作的指令與執行過程
未完待續
注: 本系列文章均為原創,如有轉載引用請標明來源