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