Ответ: Низкоуровневые функции
#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 ); // а так сохранить во флэшь
-
- Ответ: temik(967 знак., 17.05.2006 11:49,
)
- Конечно нет. INFO это сегмент (или два) Flash по адресу 0x1000-0x107F, 0x1080-0x10FF. Так что структура будет постоянно, пока не сотрете Flash или не измените ее содержимое. - rezident(17.05.2006 11:58,
)
- Ответ: в принципе эти и имелось в виду - temik(17.05.2006 16:12,
)
- Ответ: в принципе эти и имелось в виду - temik(17.05.2006 16:12,
- Конечно нет. INFO это сегмент (или два) Flash по адресу 0x1000-0x107F, 0x1080-0x10FF. Так что структура будет постоянно, пока не сотрете Flash или не измените ее содержимое. - rezident(17.05.2006 11:58,
- Ответ: temik(967 знак., 17.05.2006 11:49,