使用帶有雙組閃存的MCU優(yōu)點(diǎn)
當使用非易失性存儲器來(lái)存儲變量時(shí),雙組Flash可以設計為將所有非易失性變量都存儲在一個(gè)Flash組中,即:一個(gè)塊用作偽EEPROM,代碼在另一個(gè)組中。 例如,所有數據都將存儲在Flash B中,寫(xiě)入和擦除存儲器的代碼將在Flash A中,以便更加高效地使用RAM和堆棧。在雙組Flash MCU中也不需要CPU 拖延。系統可以保持運行,因為只有一半的存儲器需要高電壓,另一半可以繼續正常的代碼執行。當構建應用來(lái)避免阻塞代碼時(shí),這尤為重要(代碼的各部分,要么停止CPU,或在環(huán)路等待事件發(fā)生以繼續代碼執行,在這種情況下等待Flash命令完成)。
本文引用地址:http://dyxdggzs.com/article/119044.htm將數據保存在Flash B中的另一個(gè)好處是不需要禁用中斷功能,因為中斷矢量表是Flash A的一部分。這意味著(zhù)所有串行通信、模數轉換、定時(shí)器等都可以保持運行,啟用中斷功能,代碼可以在命令執行的過(guò)程中進(jìn)行跳轉,提取中斷矢量,執行中斷服務(wù)例程,并返回,以驗證Flash操作是否完成,以及是否需要啟動(dòng)新操作。
另外一個(gè)特點(diǎn)是向執行整個(gè)設計遠程升級的應用添加故障容忍功能??梢詫⑿马椖堪姹颈4嬖谝粋€(gè)Flash組中,在另一個(gè)組中作為備份進(jìn)行保存。一旦上傳了新版本并通過(guò)了驗證,那么以前的版本便可以擦除。在系統設計級,可以總是使用Flash A在Flash B中寫(xiě)入新版本,反之亦然。這樣,即使在更新過(guò)程中發(fā)生了故障,也不會(huì )丟失工作版本。
使用Flash存儲非易失性信息的一個(gè)限制是字節必須處于已擦除狀態(tài)(所有位都設為邏輯“1”)才能夠寫(xiě)入。這意味著(zhù)擦除操作將所有位都從扇區轉換為“1”,而寫(xiě)入操作將某些或全部位都改為“0”。這樣產(chǎn)生的問(wèn)題是,如果一個(gè)變量發(fā)生了改變,需要進(jìn)行非易失性備份,那么首先需要擦除字節,但是由于Flash不能逐個(gè)字節擦除,因此需要擦除整個(gè)扇區。
執行EEPROM仿真的例程旨在使用Flash而不是單字節寫(xiě)入和擦除功能來(lái)提供EEPROM功能。一般做法是使用需要存儲在Flash中的所有變量創(chuàng )建一個(gè)結構;該結構添加一個(gè)字段,指示該扇區是否活動(dòng)(這應該是寫(xiě)入的最后一個(gè)字節,以驗證所有數據是否已經(jīng)正確寫(xiě)入)。當需要在Flash中更新某些信息時(shí),復制整個(gè)結構。每當字節改變時(shí)都進(jìn)行非易失性更新,或根據定時(shí)器持續進(jìn)行備份作為應用執行的一部分。
根據應用類(lèi)型,可能進(jìn)行某些改變,以減少執行EEPROM仿真或增加系統強勁性所需的Flash容量。例如,如果使用一個(gè)Flash扇區,非易失性結構將寫(xiě)入同一扇區,只要適合扇區大小,能寫(xiě)入多少次就寫(xiě)多少次(因此,建議結構大小適合扇區內的準確次數,通常是兩種大小的功率)。在Flash扇區填滿(mǎn)后,代碼需要擦除扇區并重新開(kāi)始。這種方法的好處是只使用一個(gè)Flash扇區,限制是如果在扇區擦除步驟發(fā)生斷電,那么所有信息都會(huì )丟失。 另外,Flash耐用性也將加倍。
另一種方法是使用兩個(gè)扇區進(jìn)行EEPROM仿真。只有在把信息寫(xiě)入新扇區后才擦除一個(gè)扇區,因此在Flash中總是有信息的有效副本,從而更加強韌,能夠確保即使在擦除或寫(xiě)入過(guò)程中發(fā)生掉電,信息也不會(huì )丟失,還增加了存儲非易失性信息所需的Flash容量。 根據應用要求來(lái)確定應該使用哪種方法。
案例研究: 如何在飛思卡爾S08系列中寫(xiě)入/擦除Flash
在S08系列中執行寫(xiě)入或擦除操作的步驟與此類(lèi)似。如果要獨立進(jìn)行寫(xiě)入、突發(fā)寫(xiě)入、擦除或整體擦除,第一步是用一些數據寫(xiě)入Flash位置(區別在于如果命令是擦除或整體擦除,那么所寫(xiě)入的數據是沒(méi)有影響的)。之后,寄存器FCMD(Flash命令)需要寫(xiě)入要執行的操作,然后在Flash狀態(tài)寄存器中寫(xiě)入一個(gè)位來(lái)下發(fā)命令,代碼需要檢查下發(fā)的Flash命令是否會(huì )產(chǎn)生錯誤。在單組Flash部署中,代碼需要等待設置Flash命令完成標志,以便它可以返回正常的代碼執行,對于雙組Flash,在檢查了下發(fā)Flash命令沒(méi)有導致錯誤產(chǎn)生后將立即返回執行其它代碼部分。建議在下發(fā)新命令前,代碼總是檢查以前的命令是否已經(jīng)完成,以避免潛在的問(wèn)題。
下面的文本框是關(guān)于如何為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部分主要文件調用擦除和單字節寫(xiě)入例程的典型實(shí)施方案。宏定義允許為兩種目的使用相同的例程,因為這兩種操作非常相似。下面是一種推薦的寫(xiě)入/擦除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
所有寄存器和位名稱(chēng)對應于飛思卡爾S08系列MCU中現有的名稱(chēng)。
結論
飛思卡爾雙組Flash是一個(gè)簡(jiǎn)單的想法,通過(guò)增強性能、避免CPU拖延情況、在代碼執行過(guò)程中保持中斷服務(wù)例程、不需要把例程復制到RAM,簡(jiǎn)化了應用設計。有了這些功能,可以更容易地設計和部署在代碼執行過(guò)程中需要寫(xiě)入或擦除Flash存儲器的最終應用。
引導程序或EEPROM仿真等應用通過(guò)考慮正確的存儲器分配并消除一些限制(如在Flash例程執行過(guò)程中停止通信外設),利用該功能,從而提高效率。
存儲器相關(guān)文章:存儲器原理
評論