MSP430F5438學(xué)習(xí)筆記 FLAHS操作
1.前言
MSP430F5438的片內(nèi)FLASH可以當(dāng)做EEPROM使用,該部分FLASH稱為INFO FLASH,總共有4塊每塊128Byte。雖然INFO FLASH容量比較少,但是多數(shù)情況還是夠用的。
【2014年1月回顧】存在問題需要立刻改進(jìn)
2.代碼實(shí)現(xiàn)//時(shí)鐘默認(rèn)情況
//FLL時(shí)鐘FLL選擇XT1
//輔助時(shí)鐘ACLK選擇XT132768Hz
//主系統(tǒng)時(shí)鐘MCLK選擇DCOCLKDIV8000000Hz
//子系統(tǒng)時(shí)鐘SMCLK選擇DCOCLKDIV8000000Hz
//UART時(shí)鐘選擇ACLK
//低頻波特率產(chǎn)生9600-8-N-1
#include
#include
#include
voidclock_config(void);
voidselect_xt1(void);
voiddco_config(void);
voiduart_config(void);
voidflash_writebuf(uint8_t*flash_ptr,uint8_t*buffer,uint8_tlen);
voidflash_readbuf(uint8_t*flash_ptr,uint8_t*buffer,uint8_tlen);
intmain(void)
{
clock_config();//初始化時(shí)鐘
uart_config();//初始化UART
_EINT();
//打印時(shí)間和提示信息
printf("Date:%s%srn",__DATE__,__TIME__);
printf("FlashTest!rn");
#if0
uint8_ttest_buffer[8]={1,2,3,4,5,6,7,8};
flash_writebuf((uint8_t*)0x1800,test_buffer,8);
#endif
uint8_told_flash[8]={0,};
uint8_tnew_flash[8]={0,};
//從infoflash0x1800處連續(xù)讀出8個(gè)字節(jié)
flash_readbuf((uint8_t*)0x1800,old_flash,8);
for(uint8_ti=0;i<8;i++)
{
printf("ADDR:0X%4X,%-2Xrn",0x1800+i,old_flash[i]);
new_flash[i]=old_flash[i]+1;
}
//累加之后再次寫入
flash_writebuf((uint8_t*)0x1800,new_flash,8);
while(1)
{
}
}
voidflash_writebuf(uint8_t*flash_ptr,uint8_t*buffer,uint8_tlen)
{
__disable_interrupt();//禁止中斷
FCTL3=FWKEY;//設(shè)置寫密鑰并解鎖
FCTL1=FWKEY+ERASE;//段擦除
*(unsignedint*)flash_ptr=0;//??
FCTL1=FWKEY+WRT;//字節(jié)寫入
for(uint8_ti=0;i { *flash_ptr++=*buffer++; } FCTL1=FWKEY;//設(shè)置寫密鑰 FCTL3=FWKEY+LOCK;//重新鎖住 __enable_interrupt();//恢復(fù)中斷 } voidflash_readbuf(uint8_t*flash_ptr,uint8_t*buffer,uint8_tlen) { __disable_interrupt(); for(uint8_ti=0;i { *buffer++=*flash_ptr++; } __enable_interrupt(); } voidclock_config(void) { WDTCTL=WDTPW+WDTHOLD;//停止看門狗 select_xt1();//選擇XT1 dco_config();//ACLK=XT1=32.768K //MCLK=SMCLK=8000K } voidselect_xt1(void) { //啟動(dòng)XT1 P7SEL|=0x03;//P7.0P7.1外設(shè)功能 UCSCTL6&=~(XT1OFF);//XT1打開 UCSCTL6|=XCAP_3;//內(nèi)部電容 do { UCSCTL7&=~XT1LFOFFG;//清楚XT1錯(cuò)誤標(biāo)記 }while(UCSCTL7&XT1LFOFFG);//檢測XT1錯(cuò)誤標(biāo)記 } voiddco_config(void) { __bis_SR_register(SCG0);//禁止FLL功能 UCSCTL0=0x0000;//SetlowestpossibleDCOx,MODx UCSCTL1=DCORSEL_5;//DCO最大頻率為16MHz UCSCTL2 = FLLD_1 + 243; // 設(shè)置DCO頻率為8MHz