ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
47537 Топик полностью
=AlexD= (27.12.2005 15:03, просмотров: 1) ответил Iwan на Я не втираю, а спрашиваю как? Причём судя по вашему ответу, смысла моего вопроса вы не поняли,
Да всё я понял прекрасно. Именно такая ситуация и у меня. Вопрос в чём? Как писать по конкретному адресу? Ну вот - дёрнул пару кусков:
#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


Функции, оперирующие с флешью, разумеется размещены в ОЗУ средствами линкера, в секции с автоинициализацией (см пособие на компилятор/линкер).