主题中讨论的其他部件: MSP430FR5959
工具/软件:Code Composer Studio
我认为如果覆盖代码会使处理器过了,那就更好了。 于是我开始看MPU。 关于它应该如何工作,有各种信息。 但是我有点困惑它是如何自动工作的。 这意味着只要您在项目的CCS常规属性中勾选了"启用MPU",它就应该"正常工作"而不做任何事情。 但是我不太相信...
这是MSP430FR5969的默认链接器文件的MPU位的外观:
#ifdef _MPU_enable #define MPUPW (0xA500)/* MPU Access Password */ #define MPUENA (0x0001)/* MPU Enable */ #define MPULOCK */ #define MPUSEGIE (0x0010)/* MPU Enable NMI on segment violation */ _MPU_enable; //段定义 #ifdef _mpu_manual //用于在GUI中选择的自定义尺寸 MPU_SEGMENT_Border1 =_MPU_SEGB1 >> 4; MPU_SEGMENT_Border2 =_MPU_SEGB2 >> 4; MPU_SAM_VALUE =(_MPU_SAM0 <<12)|(_MPU_SAM3 <<8)|(_MPU_SAM2 <<4)|_MPU_SAM1; #else // Linker生成的自动尺寸 #ifdef _ipe_enable //如果项目中也使用IPE //seg1 =任何读+写持久性变量 //seg2 = ipe =读+写+执行访问 //seg3 =代码,只读+执行 MPU_SEGMENT_Border1 = fram_IPE_START >> 4; MPU_SEGMENT_Border2 = fram_rx_start >> 4; MPU_SAM_VALUE = 0x1573;// Info R,Seg3 RX,Seg2 rwx,Seg1 RW #否则 MPU_SEGMENT_Border1 = fram_rx_start >> 4; MPU_SEGMENT_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 #else #ifdef _mpu_enable_NMI MPU_ctl0_value = MPUPW | MPUENA | MPUSEGIE; #否则 MPU_ctl0_value = MPUPW | MPUENA; #endif #endif #endif
首先,从链接程序文件中可以看出,如果不在某处定义_MPU_ENable_NMI,MPU基本上不执行任何操作。 是否有一个GUI tickbox用于此操作? 在我看来,只有一个被保护的内存区域,称为fram_rx_start。 那么实际上,在FRAM和FRAM2之间拆分代码不是按预期工作的吗? 默认链接程序文件在FRAM2和FRAM之间分割代码。 "FRAM_Rx_start"似乎是在IPENCAPSULATED_MEMORY的末尾自动设置的。 由于我没有激活IPE,是否会将fram_rx_start分配给FRAM2的开头?
如果IDE实际上像它所暗示的那样聪明,那么将_MPU_ENable_NMI放入“预定义符号”并向NMI ISR添加一行就足够了,如MPU driverlib示例中所示?
或者,我可以在 链接程序文件中执行整个日志并定义自己的内存区域,以此类推。 这就是我在开始思考MPU如何准确设置之前所做的事情。 内存上的标志实际上有什么功能吗? 我修改了链接程序文件,为代码/常量/ISR分配4+16kB,如下所示:
内存 { SFR :原点= 0x0000,长度= 0x0010 外围设备_8位 :原点= 0x0010,长度= 0x00F0 外围设备_16BIT :原点= 0x0100,长度= 0x0100 RAM :原点= 0x1C00,长度= 0x0800 信息A. :原点= 0x1980,长度= 0x0080 信息 :原点= 0x1900,长度= 0x0080 信息 :原点= 0x1880,长度= 0x0080 信息 :原点= 0x1800,长度= 0x0080 FRAM :原点= 0x4400,长度= 0xAF80 FRAMRO (RXI) :原点= 0xF380,长度= 0x0C00 FRAMRO2 (RXi) :原点= 0x1万,长度= 0x4000
这将再次暗示设置(RXi)将自动使该区域"脱离",但是... 在标志的主题上,初始化标志我不确定。 何时初始化? 启动后? 在闪烁期间,#pragma持久性内容是否初始化一次?