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:如何编写 FRAM 程序

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/725729/msp430fr6989-how-to-write-fram-program

器件型号:MSP430FR6989

# pragma 位置(UDATA、0x1820)

UDATA 被重写到指定的地址。
不仅可以重写信息区域、还可以重写 FRAM 区域
但是、如果在程序执行期间重写 UDATA、则重写 RAM 区域、不重写 FRAM 区域。 我认为可以重写 FRAM、因为 FRAM 区域已启用写入、但无法完成。

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

    您的 MPU 和 IPE 配置是什么? 如果您启用 MPU、那么不带写访问权限的写段会受到 MPU 的保护。 如果启用 IPE、则只有从 IPE 段执行的程序代码才能访问此段中存储的数据。

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

    IPE 未设置。 我使用 MPU。

    段1通过 MPUSAM 被写入使能。
    虽然设置为重写在# pragma 位置设置 FRAM 地址的变量、但不会重写。
    MPUSEG 1 WE=1
    MPUSEG 1 XE = 1
    MPUSEG1RE = 1
    我在干什么。
    是否有必要将其设置在其他位置?

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

    您好!

    您可以尝试以下示例代码。 如果置位 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

    冬季