This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、
我修改了 MSP430闪存示例以覆盖 MSP430闪存而不擦除。 如果我理解正确写入闪存、那么这应该会失败(因为您不能在不擦除的情况下将0转换为1)。
但奇怪的是、这似乎起作用了。 我想了解这样做是否会损坏闪存。 这是示例中的修改代码。
void write_Sega (char value) { char * Flash_ptr; //闪存指针 unsigned int i; Flash_ptr =(char *) 0xBE00; //初始化闪存指针 FCTL3 = FWKEY; //清除锁定位 FCTL1 = FWKEY + WRT; //将 WRT 位设置为 (i=0;i<128;i++) { * Flash_ptr = i; //覆盖工作 } FCTL1 = FWKEY; //清除 WRT 位 FCTL3 = FWKEY + LOCK; //设置锁定位 }
[引用 user="shadowfax47">我修改了 MSP430闪存示例、以覆盖 MSP430闪存而不擦除。 如果我理解写入闪存的操作正确、那么这应该会失败(因为您不能在不擦除的情况下将0转换为1)。
它不会失败。 对于每个写入(不擦除)、位"1"将更改为"0"、就是这样。 擦除将把"0"复位回"1"。 默认情况下、出厂芯片为空白、已擦除。
此外、CCS / IAR 将在下载代码之前执行批量(主闪存)擦除。
正如我在您的代码中看到的、在第一次迭代(I=0)到0BE00h 将被写入字00000h、并且它将保持这样的状态、直到结束、因为只有在擦除之后才能将00000h 更改为0FFFFh。 它不会失败、只是0BE00h 处的值错误。 我想此函数是从闪存执行的、而不是从 RAM 执行的。
嗯、当我说它正常工作时、我意味着它不会保持在0x0000 (正如预期的那样)。 相反、即使没有擦除、它也会更改为0x007F (在循环末尾)。
如果您的意思是这样的、它仍然有效
void write_Sega (char value); int main (void) { WDTCTL = WDTPW + WDTHOLD; BCSCTL2 |= DIVM_0; DCOCTL = DCO2 | DCO0 | Mod4 | MOD2; BCSCTL1 = RSEL2 | RSEL0; BCSCTL2 &=~ DCSCTL2 + DCLS_0;BCSCTDIVS_0;BCSCL0 FCTL2 = FWKEY + FSSEL0 + FN3 + FN2; WRITE_SEGA (1); WRITE_SEGA (2); WRITE_SEGA ( CHAR 值) { char * Flash_PTR; volatile unsigned int I; Flash_PTR =(CHAR *) 0xBE00; FCTL3 = FWTL3 = FWKEY + FWCTKEY;FWKEY = FWKEY + FWCTL1 = FWKEY
好的,我发现了这个问题:)我在模拟器上调试它,出于某种原因它总是有效的。 但是、当我在实际硬件上测试它时、它会失败(在更改为0后停止)。 感谢您的支持。