Embedded 断电检测MSP430
我想检测电源开关,并想将重要数据写入内部闪存 问题是我的代码进入ISR时,它是关闭到打开,而不是打开到关闭 我被这个问题难住了 任何帮助都将不胜感激 这是我的密码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,
#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吗