Да всё я понял прекрасно. Именно такая ситуация и у меня. Вопрос в чём?
Как писать по конкретному адресу?
Ну вот - дёрнул пару кусков:
#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
Функции, оперирующие с флешью, разумеется размещены в ОЗУ средствами линкера, в секции с автоинициализацией (см пособие на компилятор/линкер).