0
電源をオンからオフに検出し、重要なデータを内蔵フラッシュメモリに書きたいと思います。電源オフ検出MSP430
問題は私のコードがOFFからONに切り替わるときに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;
}
MSP430はわかりませんが、通常、ステータスレジスタのPOR(Power On Reset)フラグは必要なものを提供します。 – LPs
オフからオンへのオフからオフに行くことはどういう意味ですか?パワー?あなたは電源があるかどうかを検出するピンを使用していますか?あなたはこれをどうやってやっているのか、何がうまくいかないのか、もっと具体的になりますか? – DiBosco
はい私は電源オフを意味し、私はそれを検出するピンを使用していないです。私はそれを内部的に検出したい。 –