用了MSP430F4250对信息区的地址0x1040地址写数据并读取,结果好像写不进去,单步调试或者直接运行,在WATCH中看到这个地址的值一直是0xff,不知道什么原因,哪位高手帮忙看看,谢谢。
晶振是4M。
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
FLL_CTL0 |= XTS_FLL; //设置振荡器为高频,4M
FLL_CTL0 |= XCAP0PF; //设置内部晶体匹配电容为0PF
SCFQCTL = SCFQ_64K; //设置MCLK=SMCLK=2*ACLK;
FCTL2=FWKEY+FSSEL1+FN3+FN1;//FLASH时钟设置,选在MCLK,11分频,大约364K
char value=26;
char value_m=0;
char *data_ptr;
data_ptr=(char *)0x1040;
if(*data_ptr==0xff)
write_SegC(value);
else
value_m = *data_ptr;
}
void write_SegC(char value)
{
char *Flash_ptr; // Flash pointer
Flash_ptr = (char *)0x1040; // Initialize Flash pointer
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + ERASE; // Set Erase bit
*Flash_ptr = 0; // Dummy write to erase Flash seg
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
*Flash_ptr++ = value; // Write value to flash
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
灰小子:
没见过对flash操作还需要Dummy write 的
建议参考官网flash操作例程
ke luo:
回复 灰小子:
这个就从TI官网上下的别的型号的FLASH 写的例程改的,4250的C例程里没有Flash操作的例程。
Hao Mengzhen:
回复 ke luo:
可以参考User Guide里对flash 操作讲解,www.ti.com/…/slau056l.pdf 第六章
; Byte/word write from flash. 514 kHz < SMCLK < 952 kHz
; Assumes 0FF1Eh is already erased
; Assumes ACCVIE = NMIIE = OFIE = 0.
MOV #WDTPW+WDTHOLD,&WDTCTL ; Disable WDT
MOV #FWKEY+FSSEL1+FN0,&FCTL2 ; SMCLK/2
MOV #FWKEY,&FCTL3 ; Clear LOCK
MOV #FWKEY+WRT,&FCTL1 ; Enable write
MOV #0123h,&0FF1Eh ; 0123h −> 0FF1Eh
MOV #FWKEY,&FCTL1 ; Done. Clear WRT
MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK
… ; Re-enable WDT?
灰小子:
回复 ke luo:
这个例程是操作其他flash段的,SegmentA有点特殊,有个保护位
The state of the LOCKA bit is toggled when a 1 is written to it. Writing a 0 to LOCKA has no effect. This allows existing flash programming routines to be used unchanged.
ke luo:
回复 灰小子:
信息区带保护位的只是47x,47×3/4,471xx这些系列的,不针对42×0系列
灰小子:
回复 ke luo:
那就奇怪了。你操作SegmentB试试,还有就是确认下MCLK的频率。