 John (01.07.2010 10:34, просмотров: 4768)
 John (01.07.2010 10:34, просмотров: 4768)
Все еще остался вопрос по поводу сохранения данных во флеш(питание не постоянно) Вот что я понаписал:
[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]