ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
1 июля
58811 Топик полностью
VAI (16.05.2006 18:17, просмотров: 1) ответил temik на Ответ: а как во внутреннюю написать? и при старте потом прочитать?
Ответ: Низкоуровневые функции
#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();                 // Разрешим прерывания
}
Высокий уровень, зависит от Вашей фантазии, в данном случае размер записываемых данных не превышает 1 сегмента флэшь.
/* --- flash_wr_constant() -------------------------------------------------------------------------------- **
 *  Запись структуры Flash_Constant
 *  *src - указатель на массив, содержащий копию Flash_Constant, которую надо записать в INFO
 * -------------------------------------------------------------------------------------------------------- */
void flash_wr_constant( WORD *src )
{
int a;
WORD *dst = (WORD *)&f_const;

  flash_er_seg( (BYTE *)&f_const );
  for ( a = 0; a < ( sizeof( f_const ) + 1 )/ sizeof( WORD ); a++ ) // +1 - если нечетное число - количество слов в массиве
    flash_wr_word( dst++, *src++ );     // пишем словами для скорости
}
использование Описание
typedef struct              // Константы, меняемые при регулировке
{ unsigned short    Firm_number;        // заводской номер прибора
  unsigned short    Firmware_ver;       // Версия программного обеспечения прибора (printf( "\fВерсия программного\nобеспечения: v %x.%02x", ( Firmware_ver >> 8 ), Firmware_ver & 0xff );)
  double            Ku[cnt];
  float             Pr_ekv;
  double            M_press;
  float             accuracy[bas_cnt];
  ser_io_koef       net_param;
  FLAG              ini_flag;
.....................................
} Flash_Constant;
инициализация, в новом изделии
В одном из файлов пишем так:

#pragma constseg = INFO                 // const Flash_Constant f_const
const Flash_Constant f_const =
{
// Firm_number
  10089,                                // заводской номер прибора
// Firmware_ver
  0x0099,                               // Версия программного обеспечения прибора (printf( "\fВерсия программного\nобеспечения: v %x.%02x", ( Firmware_ver >> 8 ), Firmware_ver & 0xff );)
// Ku[cnt]
  { 1.0,
    1.0,
    1.0,
    1.0,
    0.0
  },
// Pr_ekv
  0.60,
// M_press
  113255.748999704,
// accuracy[bas_cnt]
  { 0.01,
    1.,
    0.01
  },
// net_param
  { 10, B_38400 },
// ini_flag - Флаги
  { OFF,
    OFF,
    OFF,
    ON, 
    OFF,
    OFF,
    OFF,
    OFF,
    OFF,
    OFF,
    OFF,
    ON, 
    OFF 
  }
};
#pragma constseg = default

Для остальных файлов, где используем, эдак:
extern const Flash_Constant f_const;
Flash_Constant ram_copy_f_const; // копия в ОЗУ

ram_copy_f_const = f_const; // так можно проинициализировать озушную копию

flash_wr_constant( (WORD *)&ram_copy_f_const ); // а так сохранить во флэшь