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.

[参考译文] MSP430F1611:覆盖闪存而不擦除

Guru**** 2024750 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/568030/msp430f1611-overwriting-flash-without-erase

器件型号:MSP430F1611

大家好、

我修改了 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 将在下载代码之前执行批量(主闪存)擦除。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经将 IAR 设置为将未使用的存储器填充为0xFF。 初始值为0xFF。 在 for 循环中、第一个赋值是可以的(因为没有擦除的1到0是可以的)。

    但是,当我将*Flash_ptr 从0更改为1时,如果没有擦除,它是否应该不会失败?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正如我在您的代码中看到的、在第一次迭代(I=0)到0BE00h 将被写入字00000h、并且它将保持这样的状态、直到结束、因为只有在擦除之后才能将00000h 更改为0FFFFh。 它不会失败、只是0BE00h 处的值错误。 我想此函数是从闪存执行的、而不是从 RAM 执行的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯、当我说它正常工作时、我意味着它不会保持在0x0000 (正如预期的那样)。 相反、即使没有擦除、它也会更改为0x007F (在循环末尾)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我猜这是因为编译器会将完整循环优化为* Flash_ptr = 127
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我对此表示怀疑、因为我已将编译器优化级别设置为"无"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    使用*Flash_ptr = value 进行交换循环,并从具有不同值的不同位置调用写入函数几次,所有内容都将被清除。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您的意思是这样的、它仍然有效

    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后停止)。 感谢您的支持。