Embedded 断电检测MSP430

Embedded 断电检测MSP430,embedded,detect,flash-memory,Embedded,Detect,Flash Memory,我想检测电源开关,并想将重要数据写入内部闪存 问题是我的代码进入ISR时,它是关闭到打开,而不是打开到关闭 我被这个问题难住了 任何帮助都将不胜感激 这是我的密码 #include <msp430.h> /* * main.c */ void write_SegC(void); void copy_from_FlashC(void); void PMM_config(void); void UCS_config(void); char Flash_Data[20] = {0,

我想检测电源开关,并想将重要数据写入内部闪存

问题是我的代码进入ISR时,它是关闭到打开,而不是打开到关闭

我被这个问题难住了

任何帮助都将不胜感激

这是我的密码

#include <msp430.h>

/*
 * main.c
 */
void write_SegC(void);
void copy_from_FlashC(void);
void PMM_config(void);
void UCS_config(void);

char Flash_Data[20] = {0,0,3,4,5,6,7,8,0,0,0,5,5,5,0,8,8,9,2,3};
char Flash_Data1[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

int main(void) {
    WDTCTL = WDTPW | WDTHOLD;  // Stop watchdog timer
    P1DIR |= BIT0;
    P1REN |= BIT6;
    UCS_config();
    PMM_config();
    UCS_config();

    while(1)
    {
        copy_from_FlashC();
    }
    return 0;
}

void copy_from_FlashC(void)
{
    unsigned int i;
    char *Flash_ptrC;

    Flash_ptrC = (char *) 0x1880;           // Initialize Flash segment C ptr

    FCTL3 = FWKEY;                              // Clear Lock bit
    FCTL1 = FWKEY;
    FCTL4 = FWKEY | MGR0 ;

    for (i = 0; i < 20; i++)
    {
        //     *Flash_ptrD++ = *Flash_ptrC++;      // copy value segment C to seg D
        Flash_Data1[i] = *Flash_ptrC++;
    }

    FCTL1 = FWKEY;                          // Clear WRT bit
    FCTL3 = FWKEY | LOCK;                   // Set LOCK bit
}

void write_SegC(void)
{
    P1OUT |= BIT0;

    unsigned int i;
    char *Flash_ptr;                        // Initialize Flash pointer

    Flash_ptr = (char *)0x1880;

    FCTL3 = FWKEY;                          // Clear Lock bit
    FCTL1 = FWKEY | ERASE;                  // Set Erase bit
    *Flash_ptr = 0;                         // Dummy write to erase Flash seg
    FCTL1 = FWKEY | WRT;                    // Set WRT bit for write operation


    for (i = 0; i < 20; i++)
    {
        *Flash_ptr++ = Flash_Data[i];             // Write value to flash
    }

    FCTL1 = FWKEY;                          // Clear WRT bit
    FCTL3 = FWKEY | LOCK;                   // Set LOCK bit
    P1OUT &= ~BIT0;
}

void PMM_config(void)
{
    //unlock PMM
    PMMCTL0_H=PMMPW_H;
    PMMCTL0_L|=PMMCOREV_3;
    //check voltage level
    switch(PMMCTL0&PMMCOREV_3)
    {
            //settings for highest core voltage settings
        case PMMCOREV_3:
            //setup high side supervisor and monitor
            SVSMHCTL=SVMHE|SVSHE|SVSHRVL_3|SVSMHRRL_7;
            break;
    }
    //clear interrupt flags
    PMMIFG&=~(SVMLIFG|SVMHIFG|SVMHVLRIFG|SVMLVLRIFG);
    //setup interrupts
    PMMRIE|=SVMLIE|SVMHIE|SVMHVLRIE|SVMLVLRIE;
    //lock PMM
    PMMCTL0_H=0;
}

#pragma vector = SYSNMI_VECTOR
__interrupt void SYS_NMI(void)
{
    switch(SYSSNIV)
    {
            //core supply voltage monitor interrupt
        case SYSSNIV_SVMLIFG:
            //event to report error
            //set flag
            break;
            //input supply voltage monitor interrupt
        case SYSSNIV_SVMHIFG:
            write_SegC();
            //   Clear_SegC(value);     // For testing only
            //event to report error
            //set flag
            break;
            //core supply voltage monitor delay interrupt
        case SYSSNIV_DLYLIFG:
            break;
            //interrupt supply voltage monitor delay interrupt
        case SYSSNIV_DLYHIFG:
            break;
            //Vacant memory access interrupt
        case SYSSNIV_VMAIFG:
            break;
            //JTAG mailbox in interrupt
        case SYSSNIV_JMBINIFG:
            break;
            //JTAG mailbox out interrupt
        case SYSSNIV_JMBOUTIFG:
            break;
            //SVMLVLRIFGSVMHVLRIFG
        case SYSSNIV_VLRLIFG:
            //clear interrupt flag bits
            //unlock PMM
            PMMCTL0_H=PMMPW_H;
            //clear interrupt flags
            PMMIFG&=~(SVMLIFG|SVMLVLRIFG);
            //lock PMM
            PMMCTL0_H=0;
            break;
            //SVMHVLRIFGSVMHVLRIFG
        case SYSSNIV_VLRHIFG:
            //clear interrupt flag bits
            //unlock PMM
            PMMCTL0_H=PMMPW_H;
            //clear interrupt flags
            PMMIFG&=~(SVMHIFG|SVMHVLRIFG);
            //lock PMM
            PMMCTL0_H=0;
            break;
    }
}

void UCS_config(void)
{
    PMMCTL0_H = 0xA5;
    PMMCTL0_L = 0x03;
    UCSCTL0 = UCSCTL0 | 0x1F00;
    UCSCTL1 = UCSCTL1 & 0x0000;
    UCSCTL1 = UCSCTL1 | 0x0040;
    UCSCTL2 = UCSCTL2 & 0x0000 ; // FLL Divider
    UCSCTL2 = UCSCTL2 | 0x304F ; // for 20 MHz MCLK and 2.6 MHz SMCLK
    UCSCTL3 = 0x0000;

    UCSCTL4 = UCSCTL4 & 0X0000;
    UCSCTL4 = UCSCTL4 | 0X0043;
}
#包括
/*
*main.c
*/
无效写入SegC(无效);
来自FlashC的作废副本(作废);
作废PMM_配置(作废);
无效UCS\U配置(无效);
char Flash_Data[20]={0,0,3,4,5,6,7,8,0,0,0,5,5,0,0,8,8,9,2,3};
char Flash_Data1[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
内部主(空){
WDTCTL=WDTPW | WDTHOLD;//停止看门狗定时器
P1DIR |=位0;
P1REN |=位6;
UCS_配置();
PMM_config();
UCS_配置();
而(1)
{
从_FlashC()复制_;
}
返回0;
}
从FlashC复制的无效副本(无效)
{
无符号整数i;
字符*Flash_ptrC;
闪存_ptrC=(char*)0x1880;//初始化闪存段C ptr
FCTL3=FWKEY;//清除锁位
FCTL1=FWKEY;
FCTL4=FWKEY | MGR0;
对于(i=0;i<20;i++)
{
//*Flash_ptrD++=*Flash_ptrC++;//将值段C复制到段D
Flash_Data1[i]=*Flash_ptrC++;
}
FCTL1=FWKEY;//清除WRT位
FCTL3=FWKEY | LOCK;//设置锁位
}
void write_SegC(void)
{
P1OUT |=位0;
无符号整数i;
char*Flash_ptr;//初始化Flash指针
Flash_ptr=(字符*)0x1880;
FCTL3=FWKEY;//清除锁位
FCTL1=FWKEY | ERASE;//设置擦除位
*Flash_ptr=0;//虚拟写入以擦除Flash seg
FCTL1=FWKEY | WRT;//为写操作设置WRT位
对于(i=0;i<20;i++)
{
*Flash_ptr++=Flash_Data[i];//将值写入Flash
}
FCTL1=FWKEY;//清除WRT位
FCTL3=FWKEY | LOCK;//设置锁位
P1OUT&=~BIT0;
}
无效PMM_配置(无效)
{
//解锁PMM
PMMCTL0_H=PMMPW_H;
PMMCTL0_L |=PMMCOREV_3;
//检查电压电平
开关(PMMCTL0和PMMCOREV_3)
{
//最高铁芯电压设置的设置
案例PMMCOREV_3:
//设置高压侧监控器和监视器
SVSMHCTL=SVMHE | SVSHE | SVSHRVL|U 3 | SVSMHRRL|U 7;
打破
}
//清除中断标志
PMMIFG&=~(SVMLIFG | SVMHIFG | SVMHVLRIFG | SVMLVLRIFG);
//设置中断
PMMRIE |=SVMLIE | SVMHIE | SVMHVLRIE | SVMLVLRIE;
//锁定PMM
PMMCTL0_H=0;
}
#pragma向量=SYSNMI\u向量
__中断无效系统(无效)
{
交换机(SYSSNIV)
{
//核心电源电压监视器中断
案例SYSSNIV_SVMLIFG:
//要报告错误的事件
//设旗
打破
//输入电源电压监视器中断
案例SYSSNIV_SVMHIFG:
写_SegC();
//清除_SegC(值);//仅用于测试
//要报告错误的事件
//设旗
打破
//核心电源电压监视器延迟中断
案例SYSSNIV_DLYLIFG:
打破
//中断电源电压监视器延迟中断
案例SYSSNIV_DLYHIFG:
打破
//空存储器访问中断
案例SYSSNIV_VMAIFG:
打破
//中断中的JTAG邮箱
案例SYSSNIV_JMBINIFG:
打破
//JTAG邮箱输出中断
案例SYSSNIV_JMBOUTIFG:
打破
//SVMLVLRIFGSVMHVLRIFG
案例SYSSNIV_VLRLIFG:
//清除中断标志位
//解锁PMM
PMMCTL0_H=PMMPW_H;
//清除中断标志
PMMIFG&=~(SVMLIFG | SVMLVLRIFG);
//锁定PMM
PMMCTL0_H=0;
打破
//SVMHVLRIFGSVMLRIFG
案例SYSSNIV_VLRHIFG:
//清除中断标志位
//解锁PMM
PMMCTL0_H=PMMPW_H;
//清除中断标志
PMMIFG&=~(SVMHIFG | SVMHVLRIFG);
//锁定PMM
PMMCTL0_H=0;
打破
}
}
无效UCS\U配置(无效)
{
PMMCTL0_H=0xA5;
PMMCTL0_L=0x03;
UCSCTL0=UCSCTL0 | 0x1F00;
UCSCTL1=UCSCTL1&0x0000;
UCSCTL1=UCSCTL1 | 0x0040;
UCSCTL2=UCSCTL2&0x0000;//FLL除法器
UCSCTL2=UCSCTL2 | 0x304F;//用于20 MHz MCLK和2.6 MHz SMCLK
UCSCTL3=0x0000;
UCSCTL4=UCSCTL4&0X0000;
UCSCTL4=UCSCTL4 | 0X0043;
}
来自

POR是一种设备复位。POR仅由以下步骤生成 三项活动:

为设备通电

•在重置模式下配置时,RST/NMI引脚上的低信号

•PORON=1时的SVS低状态


因此,如果您的设备没有电源电压管理器,唯一的选择就是使用ADC制作您自己的电源。

我不知道MSP430,但通常状态reg的POR(开机复位)标志会提供您所需要的。您所说的“关”到“开”与“开”到“关”是什么意思?权力?您是否使用pin来检测是否有电源?请你更具体地说明你是如何做到这一点的,什么是不工作的?是的,我的意思是从电源打开到关闭,我没有使用任何Pin来检测它。我想在内部检测它。你有MSP430吗