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.

[参考译文] CCS/MSP430I2040:修改 EMDC 代码以将电能值保存到闪存中

Guru**** 2589275 points
Other Parts Discussed in Thread: MSP430I2041

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/933505/ccs-msp430i2040-modifying-emdc-code-to-save-energy-values-to-flash-memory

器件型号:MSP430I2040
主题中讨论的其他器件:MSPWAREMSP430WAREMSP430I2041

工具/软件:Code Composer Studio

您好!

在使用不同的应用协议编辑 EMDC 代码后发送计量参数。

在原始代码中、kWh (能量吸收)值不会存储在控制器中、因此在电源复位/重启后、它不会以旧的保存值开始、而是从零开始。

但应用要求以增量方式发送该值。 因此需要经常存储在控制器存储器中。 请在这方面向我提供指导。

谢谢、

Anuradha。  

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

    您好!

    您需要定期将电能值保存到闪存中、以便在断电和复位事件期间保留这些值。 请参阅 dev.ti.com 上或 CCS 中 Resource Explorer > MSPWare 中找到的该器件的闪存代码示例。 您可能还需要在闪存中设置一个标志来指示条件(例如功率损耗)。 当电源电压超过一个特定电平时、这个器件的 VMONIN 特性可被用于触发一个中断来将这个标志写入闪存。 加电时、您还需要恢复备用能量值。

    请记住、闪存的写入限制也低于我们的 FRAM 器件、因此您可能需要实施换位写入算法。

    在此过程中、请注意 i20xx 信息存储器包含器件特定的 TLV 数据、用于校准时钟和基准。 如果在未备份的情况下擦除这些数据、则器件将无法正常工作。 根据您需要保存到闪存的数量、您可能需要考虑改用闪存主存储器中的段。 如果您使用信息、并且您已在 RAM 中备份信息、准备在写入信息之前擦除信息、然后进行复位、则器件将被欺骗、TLV 值将丢失。

    我希望这对您有所帮助!

    此致、

    James

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

    您好!

    感谢您的回复。

    请建议我在哪里可以找到闪存代码的示例代码。  

    您建议了两种方法:dev.ti.com 或 CCS 中 Resource Explorer > MSPWare 内的方法。 dev.ti.com 在哪里可以找到? 或 Resource Explorer (在线/离线?) 对于联机,我已经为 MSP430ware 安装了一些文件,但无法解压缩 ZIP 文件夹?

    谢谢、

    Anuradha。

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

    Anuradha 您好、  

    [引述 user="Anuradha Bulakh 的说法] 您建议了两种方法:dev.ti.com 或在 CCS 中的 Resource Explorer > MSPWare 中使用。 dev.ti.com 在哪里可以找到? 或 Resource Explorer (在线/离线?) ,对于联机,我已经为 MSP430ware 安装了一些文件,但无法提取 ZIP 文件夹?

    dev.ti.com 上的 Resource Explorer 有助于在论坛上指出代码示例、因为它允许您直接链接到特定的代码示例。 如果您使用的是 CCS、则在线 Resource Explorer 应与 dev.ti.com 上的内容匹配。 您可以始终使用离线版本、但这可能需要您安装 MSP430Ware。

    [引述 user="Anuradha Bulakh 的信息]请向我推荐在哪里可以找到闪存代码的示例代码。  [/报价]

    您可以在 CCS > Resource Explorer > MSP430Ware > Devices > MSP430I2XX > MSP430I2041 > Peripheral Examples > Register Level > msp430i20xx_flashwrite_01.c 中找到闪存代码示例 DriverLib 替代方案是 CCS > Resource Explorer > MSP430Ware > Devices > MSP430I2XX > MSP430I2041 > Peripheral Examples > Driver Library > Example Projects > FLASHCTL > flashctl_ex1_infoSegmentWrite。

    现在、EMDC 应用程序代码在执行校准时的确写入闪存存储器(例如、更新信息存储器中的校准因子)。  EM_updateFlashCalibrationValues ()函数在'hmi.c'文件中调用,可在'EM_userConfig.c'文件中找到。 它可以正确禁用全局中断和其他操作、因此我强烈建议使用或引用它。

    void EM_updateFlashCalibrationValues (uint8_t *工作校准、
    uint8_t * pFlashCalibration)
    {
    bool bStatus;
    uint16_t ui16tempChecksum = 0;
    uint8_t ui8Idx;
    uint16_t ui16GIE;
    
    //屏蔽全局中断以确保安全
    ui16GIE =_ get_SR_register ()& GIE;
    _BIC_SR_register (GIE);
    
    //解锁信息内存
    FlashCtl_unlockInfo();
    
    //将 TLV 值复制到 RAM
    memcpy (g_infoATLV、
    (uint8_t *) system_nonV_info_TLV_ADDR、
    System_NONV_INFOA TLV_SIZE);
    
    //擦除段
    执行{
    FlashCtl_eraseSegment ((uint8_t*) pFlashCalibration);
    bStatus = FlashCtl_performEraseCheck (
    pFlashCalibration、
    System_NONV_SEGM_SIZE
    );
    } while (bStatus = STATUS_FAIL);
    
    //写入校准值
    FlashCtl_write8 (
    pWorkingCalibration、
    pFlashCalibration、
    EM_PHASE_LENGTH*大小(EM_PHASE_Calibration)
    );
    
    //计算校验和
    for (ui8Idx=0;ui8Idx 
    

    此致、

    James

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

    您好 James、

    感谢您的回复。  

    在写入闪存时,我们如何设置闪存的地址?

    还建议使用函数(或示例代码)从闪存中读取存储的数据。

    谢谢、此致、

    Anuradha Bulakh。

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

    您好!

    [引用 user="Anuradha Bulakh 格式"]在写入闪存时,我们如何设置闪存的地址?

    您可以参阅 DriverLib API 指南中的 FlashCtl_WRITE API。 此外、我最近一篇文章中正上方的代码介绍了如何使用指针设置地址。

    [引用 USER="Anuradha Bulakh ]还建议使用函数(或示例代码)从闪存中读取存储的数据。[/引用]

    我建议从 EMDC 生成的文件中签出'System_pre_init.c' i20xx 引导代码。 有一个 if ()语句用于检查闪存中的值。 如果设置了电源故障标志、您可以使用类似的方法将电能值从闪存加载到 RAM 中。

    /*检查 JTAG 密码位置并在密码不匹配时禁用 JTAG。
    *否则 JTAG 将在复位后的第64个周期中启用。
    //
    if ((* jtagPwd!= 0x00000000)&&(* jtagPwd!= 0xFFFFFFFF)
    {
    *禁用 JTAG */
    SYSJTAGDIS = JTAGDISKEY;
    } 

    此致、

    James