Ответ:
#if !defined( BYTE )
#define BYTE unsigned char
#endif
#if !defined( WORD )
#define WORD unsigned int
#endif
#define Flash_F ( FWKEY | FSSEL_1 | 16 ) // частота тактового генератора flash (257..476 кГц), от MCLK (6 МГц), делим на 17 = 352.94 кГц
/* --- flash_er_seg() ------------------------------------------------------------------------------------ **
* Стирание одного сегмента flash
* *seg - указатель на любой байт в границах стираемого сегмента flash
* Перед вызовом необходимо отключить WDT и запретить прерывания.
* -------------------------------------------------------------------------------------------------------- */
void flash_er_seg( BYTE *seg )
{
unsigned int old_wdt;
old_wdt = WDTCTL; // Сохраним значение WDT
WDTCTL = WDTPW + WDTHOLD; // Выключим WDT
__disable_interrupt(); // Запретим прерывания
FCTL2 = Flash_F; // частота тактового генератора flash
FCTL3 = FWKEY; // очистим LOCK разрешим программирование-стирание
FCTL1 = FWKEY | ERASE; // стирание одного сегмента flash
*seg = 0; // фиктивная запись для запуска процедуры стирания сегмента
FCTL3 = FWKEY | LOCK; // выполнено, установим LOCK обратно
WDTCTL = WDTPW + ( old_wdt & 0x00ff );
__enable_interrupt(); // Разрешим прерывания
}
/* --- flash_wr_byte() ------------------------------------------------------------------------------------ **
* Запись байта во flash
* *dst - указатель на flash, куда поместить байт
* value - значение байта
* Перед вызовом необходимо отключить WDT и запретить прерывания.
* -------------------------------------------------------------------------------------------------------- */
void flash_wr_byte( BYTE *dst, BYTE value )
{
unsigned int old_wdt;
old_wdt = WDTCTL; // Сохраним значение WDT
WDTCTL = WDTPW + WDTHOLD; // Выключим WDT
__disable_interrupt(); // Запретим прерывания
FCTL2 = Flash_F; // частота тактового генератора flash
FCTL3 = FWKEY; // очистим LOCK разрешим программирование-стирание
FCTL1 = FWKEY | WRT; // разрешение записи
*dst = value; // пишем байт
FCTL1 = FWKEY; // выполнено, очистка WRT
FCTL3 = FWKEY | LOCK; // выполнено, установим LOCK обратно
WDTCTL = WDTPW + ( old_wdt & 0x00ff );
__enable_interrupt(); // Разрешим прерывания
}
/* --- flash_wr_word() ------------------------------------------------------------------------------------ **
* Запись слова во flash
* *dst - указатель на flash, куда поместить слово
* value - значение слова
* Перед вызовом необходимо отключить WDT и запретить прерывания.
* -------------------------------------------------------------------------------------------------------- */
void flash_wr_word( WORD *dst, WORD value )
{
unsigned int old_wdt;
old_wdt = WDTCTL; // Сохраним значение WDT
WDTCTL = WDTPW + WDTHOLD; // Выключим WDT
__disable_interrupt(); // Запретим прерывания
FCTL2 = Flash_F; // частота тактового генератора flash
FCTL3 = FWKEY; // очистим LOCK разрешим программирование-стирание
FCTL1 = FWKEY | WRT; // разрешение записи
*dst = value; // пишем слово
FCTL1 = FWKEY; // выполнено, очистка WRT
FCTL3 = FWKEY | LOCK; // выполнено, установим LOCK обратно
WDTCTL = WDTPW + ( old_wdt & 0x00ff );
__enable_interrupt(); // Разрешим прерывания
}