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.

MPU操作

Other Parts Discussed in Thread: MSP430FR6972

msp430fr6972的mpu操作寄存器数值不发生改变?如何解决??

  • 试一下范例程序

    //******************************************************************************
    //  MSP430FR6x7x Demo - MPU Write protection violation - Interrupt notification
    //
    //  Description: The MPU segment boundaries are defined by:
    //  Border 1 = 0x6000 [MPUSEGB1 = 0x0600]
    //  Border 2 = 0x8000 [MPUSEGB2 = 0x0800]
    //  Segment 1 = 0x4400 - 0x5FFF
    //  Segment 2 = 0x6000 - 0x7FFF
    //  Segment 3 = 0x8000 - 0x13FFF
    //  Segment 2 is write protected. Any write to an address in the segment 2 range
    //  causes a PUC. The LED toggles after accessing SYS NMI ISR.
    //
    //  ACLK = n/a, MCLK = SMCLK = default DCO
    //
    //
    //           MSP430FR6972
    //         ---------------
    //     /|\|               |
    //      | |               |
    //      --|RST            |
    //        |               |
    //        |           P1.0|-->LED
    //
    //   Andreas Dannenberg
    //   Texas Instruments Inc.
    //   September 2014
    //   Built with IAR Embedded Workbench V5.60 & Code Composer Studio V6.0
    //******************************************************************************
    #include <msp430.h>
    
    unsigned char SYSNMIflag = 0;
    unsigned int *ptr = 0;
    unsigned int Data = 0;
    
    int main(void)
    {
      WDTCTL = WDTPW | WDTHOLD;                 // Stop WDT
    
      // Configure GPIO
      P1DIR |= BIT0;                            // Configure P1.0 for LED
    
      // Disable the GPIO power-on default high-impedance mode to activate
      // previously configured port settings
      PM5CTL0 &= ~LOCKLPM5;
    
      // Configure MPU
      MPUCTL0 = MPUPW;                          // Write PWD to access MPU registers
      MPUSEGB1 = 0x0600;                        // B1 = 0x6000; B2 = 0x8000
      MPUSEGB2 = 0x0800;                        // Borders are assigned to segments
      MPUSAM &= ~MPUSEG2WE;                     // Segment 2 is protected from write
      MPUSAM &= ~MPUSEG2VS;                     // Violation select on write access
      MPUCTL0 = MPUPW | MPUENA | MPUSEGIE;      // Enable MPU protection
                                                // MPU registers locked until BOR
      Data = 0x88;
    
      // Cause an MPU violation by writing to segment 2+
      ptr = (unsigned int *)0x6002;
      *ptr = Data;
    
      __delay_cycles(100);
    
      while(SYSNMIflag)                         // Has violation occured due to Seg2
      {
        P1OUT ^= BIT0;                          // Toggle LED
        __delay_cycles(100000);                 // Delay to see toggle
      }
    
      // No violation - trap here
      while(1);
    }
    
    // System NMI vector
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector = SYSNMI_VECTOR
    __interrupt void SYSNMI_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(SYSNMI_VECTOR))) SYSNMI_ISR (void)
    #else
    #error Compiler not supported!
    #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_MPUSEGPIFG: break;
      case SYSSNIV_MPUSEGIIFG: break;
      case SYSSNIV_MPUSEG1IFG: break;
      case SYSSNIV_MPUSEG2IFG:
        MPUCTL1 &= ~MPUSEG2IFG;                 // Clear violation interrupt flag
        SYSNMIflag = 1;                         // Set flag
        break;
      case SYSSNIV_MPUSEG3IFG: break;
      case SYSSNIV_VMAIFG: break;
      case SYSSNIV_JMBINIFG: break;
      case SYSSNIV_JMBOUTIFG: break;
      case SYSSNIV_CBDIFG: break;
      default: break;
      }
    }
  • 有几个寄存器 是有“ 锁存功能”  你锁了 就变不了。 在用户指南 MPU章节,寄存器那里写的很清楚

  • 建议先运行一下官网的例程,如果没问题,可以在官网例程的基础上修改。

    或者对比自己和官网的例程,找差异