ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
51732 Топик полностью
VAI (20.02.2006 09:43, просмотров: 1) ответил РДимка на Ответ: Да, читал, но мне кое что непонятно! внутрях
Ответ: 
#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();                 // Разрешим прерывания
}