您好!
我正在使用 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、还必须执行其他操作
谢谢、
阿尔卡纳