MSP430F5438学习笔记 FLAHS操作
扫描二维码
随时随地手机看文章
1.前言
MSP430F5438的片内FLASH可以当做EEPROM使用,该部分FLASH称为INFO FLASH,总共有4块每块128Byte。虽然INFO FLASH容量比较少,但是多数情况还是够用的。
【2014年1月回顾】存在问题需要立刻改进
2.代码实现//时钟默认情况
//FLL时钟FLL选择XT1
//辅助时钟ACLK选择XT132768Hz
//主系统时钟MCLK选择DCOCLKDIV8000000Hz
//子系统时钟SMCLK选择DCOCLKDIV8000000Hz
//UART时钟选择ACLK
//低频波特率产生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();//初始化时钟
uart_config();//初始化UART
_EINT();
//打印时间和提示信息
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处连续读出8个字节
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;//设置写密钥并解锁
FCTL1=FWKEY+ERASE;//段擦除
*(unsignedint*)flash_ptr=0;//??
FCTL1=FWKEY+WRT;//字节写入
for(uint8_ti=0;i { *flash_ptr++=*buffer++; } FCTL1=FWKEY;//设置写密钥 FCTL3=FWKEY+LOCK;//重新锁住 __enable_interrupt();//恢复中断 } 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) { //启动XT1 P7SEL|=0x03;//P7.0P7.1外设功能 UCSCTL6&=~(XT1OFF);//XT1打开 UCSCTL6|=XCAP_3;//内部电容 do { UCSCTL7&=~XT1LFOFFG;//清楚XT1错误标记 }while(UCSCTL7&XT1LFOFFG);//检测XT1错误标记 } voiddco_config(void) { __bis_SR_register(SCG0);//禁止FLL功能 UCSCTL0=0x0000;//SetlowestpossibleDCOx,MODx UCSCTL1=DCORSEL_5;//DCO最大频率为16MHz UCSCTL2 = FLLD_1 + 243; // 设置DCO频率为8MHz