Да всё я понял прекрасно. Именно такая ситуация и у меня. Вопрос в чём?
Как писать по конкретному адресу?
Ну вот - дёрнул пару кусков:
#include "cpu.h" #ifdef __CPU_16LX__ // ------------------- макросы для произнесения "заклинаний" в mb90 #define RESET1 \ *((volatile INT16U MEM24 *)0xFF0000) = 0x00F0; #define RESET2 \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x00AA; \ *((volatile INT16U MEM24 *)0xFF5554) = 0x0055; \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x00F0; #define PROGRAMMING \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x00AA; \ *((volatile INT16U MEM24 *)0xFF5554) = 0x0055; \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x00A0; #define ERASECHIP \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x00AA; \ *((volatile INT16U MEM24 *)0xFF5554) = 0x0055; \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x0080; \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x00AA; \ *((volatile INT16U MEM24 *)0xFF5554) = 0x0055; \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x0010; #define ERASESECTOR \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x00AA; \ *((volatile INT16U MEM24 *)0xFF5554) = 0x0055; \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x0080; \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x00AA; \ *((volatile INT16U MEM24 *)0xFF5554) = 0x0055; #define AUTOSELECT \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x00AA; \ *((volatile INT16U MEM24 *)0xFF5554) = 0x0055; \ *((volatile INT16U MEM24 *)0xFFAAAA) = 0x0090; // -------------------------------------------------------- адрес для поллинга #define POLL_ADR *((volatile INT16U MEM24*)0xFFFFFEL) #endif /* К О М А Н Д Ы MB91 1) Чтение/Сброс 0Fxxxx/xxF0 2) Чтение/Сброс 0F5554/xxAA, 0FAAA8/xx55, 0F5554/xxF0, RA/RD 3) Запись 0F5554/xxAA, 0FAAA8/xx55, 0F5554/xxA0, PA/PD 4) Стирание Чипа 0F5554/xxAA, 0FAAA8/xx55, 0F5554/xx80, 0F5554/xxAA, 0FAAA8/xx55, 0F5554/xx10 5) Стирание Сектора 0F5554/xxAA, 0FAAA8/xx55, 0F5554/xx80, 0F5554/xxAA, 0FAAA8/xx55, SA/xx30 7) Стирание Сектора Приостановленно Input of address"FFXXXX"Data (xxB0H) suspends sector erasing. 8) Стирание Сектора Продолжается Input address"FFXXXX"Data (xx30H) suspends and resume sector erasing. */ #ifdef __CPU_FR__ // ------------------- макросы для произнесения "заклинаний" в mb91 #define RESET1 \ *((volatile INT16U MEM24 *)0x0F0000) = 0x00F0; #define RESET2 \ *((volatile INT16U MEM24 *)0x0F5554) = 0x00AA; \ *((volatile INT16U MEM24 *)0x0FAAA8) = 0x0055; \ *((volatile INT16U MEM24 *)0x0F5554) = 0x00F0; #define PROGRAMMING \ *((volatile INT16U MEM24 *)0x0F5554) = 0x00AA; \ *((volatile INT16U MEM24 *)0x0FAAA8) = 0x0055; \ *((volatile INT16U MEM24 *)0x0F5554) = 0x00A0; #define ERASECHIP \ *((volatile INT16U MEM24 *)0x0F5554) = 0x00AA; \ *((volatile INT16U MEM24 *)0x0FAAA8) = 0x0055; \ *((volatile INT16U MEM24 *)0x0F5554) = 0x0080; \ *((volatile INT16U MEM24 *)0x0F5554) = 0x00AA; \ *((volatile INT16U MEM24 *)0x0FAAA8) = 0x0055; \ *((volatile INT16U MEM24 *)0x0F5554) = 0x0010; #define ERASESECTOR \ *((volatile INT16U MEM24 *)0x0F5554) = 0x00AA; \ *((volatile INT16U MEM24 *)0x0FAAA8) = 0x0055; \ *((volatile INT16U MEM24 *)0x0F5554) = 0x0080; \ *((volatile INT16U MEM24 *)0x0F5554) = 0x00AA; \ *((volatile INT16U MEM24 *)0x0FAAA8) = 0x0055; #define AUTOSELECT \ *((volatile INT16U MEM24 *)0x0F5554) = 0x00AA; \ *((volatile INT16U MEM24 *)0x0FAAA8) = 0x0055; \ *((volatile INT16U MEM24 *)0x0F5554) = 0x0090; // -------------------------------------------------------- адрес для поллинга #define POLL_ADR *((volatile INT16U MEM24*)0x0E0002L) #endif /* ****************************************************************************** * * Function : MEM24 int FlashProgrammWord(MEM24 INT16U *adr, INT16U data) * * Description : пишет слово data по адресу adr во флеш память * * Parameter : data - данные ; adr - адрес, покоторому ведётся запись * * Return : коды ошибок: * FLASH_OK - нет ошибок * FLASH_ERR_TIME - выход по таймауту * ****************************************************************************** */ MEM24 INT8U FlashProgrammWord (MEM24 INT16U *adr, INT16U data) { INT8U tmp; FMCS_WE = 1; // разрешение операций с флеш PROGRAMMING // заклинание "запрограммировать слово" *adr = data; // собсна команда программирования tmp = waitAlgorithm(); // ожидание окончания авто-алгоритма FMCS_WE = 0; // запрещение операций с флеш return tmp; } cpu.h (MB90) : #ifndef __CPU_H_ #define __CPU_H_ #includeФункции, оперирующие с флешью, разумеется размещены в ОЗУ средствами линкера, в секции с автоинициализацией (см пособие на компилятор/линкер).#include #endif typemb90.h : #ifndef __TYPEMB90_H_ #define __TYPEMB90_H_ // СТАНДАРТНЫЕ ТИПЫ typedef unsigned char BOOLEAN; typedef unsigned char INT8U; // Unsigned 8 bit quantity typedef signed char INT8S; // Signed 8 bit quantity typedef unsigned short INT16U; // Unsigned 16 bit quantity typedef signed short INT16S; // Signed 16 bit quantity typedef unsigned long INT32U; // Unsigned 32 bit quantity typedef signed long INT32S; // Signed 32 bit quantity typedef float FP32; // Single precision floating point typedef double FP64; // Double precision floating point #define MEM32 __far #define MEM24 __far #define MEM16 __near #define MEM8 __near #endif typemb91.h : #ifndef __TYPEMB90_H_ #define __TYPEMB90_H_ // СТАНДАРТНЫЕ ТИПЫ typedef unsigned char BOOLEAN; typedef unsigned char INT8U; // Unsigned 8 bit quantity typedef signed char INT8S; // Signed 8 bit quantity typedef unsigned short INT16U; // Unsigned 16 bit quantity typedef signed short INT16S; // Signed 16 bit quantity typedef unsigned long INT32U; // Unsigned 32 bit quantity typedef signed long INT32S; // Signed 32 bit quantity typedef float FP32; // Single precision floating point typedef double FP64; // Double precision floating point #define MEM32 #define MEM24 #define MEM16 #define MEM8 #endif