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.

[参考译文] MSP430FR6989:MPU 问题

Guru**** 2589265 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/624190/msp430fr6989-mpu-problem

器件型号:MSP430FR6989

您好!

此时、我将面临 MPU 问题。 我的 Init 例程如下所示:



extern uint16_t LCF_crcMem_begin;
#define beginement2 &LCF_crcMem_begin

extern uint16_t LCF_code_forbide_begin;
#define beginement3 &LCF_code_forbided_begin

Int16_t _system_pre_init (void)
{
/*在此处插入低级初始化*/
/*禁用看门狗计时器以防止在*/期间复位
/*长变量初始化序列。 *
WDTCTL = WDTPW | WDTHOLD;
#ifdef halInterface_assembledVersion_radio
//配置 MPU
MPUCTL0 = MPUPW;//写入 PWD 以访问 MPU 寄存器
MPUSEGB1 =(uint16_t)(((uint32_t)初学者段2)>> 4);
MPUSEGB2 =(uint16_t)(((uint32_t) BeginSegment3)>> 4);//边界被分配给段
//段1只允许读取和写入
//段2只允许读取和执行
//段3只允许读取和执行
MPUSAM = MPUSEG1WE | MPUSEG1RE | MPUSEG1XE |
MPUSEG2WE | MPUSEG2RE | MPUSEG2XE |
MPUSEG3WE | MPUSEG3RE | MPUSEG3XE;
MPUCTL0 = MPUPW | MPUENA | MPUSEGIE;//启用 MPU 保护
// MPU 寄存器被锁定、直到 BOR
#endif
/*================================================ *
/*选择是否进行段初始化*/
/*是否应完成。 *
/*返回:0以省略初始化*/
/* 1运行初始化*/
/*================================================ */
返回1;

}

lcf_crcMem_begin            ->为0x6800

lcf_code_forbide_begin     ->为0x68C0

对于第一个测试、我允许所有部分都使用。 但我始终会得到复位。

我在 MPUSEG1中看到地址被正确写入(0x0680)、但在 MPUSEG2中、地址也被写入0x0680、尽管应该是0x068C。 数据表中有一个提示、即只应采用6-13位。 因此、对于该示例、这是可以的。 问题出在哪里?

此致

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

    MPU 只会降至0x400增量的粒度、这就是为什么 MPUSEGB2 0x068C (对于地址0x68C0)被转换为0x0680 (地址0x6800)的原因。

    您是否知道 CCS 中内置的 MPU 工具? 无需像您一样手动实施 MPU 保护、只需使用它就简单得多了。 您的用例是什么? 您是否只是想在 FRAM 中具有读写访问权限的一些变量/数组、而其他所有变量/数组都受到保护? 如果是这种情况、我建议在 CCS 中使用 #pragma PERSISTENT (x)、其中 x 是您的数组或变量。 然后、在 CCS 中的 Project > Properties > General > MPU 选项卡下、选择默认设置以启用 MPU、但让编译器处理分段。 在 C 代码中、从_system_pre_init 中删除所有 MPU init、因为该工具将初始化 MPU、 对于使用 FRAM 变量或数组、您可以像访问 RAM 中的普通变量或数组一样简单地访问该变量或数组-您甚至不需要知道它位于哪个地址。 例如、fram 变量[4]= A++;就像它是 RAM 中的一个数组一样。

    如需了解更多相关信息、请访问 :e2e.ti.com/.../1707393

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

    您好 Katie、

    感谢0x400的提示、我认为它只是受可用位6-12的限制。 但是、即使设置错误(段1和段2具有相同的地址)、代码也不应该运行、因为我向所有三个段授予了所有权限?

    我们确实在链接器命令文件中放置了大量 FRAM 段。 因此、我的第一个目的是了解发生了什么、并自行处理。 我们正面临 FRAM 段损坏、第一步是保护某些区域、以查看这是我们的代码问题还是器件的物理问题、以及一些奇怪的环境影响。

    此致

    Christian

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

    尊敬的 Christian:

    是的、设置了所有访问权限后、由于 MPU 违规、我不会期望复位。 您能告诉我们在代码执行的哪个点 发生了复位-我们能确定它是一个触发复位的 MPU 段访问冲突、还是它是 MPU 密码、甚至是完全不同的原因?  如果您可以在复位发生后立即检查 SYSRSTIV 寄存器、您将能够判断触发复位的是什么、因此您将能够判断是由 MPU 引起复位还是其他问题。 对于3个 MPU 段中的每一个、MPUPW 违反与 MPU 段违反都有单独的值。  您能否 将 SYSRSTIV 读取到 main 顶部的变量中、然后再报告回? 器件数据表 www.ti.com/lit/gpn/msp430fr6989 中的表6-10系统模块中断向量寄存器中列出了 SYSRSTIV 值。

    此致、

    Katie

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

    您好 Katie、

    重置来自我们的例程、因为存在分配错误。 所有小时的低级驱动程序都会分配并释放它们的使用。 在这种情况下、问题是变量:

    #define COMPE_DEFAULTSTRUCT_ADDRESS                (0xFFFF)

    静态比较器 E_allocStruct_t *分配比较器 ToStruct=(比较器 E_allocStruct_t*) compe_DEFAULTSTRUCT_address;

    未正确初始化(比较器驱动程序显示已分配)。 在该变量中、值应为系统启动时的0xFFFF。 但激活 MPU 后、没有该值。 当 MPU 将被禁用时、一切都正常。  

    此致

    Christian  

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

    你好,tunguskar,

    是否正在尝试将结构设置为位于地址0xFFFF 处? 无法使用该地址、因为该地址包含器件的复位矢量(位于0xFFFE-FFFF)。 地址0xFF80-FFFF 应保留在链接器文件中、用于器件的 JTAG/IPE 密码和中断矢量表、不得用于其他任何用途。

    将所有应进入 FRAM 的变量信息放入一个段更有意义-您可以在链接器 cmd 文件中指定段、然后在您的 c 代码中使用#pragma DATA_SECTION (x、".my_sect")之类的内容将这些内容放入这些段中。 www.ti.com/lit/pdf/slau132中提供了更多信息

    您提到您的驱动程序会分配并释放它们的使用。 但是、您仍需要确保将要放入 FRAM 的任何内容放置在正确的链接器命令段中、然后对这些段进行分组、以便您可以配置 MPU 以了解哪些地址应可读写或受保护。

    此致、

    Katie

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

    0xFFFF 是基地址、不应使用。 问题是、当 MPU 处于活动状态时、默认目标地址(0xFFFF)损坏、或者调试器显示的值不正确)。  

    遗憾的是、我们无法/不允许将所有变量设置为一个区域。 我认为 FRAM 顺序正确分组。

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

    你好,tunguskar,

    您能否提供有关变量/读取+写入访问所需的 FRAM 面积的详细信息? 然后、我可以帮助您提供一些有关如何在您的器件中设置此设置的指导。

    此致、

    Katie