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.

[参考译文] MSP430G2353:MSP430G2353:

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1403270/msp430g2353-msp430g2353

器件型号:MSP430G2353

工具与软件:

大家好!  

我们已经完成了本文件中提到的所有措施: https://www.ti.com/lit/an/slaa729a/slaa729a.pdf?ts = 1709980960376.

仍然有很多人看到闪存损坏,我们仍然不理解它的根本原因。

低电压:

当检测到负载下电池上的2.2电压时、我们的器件将进入睡眠模式(空闲模式)。  

不可充电电池(CR2430)  

 环境影响:  

我们的器件上都有可靠的 ESD 保护、我不认为它会造成问题。

对 JTAG 标签节点进行了测试、未发现问题。 我们会在制造过程中、在开始的时候使用 JTAG 对器件进行编程。 正常操作后、可在安装6-36次后在设备上更新内存。  

操作温度为+10至+45 C (+50至+113 F)--无温度问题。  

闪存时序生成器频率:

这可能是一个问题、我们需要您的耐心来了解根库。  

最常见的问题是违反频率与电压关系。

在我们的硬件 MCLK 中:4MHz。

 

//用于清除信息存储块。
//在从应用程序代码调用此函数之前禁用中断。
//此处我们没有为闪存操作设置时钟源。
void flash_clear (字符*地址)

   FCTL3 = FWKEY;
   FCTL1 = FWKEY + ERASE;

   while (FCTL3和 BUSY);
   *Addr = 0;
   while (FCTL3和 BUSY);

   FCTL1 = FWKEY;
   FCTL3 = FWKEY + LOCK;
   while (FCTL3和 BUSY);
}

 

//用于在信息存储器中写入数据。
//在更改设备配置时使用此功能。
//在从应用程序代码调用此函数之前禁用中断。
//此处我们没有为闪存操作设置时钟源。
void flash_Write (void *数据、字 Addr、字节 nbytes)

   FCTL3 = FWKEY;
   FCTL1 = FWKEY + WRT;
   while (FCTL3和 BUSY);

   memcpy ((char *) Addr、(char *) data、nbytes);
   while (FCTL3和 BUSY);

   FCTL1 = FWKEY;
   FCTL3 = FWKEY + LOCK;
   while (FCTL3和 BUSY);
}

 

//用于擦除512字节的闪存段
//在 OTA 升级过程中使用了此函数
//将 MCLK 设置为时钟源、将时钟分频器设置为5。  
void flash_flash_addr Erase_Segment (char* addr)

   //禁用所有中断
   _DINT();

   //选择用于闪存写入的 MCLK 以及5分频
   FCTL2 = FWKEY+FSSEL_1+FN2;

   //清除锁定
   FCTL3 = FWKEY;

   //启用段擦除
   FCTL1 = FWKEY + ERASE;

   while (FCTL3和 BUSY);

   //执行擦除
   *addr = 0;
   while (FCTL3和 BUSY);

   //禁用擦除
   FCTL1 = FWKEY;

   //设置锁定
   FCTL3 = FWKEY + LOCK;

   while (FCTL3和 BUSY);

   //启用中断
   _EINT();
}

 

//用于在 Flash 存储器中写入数据。
//在 OTA 升级过程中使用了此函数
//在从应用程序代码调用此函数之前禁用中断。
//此处我们没有为闪存操作设置时钟源。
void flash_Write (void *数据、字 Addr、字节 nbytes)

   FCTL3 = FWKEY;
   FCTL1 = FWKEY + WRT;
   while (FCTL3和 BUSY);

   memcpy ((char *) Addr、(char *) data、nbytes);
   while (FCTL3和 BUSY);

   FCTL1 = FWKEY;
   FCTL3 = FWKEY + LOCK;
   while (FCTL3和 BUSY);
}

该流程中是否有任何内容或下面的代码需要更改?

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

    476KHz/5 = 800kHz、这大于闪存时序发生器的最大值4MHz。

    时钟分频器需要一个更大的值。 10也许。 不会太低、或者您可以达到累积程序时间限制。 尤其是在进行字节写入时。

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

    同意 David 为时钟修改一个更大的分频器。 而且、由于 ADC 错误、最小闪存操作电压为2.2V、因此实际 VCC 电压可能低于2.2V。 因此、我认为应该将电池监测器电压设为2.3或2.4V、以使器件进入睡眠状态。