John (01.07.2010 10:34, просмотров: 4600)
Все еще остался вопрос по поводу сохранения данных во флеш(питание не постоянно) Вот что я понаписал:
[CODE]
__no_init volatile int T0 @ 0x01002;
__no_init volatile char acknowledge @ 0x01006;
void init_flash_controler(void)
{
FCTL1 = (0xA5<<8) | //ïàðîëü äëÿ çàïèñè
(BLKWRT * 0) | //ðàçðåøåíèå çàïèñè
(WRT * 0) | //ðåæèì íå âûáðàí
(EEIEX * 1) | //ðàçðåøåíèÿ àâàðèéíîãî âûõîäà
(EEI * 0) | //çàïðåò ïðåðûâàíèÿ ñòèðàíèÿ ôëåø
(MERAS * 0) | //
(ERASE * 0); //
FCTL2 = (0xA5<<8) | //ïàðîëü äëÿ çàïèñè
(FSSEL0 * 1) | //äåëèòåëü äëÿ òàêòîâàíèÿ êîíòðîëëåðà ôëåø ~257 - ~476 êÃö CPU_FREQ/400 kHz
(DIV_FOR_FLASH); //
FCTL3 = (0xA5<<8) | //ïàðîëü äëÿ çàïèñè
(LOCKA * 0) | //áëîêèðîâêó Segment A íå ìåíÿåì
(LOCK * 1); //çàáëîêèðîâàíà âñÿ ôëåø
IE1 &= ~ACCVIE; //áåç ïðåðûâàíèÿ ïî íàðóøåíèþ óñëîâèÿ äîñòóïà ê ôëåø
//if( FCTL3 & LOCKA)
//FCTL3 |= (0xA5<<8) | (LOCKA * 1);
}
void erase_write_flash_data(unsigned int data, char ack)
{
WDTCTL=WDTPW | WDTHOLD;
FCTL1 |= (0xA5<<8)|(ERASE*1)|(EEIEX * 1)|(EEI * 0); //óñëîâèÿ äëÿ ñòèðàíèÿ - óñòàíîâêà ðåæèìà ñòèðàíèÿ îäíîãî ñåãìåíòà
FCTL3 |= (0xA5<<8)|(LOCK*0); //è ñíÿòèå áëîêèðîâêè
if(FCTL3 & LOCKA)
FCTL3 |= (0xA5<<8)|(LOCKA);
//T0=0; //ñòèðàíèå íóæíûõ ÿ÷ååê (- CLR ñèììóëèðóåòñÿ MOV 0, dst)
acknowledge = 0 ; //dummy write
while(FCTL3 & BUSY)
_NOP();
FCTL1 = (0xA5<<8)|(WRT * 1)|(EEIEX * 1)|(EEI * 0); //ðåæèì çàïèñè
//T0 = data;
// acknowledge = 0;//çàïèñûâàåì ïåðèîä(data)
acknowledge = ack;
while(FCTL3 & BUSY)
_NOP(); //è ïîäòâåðæäåíèå
FCTL1 = (0xA5<<8)|(EEIEX * 1)|(EEI * 0); //ðåæèì íå âûáðàí
FCTL3 = (0xA5<<8)|(LOCK); //óñòàíàâëèâàåì áëîêèðîêó
// FCTL1 = (0xA5<<8)|(WRT * 1)|(EEIEX * 1)|(EEI * 0); //ðåæèì çàïèñè
// acknowledge = ack; //è ïîäòâåðæäåíèå
// FCTL1 = (0xA5<<8)|(EEIEX * 1)|(EEI * 0); //ðåæèì íå âûáðàí
// FCTL3 = (0xA5<<8)|(LOCK); //óñòàíàâëèâàåì áëîêèðîâêó
if(!(FCTL3 & LOCKA))
FCTL3 |= (0xA5<<8)|(LOCKA);
VD_PORT &= ~VD_BIT;
__delay_cycles(0.5*CPU_FREQ);
VD_PORT |= VD_BIT;
}
[/CODE]