请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR6989 # pragma 位置(UDATA、0x1820)
UDATA 被重写到指定的地址。
不仅可以重写信息区域、还可以重写 FRAM 区域
但是、如果在程序执行期间重写 UDATA、则重写 RAM 区域、不重写 FRAM 区域。 我认为可以重写 FRAM、因为 FRAM 区域已启用写入、但无法完成。
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.
# pragma 位置(UDATA、0x1820)
UDATA 被重写到指定的地址。
不仅可以重写信息区域、还可以重写 FRAM 区域
但是、如果在程序执行期间重写 UDATA、则重写 RAM 区域、不重写 FRAM 区域。 我认为可以重写 FRAM、因为 FRAM 区域已启用写入、但无法完成。
您好!
您可以尝试以下示例代码。 如果置位 MPUSEG2WE、那么不会发生违反、如果不是的话、将会有写入违反引起 NMI 中断。
/*-版权所有-、BSD_EX *版权所有(c) 2014、德州仪器(TI)公司 *保留所有权利。 * * 只要 符合以下条件*、允许以源代码和二进制形式重新分发和使用: * *源代码的重新分发必须保留上述版权 声明*、此条件列表和以下免责声明。 * ***二进制形式的再发行必须在 *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。 * ***未经 事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。 * *本软件由版权所有者和贡献者"按原样"提供 *、 不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或 *贡献者都不对任何直接、间接、偶然、特殊、 *模范、 或相应的损害(包括但不限于 *采购替代产品或服务;丧失使用、数据或利润; *或业务中断)、但出于任何责任理论 、*无论是在合同中、严格责任还是由于 使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他) 、*即使已获悉可能会发生此类损坏。 * *** * * MSP430代码示例免责声明 * * MSP430代码示例是自包含的低级程序 ,通常*以 高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认 值*寄存器值和时钟配置等设置、 并且在组合多个示例中的代码时必须*小心以避免潜在的副作用 *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware *了解外设配置的 API 函数库方法。 * *--/版权--* //********* // MSP430FR69xx 演示- MPU 写保护违例-中断通知 // 说明:MPU 段边界由定义: //边界1 = 0x6000 [MPUSEGB1 = 0x0600] //边界2 = 0x8000 [MPUSEGB2 = 0x0800] //段1 = 0x4400 - 0x5FFF //段2 = 0x6000 - 0x7FFF //段3 = 0x8000 - 0x23FFF //段2受写保护。 任何到段2范围内地址的写入 //都会引起一个 NMI 中断。 访问 SYS NMI ISR 后、LED 会切换。 // // ACLK = n/a、MCLK = SMCLK =默认 DCO // //// MSP430FR6989 // -------- // /|\| | // || | // -|RST | // | | // | P1.0|->LED // William Goh // Texas Instruments Inc. // 2014年4月 //使用 IAR 嵌入式工作平台 V5.60和 Code Composer Studio V6.0构建 //********* #include unsigned char SYSNMIFLAG = 0; unsigned int * ptr = 0; unsigned int Data = 0; #pragma 位置(UDATA、0x6004) unsigned int UDATA = 0; int main (void) { WDTCTL = WDTPW | WDTHOLD; //停止 WDT //配置 GPIO P1DIR |= BIT0; //为 LED 配置 P1.0 //禁用 GPIO 上电默认高阻抗模式以激活 //先前配置的端口设置 PM5CTL0 &=~LOCKLPM5; //配置 MPU MPUCTL0 = MPUPW; //写入 PWD 以访问 MPU 寄存器 MPUSEGB1 = 0x0600; // B1 = 0x6000;B2 = 0x8000 MPUSEGB2 = 0x0800; //将边框分配给句段 //段1 -执行、读取 //段2 -执行、读取 //段3 -执行、读取 MPUSAM = MPUSEG1RE | MPUSEG1XE | MPUSEG2RE | MPUSEG2XE | MPUSEG2WE| MPUSEG3RE | MPUSEG3XE | MPUSEGIRE | MPUSEGI| MPUSEGIXE; MPUCTL0 = MPUPW | MPUENA | MPUSEGIE;//启用 MPU 保护 // MPU 寄存器在 BOR Data = 0x88前被锁定; //通过写入段2+ ptr =(unsigned int *) 0x6002; * ptr = Data; UDATA = 0x55; __delay_cycles (100); while (SYSNMIFLAG)导致 MPU 违反 //由于 Seg2 { P1OUT ^= BIT0; //切换 LED _DELAY_CYCLES (100000); //查看切换的延迟 } //无违反-在此陷阱 while (1); } //系统 NMI 向量 #if defined (__TI_Compiler_version__)|| Defined (__IAR_SYSTEMS_ICC__) #pragma vector = SYSNMI_vector __interrupt void SYSNMI_ISR (void) #Elif defined (__GISR_ICM_ )(void )#SNMI_error)(void SYSNMI_)(void)(void SYSNMI_)(void)! #endif { switch (__even_in_range (SYSSNIV、SYSSNIV_CBDIFG)) { case SYSSNIV_NONE:break; case SYSSNIV_RES02:break; case SYSSNIV_UBDIFG:break; case SYSSNIV_RES06:break; case SYSSNIV_RES02:break;case SYSSNGPIV_USGPIFG:break: 案例 SYSSNIV_MPUSEGIIFG:break; 案例 SYSSNIV_MPUSEG1IFG:break; 案例 SYSSNIV_MPUSEG2IFG: MPUCTL1 &=~MPUSEG2IFG; //清除违规中断标志 SYSNMIFLAG = 1; //设置标志 break; case SYSSNIV_MPUSEG3IFG:break; case SYSSNIV_VMAIFG:break; case SYSSNIV_JMBINIFG:break; case SYSSNIV_JMBOUTIFG:break; 实例 SYSSNIV_CBDIFG:break; 默认值:break; } }
B.R
冬季