TI中文支持网
TI专业的中文技术问题搜集分享网站

MPU操作

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

Ling Zhu2:

试一下范例程序

//******************************************************************************
//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 GPIOP1DIR |= BIT0;// Configure P1.0 for LED// Disable the GPIO power-on default high-impedance mode to activate// previously configured port settingsPM5CTL0 &= ~LOCKLPM5;// Configure MPUMPUCTL0 = MPUPW;// Write PWD to access MPU registersMPUSEGB1 = 0x0600;// B1 = 0x6000; B2 = 0x8000MPUSEGB2 = 0x0800;// Borders are assigned to segmentsMPUSAM &= ~MPUSEG2WE;// Segment 2 is protected from writeMPUSAM &= ~MPUSEG2VS;// Violation select on write accessMPUCTL0 = MPUPW | MPUENA | MPUSEGIE;// Enable MPU protection// MPU registers locked until BORData = 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 herewhile(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 flagSYSNMIflag = 1;// Set flagbreak;case SYSSNIV_MPUSEG3IFG: break;case SYSSNIV_VMAIFG: break;case SYSSNIV_JMBINIFG: break;case SYSSNIV_JMBOUTIFG: break;case SYSSNIV_CBDIFG: break;default: break;}
}

SeaFesse:

有几个寄存器 是有“ 锁存功能”  你锁了 就变不了。 在用户指南 MPU章节,寄存器那里写的很清楚

灰小子:

回复 SeaFesse:

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

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

赞(0)
未经允许不得转载:TI中文支持网 » MPU操作
分享到: 更多 (0)