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:使用 MSP430-elf-gcc 启用 IPE

Guru**** 2338080 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/733546/msp430fr5994-enabling-ipe-using-msp430-elf-gcc

器件型号:MSP430FR5994

您好!

我正在使用 MSP430-elf-gcc 为 MSP430FR5994创建我的项目。 我想使用设备中的 IP 封装功能。 但是、所有文档、例如 SLAA685:MSP 代码保护功能和 SLAU367O:器件用户指南、都提供了使用 CCS 工具设置 IPE 的指南。 我也想使用 MSP430-elf-gcc 来执行同样的操作。 只对 C 代码中的专用寄存器进行编程是不够的、因为在引导过程中必须设置/启用 IPE。 相反、它需要在引导代码中进行设置(如 SLAU367的第9.6.1节中所述)

我有以下关于如何使用 MSP430-elf-gcc 设置以下设置的问题。

在 CCS 中、链接器命令文件(.cmd)包含一个专用的代码段、此代码段定义内存保护单元(MPU)的设置。 此处定义的变量如何映射到器件上的 MPUIP 寄存器?

/ /
/* MPU/IPE 特定内存段定义                              */
/ /

#ifdef _IPE_ENABLE
   #define IPE_MPUIPLOCK 0x0080
   #define IPE_MPUIPENA 0x0040
   #define IPE_MPUIPPUC 0x0020

   //评估 IP 封装控制设置的设置
   #if defined (_IPE_ASSERTPUC1)
       #if defined (_IPE_LOCK)&&(_IPE_ASSERTPUC1 == 0x08)
           FRAM_IPE_ENABLE_VALUE =(IPE_MPUIPENA | IPE_MPUIPPUC |IPE_MPUIPLOCK);
       #elif defined (_IPE_LOCK)
           FRAM_IPE_ENABLE_VALUE =(IPE_MPUIPENA | IPE_MPUIPLOCK);
       #Elif (_IPE_ASSERTPUC1 = 0x08)
           FRAM_IPE_ENABLE_VALUE =(IPE_MPUIPENA | IPE_MPUIPPUC);
       其他
           FRAM_IPE_ENABLE_VALUE =(IPE_MPUIPENA);
       #endif
   其他
       #if defined (_IPE_LOCK)
           FRAM_IPE_ENABLE_VALUE =(IPE_MPUIPENA | IPE_MPUIPLOCK);
       其他
           FRAM_IPE_ENABLE_VALUE =(IPE_MPUIPENA);
       #endif
   #endif

   //段定义
   #ifdef _ipe_manual                 //用于在 GUI 中选择的自定义大小
       FRAM_IPE_Border1 =(_IPE_SEGB1>>4);
       FRAM_IPE_Border2 =(_IPE_SEGB2>>4);
   #else                          //链接器生成的自动大小
       FRAM_IPE_Border2 = fRAM_IPE_END >> 4;
       FRAM_IPE_Border1 = fRAM_IPE_START >> 4;
   #endif

   FRAM_IPE_SETTINGS_STRUCT_ADDRESS = IPE_设置 结构>> 4;
   FRAM_IPE_CHECKSUM =~((fRAM_IPE_ENABLE_VALUE & fRAM_IPE_Border2 & fRAM_IPE_Border1)|(fRAM_IPE_ENABLE_VALUE &~fRAM_IPE_Border2 &~fRAM_IPE_ENABBorder1)|(~frAM_IPE_ENABLE_ENABLE_IPE_1和~FRAM_IPE_IPE_IPE_IPAM_Border1)|(~~FRAM_IPE_IPE_IPE_IPE_IPE_IPAM_IPE_IPE_IPAM_FRAM_IPE_IPE_IPE_IPE_1和 IPAM_IPAM_IPAM_Border1)
#endif

#ifdef _MPU_enable
   #define MPUPW (0xA500)   /* MPU 访问密码*/
   #define MPUENA (0x0001)  /* MPU 使能*
   #define MPULOCK (0x0002) /* MPU 锁定*/
   #define MPUSEGIE (0x0010)/* MPU 在段违反时启用 NMI */

   _MPU_ENABLE = 1;
   //段定义
   #ifdef _MPU_manual //用于在 GUI 中选择的自定义大小
       MPU_SEARD_Border1 =_MPU_SEGB1 >> 4;
       MPU_SEARD_Border2 =_MPU_SEGB2 >> 4;
       MPU_SAM_VALUE =(_MPU_SAM0 << 12)|(_MPU_SAM3 << 8)|(_MPU_SAM2 << 4)|_MPU_SAM1;
   #else //链接器生成的自动大小
       #ifdef _ipe_enable //如果项目中也使用 IPE
       //seg1 =任何读取+写入持久性变量
       //seg2 = IPE =读取+写入+执行访问
       //seg3 =代码、只读+只执行
            MPU_SEGM_Border1 = fRAM_IPE_START >> 4;
            MPU_SEGM_Border2 = fRAM_Rx_START >> 4;
            MPU_SAM_VALUE = 0x1573;// Info R、Seg3 RX、Seg2 rwx、Seg1 RW
       其他
            MPU_SEGM_Border1 = fRAM_Rx_START >> 4;
            MPU_SEGM_Border2 = fRAM_Rx_START >> 4;
            MPU_SAM_VALUE = 0x1513;// Info R、Seg3 RX、Seg2 R、Seg1 RW
       #endif
   #endif
   #ifdef _MPU_LOCK
       #ifdef _MPU_ENABLE_NMI
           MPU_ctl0_value = MPUPW | MPUENA | MPULOCK | MPUSEGIE;
       其他
           MPU_ctl0_value = MPUPW | MPUENA | MPULOCK;
       #endif
   其他
       #ifdef _MPU_ENABLE_NMI
           MPU_ctl0_value = MPUPW | MPUENA | MPUSEGIE;
       其他
           MPU_ctl0_value = MPUPW | MPUENA;
       #endif
   #endif
#endif

2. IPE 是否可以从 MSP430-elf-gcc 中工作?

3.如果对上一个问题是肯定的、则链接器命令文件中的上述代码定义了 MPU 段的寄存器控制和受保护的存储器分段。 如何在 MSP430-elf-gcc 中使用的链接器说明文件中设置相同的设置?

4.更改链接器说明文件以使 IPE 正常工作是否足够? 要从 MSP430-elf-gcc 启用 IPE、还必须执行其他操作

谢谢、
阿尔卡纳

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

    您好 Archie、

    好的、事实证明、GCC 不支持 CCS 中的此功能。

    根据 MSP430 GCC 用户指南第3.7节:

    3.7 CCS 与 MSP430 GCC 的比较

    MSP430 GCC 不支持某些 CCS 功能。 这些特性包括:

    •Optimizer Assistant

    •ULP 顾问

    •内存保护单元和知识产权封装 GUI 配置

    •内存分配

    要获得这些特性的访问权限、必须使用 TI 编译器。

    现在、关于您的问题:

    在 CCS 中、链接器命令文件(.cmd)包含一个专用代码段、此代码段定义了内存保护单元(MPU)的设置。 此处定义的变量如何映射到器件上的 MPUIP 寄存器?

     这些变量是使用 CSS GUI 设置的:有关更多详细信息、请参阅 SLAU157第5节。

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

    尊敬的 Dennis:

    谢谢你。 《MSP430 GCC 用户指南》说明了 GCC 中不提供内存保护单元和知识产权外部 GUI 配置。 它未明确指出 GCC 不支持器件支持的 MPU 和 IPE 功能。 我已经启用了来自 GCC 的 MPU、但无法对来自 GCC 的 IPE 执行相同的操作。 我想知道是否有办法从 GCC 启用 IPE。

    此外、SLAU157没有第5章。 您是指第4章:内存保护单元和知识产权封装吗? 第4章没有说明 GUI 背后会发生什么。

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

    您好、Archie、

    我们的工具团队未就此提供任何进一步的建议、因此我想我会检查您的状态。  根据我的判断、没有关于如何配置 GCC 以启用 MPU 和 IPE 功能的显式指令。   但是、我认为您应该能够直接访问启动代码中的寄存 器、以启用这些功能。  《MSP430FR58xx59xx 用户指南》对这些寄存器进行了介绍。

    此外、对于之前对第5章的引用、它位于此处的 Code Composer Studio IDE v8.x 中。