今天把MSP430的FLASH調了一下,發現我們可以利用430自身的FLASH,而不必去擴充EEROM來儲存用戶的數據。 用途:可用來存儲A/D采集的數據,如果是常量就不要用這種方法了,直接"CONST"就行了,編譯器自動儲存到FLASH里。
具體方法: 先把完整的程序編好(不包括FLASH的),然后編譯(我用的是IAR,CCE沒試過),進行在線仿真(軟仿真硬仿真均可),在菜單欄選擇"View/Memory",然后就可以看到FLASH 各個地址的數據了,記下FLASH 還沒有被程序占用的空間的地址,然后將FLASH的程序加到你的主程序里,再編譯,檢驗你記下的地址是否被程序占用,如果占用就選擇一個新的地址就可以了。然后就可以向FLASH里寫數據了。
注意事項: 不要向有程序代碼的空間寫數據,那樣會導致程序運行不正常; 寫數據之前要先擦除; 不要向0段FLASH里寫數據,那里面有你程序中的中斷向量; 最好選擇每段的起始地址作為數據儲存的首地址;
總結: 這種方法不需要擴充外存儲器,可以降低系統的復雜度和系統功耗。 我也不知道這種方法實用不實用,既然有這種方法,我就發上來了,分享一下^_^。
 
代碼如下:
// 注意時鐘源的選擇,flash_clk:500k(官方資料是250K—475K) //********************************************************************************** #include <msp430x16x.h> #include"FLASH.H" //addr:FLASH的一個段首地址, value:數組名 count:要儲存的數據個數 //把FLASH地址、數組名 和要存儲的數據的個數 賦給下面的函數,就可以寫入了 //********************************************************************************** void write_flash_char (unsigned int addr, char *array,int count) //寫 char型數組 { char *Flash_ptr; // Flash pointer int i; Flash_ptr = (char *)addr; // Initialize Flash pointer FCTL1 = FWKEY + ERASE; // Set Erase bit FCTL3 = FWKEY; // Clear Lock bit *Flash_ptr = 0; // Dummy write to erase Flash segment FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<count; i++) { *Flash_ptr++ = array[I]; // Write value to flash } FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; // Set LOCK bit }
//********************************************************************************** void write_flash_int (unsigned int addr, int *array,int count) //addr為段首地址,寫 int型數組 { int *Flash_ptr; // Flash pointer int i; Flash_ptr = (int *)addr; // Initialize Flash pointer FCTL1 = FWKEY + ERASE; // Set Erase bit FCTL3 = FWKEY; // Clear Lock bit *Flash_ptr = 0; // Dummy write to erase Flash segment FCTL1 = FWKEY + WRT; // Set WRT bit for write operation for (i=0; i<count; i++) { *Flash_ptr++ = array[I]; // Write value to flash }
FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; // Set LOCK bit }
//********************************************************************************** char read_flash_char0(unsigned int addr) //讀單字節 { char *address; address=(char*)addr; return *address; }
//********************************************************************************** //把FLASH地址、數組名 和要讀取的數據的個數 賦給下面的函數,就可以讀入了 void read_flash_char1(unsigned int addr,char *array,int count) //讀一串數據 { char *address=(char *)addr; for(int i=0;i<count;i++) { array[I]=*address++; } }
//********************************************************************************** int read_flash_int0(unsigned int addr) //偶地址,讀一個字 { int *address=(int *)addr; return *address; }
//********************************************************************************** void read_flash_int1(unsigned int addr,int *array, int count) //讀整形數組 { int *address=(int *)addr; for(int i=0;i<count;i++) { array[I]=*address++; } }
//********************************************************************************** void init_flash(void) { FCTL2 = FWKEY + +FSSEL1+FSSEL0 + FN0; // (DCO)SMCLK/2 for Flash Timing Generator } |