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.

[参考译文] MSP430FR5994:使用调试器测试'#pragma PERSISTENT 和#39;在整个电源周期内写入 FRAM。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1104880/msp430fr5994-testing-use-of-pragma-persistent-writing-to-fram-across-power-cycles-with-the-debugger

器件型号:MSP430FR5994

一个小程序被用来测试一组三个 PID 参数的 FRAM 保持、此参数被保持在浮点格式。

请注意、PID 参数可通过上传命令通过串行链路发送。

默认情况下、这些存储在 RAM 中、因此在下电上电后丢失。  因此、需要迁移到 FRAM 存储器:

#include
#include
#include


typedef float 32_t;

#define P_GAIN_LOCAL 0.8
#define I_GAIN_LOCAL 2.0
#define D_GAIN_LOCAL 0.6

//写入的 float32_t 值的数量。
#define WRITE_SIZE 3.

//为第一个 PID 集指定...
pragma PERSISTENT (FRAM_ARRATION_1)
float32_t FRAM_array_1[write_size]={0};

//定义
结构

  float32_t p_gain_value;
  float32_t I_gain_value;
  float32_t d_gain_value;

}pid_gain ={P_GAIN_LOCAL、I_GAIN_LOCAL、D_GAIN_LOCAL};


float32_t sum_of_Gains = 0.0;


/**
* main.c
*
*使用#pragma PERSISTENT (FRAM_ARRAM_1)指令的测试、
*应用(现在适用)一组 pid_gain 参数。
*希望能够承受功率循环。
*
*
int main (空)

  WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

  //从 FRAM 块读取 PID 增益值以加载任何值
  //以前的 FRAM 存储值。
  PID_GAIN.p_GAIN_VALUE = FRAM_ARRAM_1[0];
  PID_GAIN.I_GAIN_VALUE = FRAM_ARRAM_1[1];
  PID_GAIN.d_GAIN_VALUE = FRAM_ARRAM_1[2];


  //从 FRAM 获得的 PID 值...
  总和_增益= pid_gain.p_gain_value + pid_gain.i_gain_value + pid_gain.d_gain_value;

  //已加载 GAIN_VALUE 项
  PID_GAIN.p_GAIN_VALUE = P_GAIN_LOCAL;
  PID_GAIN.I_GAIN_VALUE = I_GAIN_LOCAL;
  PID_GAIN.d_GAIN_VALUE = D_GAIN_LOCAL;

  //已写入更新的 PID 值...
  总和_增益= pid_gain.p_gain_value + pid_gain.i_gain_value + pid_gain.d_gain_value;

  //使用 float32_t GAIN_VALUE 项写入 FRAM。
  FRAM_array_1[0]= pid_gain.p_gain_value;
  FRAM_array_1[1]= pid_gain.i_gain_value;
  FRAM_array_1[2]= pid_gain.d_gain_value;

  返回0;

  写入的 FRAM 位置(通过 CCS 9.1调试器中的'Expressions'显示)在0x4000、0x4004和0x4008处报告。  这是 FR5994器件上 FRAM 的基础。

在单步调试器时、测试 PID 值似乎写入正常。

在对 Launchpad 开发套件进行下电上电并再次运行调试器后、上述存储器位置会被清除。

由于调试器不知道 FRAM 用于变量存储、因此当它加载程序进行调试时、假设 FRAM 存储可能已经工作、但已通过下一次调用调试器擦除。  在所需的下电上电后执行此操作、以测试 FRAM 保持。

我确信 FRAM 能够正常工作、因为会保留"闪存"代码、并且工作正常!

是否有办法使用调试器轻松测试 FRAM 数据保持?

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

    请尝试进入 Project Properties -> Debug -> MSP430 Flash Settings

    窗口右侧列出了调试期间加载程序时可用的擦除选项。 但是、还请注意、由于您使用的是 PERSISTENT、因此每次将程序加载到芯片中时阵列都会初始化为0。 您可能需要用 NOINIT 替代 PERSISTENT、并修改擦除选项以避免清除 PID 值。

    7.9.25 NOINIT 和 PERSISTENT pragma

    Project Properties Debug menu

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

    尊敬的 Andrew:

    您是否在每次启动调试会话时刷写代码? 如 Seth 所述、加载代码会将 persistent 变量设置回0。

    您能否尝试:

    1. 加载代码
    2. 断开调试器
    3. 对器件进行下电上电
    4. 重新连接调试器
    5. 检查 persistent 变量。 它应该是您上次对它写的内容。

    Evan

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

    我使用的是 USB 电源输入、因此换行 for (;;)循环(以便我可以重新运行代码)会产生 JTAG 通信错误。  唯一的选项是停止先前的调试会话。  我会尝试 Seth 的想法...

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

    不确定是否按预期完成-针对 NOINIT 持续更改。

    之前在 FRAM 中自动选择要写入的地址(0x4000、0x4004和0x4008)被更改为0x1C00、0x1C04和0x1C08。  它们不是 FRAM 的基础、而是 RAM 的基础!

    排除在被清零的内存之外、只是之前在 FRAM 基址使用的0x0C 位置不被清零(即 0x400C 至0x43FFF)。

    毫无疑问、如果仔细编码、这将在应用中起作用。  但最好先证明。

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

    您必须修改链接器文件。 出于某种原因、我看到的默认链接器文件未定义 NOINIT 段。

    READ_WRITE_MEMORY 组顶部附近的 lnk_msp430fr5994.cmd 文件中、找到包含以下内容的行:

    .TI.persistent:{}        对于#pragma PERSISTENT       *

    在下面添加一行、除了将"persistent"替换为"noinit"外、看起来几乎相同

    .TI.noinit   :{}/* for #pragma noinit */

    这会将 NOINIT 置于 FRAM 中、但也会将其从 C 环境初始化中排除。 如果从之前未编程的空白器件开始、NOINIT 存储器段字节将全部为高电平(0xFF)、直到您设置初始值。 在 float32_t 数据类型中、该数据值将等同于 NaN、因此如果这会导致系统出现问题、您可能需要在代码中进行一些检查。

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

    如图所示、编辑了 lnk_msp430fr5994.cmd。  重建后不是一个快乐的露营者(使用非 AME)。  调试器不会进入以允许第一个"进入";只有停止似乎起作用。  可能是链接器文件中未包含'noname'的原因!

    恢复为#pragma PERSISTENT、只是检查调试的代码(确实如此)。  感谢您迄今提供的帮助。

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

    当您说非 AME 时、您指的是 NOINIT、对吧? 如果是、您是否修改了行

    float32_t FRAM_array_1[write_size]={0};

    并删除分配给{0}? NOINIT 的分配不能在那里。 这不是编译器错误、只是警告、确切地说是#1518-D。

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

    长周(4天* 10小时)是 NOINIT。  删除'={0}'、清除 FRAM 中的排除、有效!  在下一个调试会话期间、PID 值在整个电源周期从 FRAM 读回正常。

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

    感觉不错、对吧? FRAM 绝对是一项伟大的技术、简单地写入一个正常的变量感到非常奇怪、它通过复位等方式持续存在

    很高兴它能为您提供帮助。

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

    是的、它比闪存容易得多(并且寿命更长)。  与旧的核心商店(它们确实是微型铁氧体磁珠)一样、破坏性读取是责任、需要立即重写。  16MHz FR5994 MCU 以8MHz 的频率有效运行。

    已尝试使用 Q16.16格式的 MPY32单元。  以替换 PID 循环的当前浮点数学运算。  真的很快!