新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 帶有雙組閃存的MCU優點

        帶有雙組閃存的MCU優點

        作者: 時間:2011-05-10 來源:網絡 收藏
        Flash實施方案

        本文引用地址:http://www.104case.com/article/150782.htm

          Flash意味著同一器件中有兩個不同的Flash塊。本文從這里開始以飛思卡爾MC9S08MM128 MCU為例進行闡述。該器件擁有128kB的Flash存儲器,分成兩個64kB的陣列。上一章解釋過在寫入或擦除Flash的這段時間,整個Flash塊都不能讀取。提到有兩種替代方法來執行Flash操作:CPU拖延或從RAM運行。同一邏輯適用于一個Flash,但是由于現在有兩個不同的組,因此代碼可以在Flash A中運行以寫入或擦除Flash B,反之亦然。

        當使用非易失性存儲器來存儲變量時,雙組Flash可以設計為將所有非易失性變量都存儲在一個Flash組中,即:一個塊用作偽EEPROM,代碼在另一個組中。 例如,所有數據都將存儲在Flash B中,寫入和擦除存儲器的代碼將在Flash A中,以便更加高效地使用RAM和堆棧。在雙組Flash MCU中也不需要CPU 拖延。系統可以保持運行,因為只有一半的存儲器需要高電壓,另一半可以繼續正常的代碼執行。當構建應用來避免阻塞代碼時,這尤為重要(代碼的各部分,要么停止CPU,或在環路等待事件發生以繼續代碼執行,在這種情況下等待Flash命令完成)。

          將數據保存在Flash B中的另一個好處是不需要禁用中斷功能,因為中斷矢量表是Flash A的一部分。這意味著所有串行通信、模數轉換、定時器等都可以保持運行,啟用中斷功能,代碼可以在命令執行的過程中進行跳轉,提取中斷矢量,執行中斷服務例程,并返回,以驗證Flash操作是否完成,以及是否需要啟動新操作。

          另外一個特點是向執行整個設計遠程升級的應用添加故障容忍功能。可以將新項目版本保存在一個Flash組中,在另一個組中作為備份進行保存。一旦上傳了新版本并通過了驗證,那么以前的版本便可以擦除。在系統設計級,可以總是使用Flash A在Flash B中寫入新版本,反之亦然。這樣,即使在更新過程中發生了故障,也不會丟失工作版本。

          EEPROM仿真

          使用Flash存儲非易失性信息的一個限制是字節必須處于已擦除狀態(所有位都設為邏輯“1”)才能夠寫入。這意味著擦除操作將所有位都從扇區轉換為“1”,而寫入操作將某些或全部位都改為“0”。這樣產生的問題是,如果一個變量發生了改變,需要進行非易失性備份,那么首先需要擦除字節,但是由于Flash不能逐個字節擦除,因此需要擦除整個扇區。

          執行EEPROM仿真的例程旨在使用Flash而不是單字節寫入和擦除功能來提供EEPROM功能。一般做法是使用需要存儲在Flash中的所有變量創建一個結構;該結構添加一個字段,指示該扇區是否活動(這應該是寫入的最后一個字節,以驗證所有數據是否已經正確寫入)。當需要在Flash中更新某些信息時,復制整個結構。每當字節改變時都進行非易失性更新,或根據定時器持續進行備份作為應用執行的一部分。

          根據應用類型,可能進行某些改變,以減少執行EEPROM仿真或增加系統強勁性所需的Flash容量。例如,如果使用一個Flash扇區,非易失性結構將寫入同一扇區,只要適合扇區大小,能寫入多少次就寫多少次(因此,建議結構大小適合扇區內的準確次數,通常是兩種大小的功率)。在Flash扇區填滿后,代碼需要擦除扇區并重新開始。這種方法的好處是只使用一個Flash扇區,限制是如果在扇區擦除步驟發生斷電,那么所有信息都會丟失。 另外,Flash耐用性也將加倍。

          另一種方法是使用兩個扇區進行EEPROM仿真。只有在把信息寫入新扇區后才擦除一個扇區,因此在Flash中總是有信息的有效副本,從而更加強韌,能夠確保即使在擦除或寫入過程中發生掉電,信息也不會丟失,還增加了存儲非易失性信息所需的Flash容量。 根據應用要求來確定應該使用哪種方法。

          案例研究: 如何在飛思卡爾S08系列中寫入/擦除Flash

          在S08系列中執行寫入或擦除操作的步驟與此類似。如果要獨立進行寫入、突發寫入、擦除或整體擦除,第一步是用一些數據寫入Flash位置(區別在于如果命令是擦除或整體擦除,那么所寫入的數據是沒有影響的)。之后,寄存器FCMD(Flash命令)需要寫入要執行的操作,然后在Flash狀態寄存器中寫入一個位來下發命令,代碼需要檢查下發的Flash命令是否會產生錯誤。在單組Flash部署中,代碼需要等待設置Flash命令完成標志,以便它可以返回正常的代碼執行,對于雙組Flash,在檢查了下發Flash命令沒有導致錯誤產生后將立即返回執行其它代碼部分。建議在下發新命令前,代碼總是檢查以前的命令是否已經完成,以避免潛在的問題。

          下面的文本框是關于如何為MCU部署Flash命令的代碼示例。

          #define Flash_Busy() FSTAT_FCCF

          #define EraseSectorFlashB(Addr) FlashB_Command(Addr, 0xff, FLASH_ERASE_CMD)

          #define WriteByteFlashB(Addr, Data) FlashB_Command(Addr, Data, FLASH_PROGRAM_CMD)

          void main(void)

          {

          unsigned char FlashErasedAddress = 0x4000;

          unsigned char FlashWrittenAddress = 0x4000;

          unsigned char FlashWrittenData = 'A';

          if (!Flash_Busy())

          {

          EraseSectorFlashB(FlashErasedAddress);

          }

          if (!Flash_Busy())

          {

          WriteByteFlashB(FlashWrittenAddress, FlashWrittenData);

          }

          對于雙組Flash:

          本節顯示了Flash B部分主要文件調用擦除和單字節寫入例程的典型實施方案。宏定義允許為兩種目的使用相同的例程,因為這兩種操作非常相似。下面是一種推薦的寫入/擦除Flash例程的部署方法。

          #pragma CODE_SEG FLASH_A

          unsigned char FlashB_Command(unsigned int FlashAddress, unsigned char FlashData, unsigned char Command)

          {

          /* Write Data into Flash*/

          (*(volatile unsigned char *)(FlashAddress)) = FlashData;

          /* Write Command */

          FCMD = Command;

          /* Launch command by setting FSTAT.FCBEF to 1 */

          FSTAT = 0x80;

          /* Wait at least 4 cycles to read the Error Flags */

          _asm NOP;

          _asm NOP;

          _asm NOP;

          _asm NOP;

          /* Check if Flash Access Error or Protection Violation Error are Set */

          if (FSTAT (FSTAT_FACCERR_MASK|FSTAT_FPVIOL_MASK))

          {

          /* If so, finish the function returning FLASH_ERROR to indicate error */

          FlashClearErrorFlags();

          return (FLASH_ERROR);

          }

          /* Return FLASH_OK to indicate that the function executed Ok */

          return (FLASH_OK);

          }

          #pragma CODE_SEG DEFAULT

          所有寄存器和位名稱對應于飛思卡爾S08系列MCU中現有的名稱。

          結論

          飛思卡爾雙組Flash是一個簡單的想法,通過增強性能、避免CPU拖延情況、在代碼執行過程中保持中斷服務例程、不需要把例程復制到RAM,簡化了應用設計。有了這些功能,可以更容易地設計和部署在代碼執行過程中需要寫入或擦除Flash存儲器的最終應用。

          引導程序或EEPROM仿真等應用通過考慮正確的存儲器分配并消除一些限制(如在Flash例程執行過程中停止通信外設),利用該功能,從而提高效率。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 邢台县| 车险| 锡林浩特市| 高要市| 巧家县| 白山市| 宝应县| 固阳县| 彩票| 蒲城县| 普安县| 扎赉特旗| 霍邱县| 天峻县| 日照市| 甘谷县| 利辛县| 仁怀市| 内丘县| 荆门市| 宾川县| 成安县| 西乌珠穆沁旗| 库车县| 车险| 海盐县| 凤阳县| 和平县| 马山县| 镇远县| 盈江县| 犍为县| 江永县| 淄博市| 富裕县| 永年县| 峨边| 遂溪县| 铅山县| 右玉县| 梓潼县|