ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
141802 Топик полностью
SeregaBudakow (10.12.2008 11:32, просмотров: 1) ответил BaRaGoZ на Добрый день всем, есть МК LPC2138,проблема записи во флеш память(из кода программы). Пишу в IAR`е. До этого писал под 2294, нашел пример кода с функциями такого содержания:
Не пользуйтесь чужими функциями, не разобравшись как они работают. Вот кусок тестов (работает на 2148 и 2368) Почему-то, у меня не получилось работать со всеми заявленными допустимыми размерами. Но то что здесь - работает 100%
/* Коды команд IAP */
#define IAP_CMD_PREPARE 50
#define IAP_CMD_WRITE 51
#define IAP_CMD_ERASE 52
#define IAP_CMD_CHECK 53
#define IAP_CMD_PART 54
#define IAP_CMD_VERSION 55
#define IAP_CMD_COMPARE 56

/* Коды статуса */
#define CMD_SUCCESS 0
#define INVALID_COMMAND 1
#define SRC_ADDR_ERROR 2
#define DST_ADDR_ERROR 3
#define SRC_ADDR_NOT_MAPPED 4
#define DST_ADDR_NOT_MAPPED 5
#define COUNT_ERROR 6
#define INVALID_SECTOR 7
#define SECTOR_NOT_BLANK 8
#define SECTOR_NOT_PREPARED 9
#define COMPARE_ERROR 10
#define BUSY 11

typedef LPC_INT32U U32;

/* Точка входа в IAP */
#define IAP_LOCATION 0x7FFFFFF1
typedef void (*IAP)(U32[], U32[]);

U32 command[5];
U32 result[2];
/******************************************************************************
; Функция записи данных в сектор.
;******************************************************************************/
void flash_write(U32 Buf_Dst[], U32 Buf_Src[])
{
    IAP iap_entry = (IAP)(IAP_LOCATION);
    // Отключение прерываний.
    __disable_interrupt();
    // Отключение PLL.
    PLLCON = 0x00;
    PLLFEED=0xAA;
    PLLFEED=0x55;
    // Подготовка сектора к стиранию.
    while (1)
    {
        command[0] = IAP_CMD_PREPARE;
        command[1] = SECT_Settings_ROM;
        command[2] = SECT_Settings_ROM;
        command[3] = 0x00;
        command[4] = 0x00;
        iap_entry (command, result);
        if (result[0] == CMD_SUCCESS){break;}
        if (result[0] == BUSY){continue;}
        goto flash_write_exit;
    }
    // Стирание сектора.
    while (1)
    {
        command[0] = IAP_CMD_ERASE;
        command[1] = SECT_Settings_ROM;
        command[2] = SECT_Settings_ROM;
        command[3] = 8000;
        iap_entry (command, result);
        if (result[0] == CMD_SUCCESS){break;}
        if (result[0] == BUSY){continue;}
        goto flash_write_exit;
    }

    // Подготовка сектора к записи.
    while (1)
    {
        command[0] = IAP_CMD_PREPARE;
        command[1] = SECT_Settings_ROM;
        command[2] = SECT_Settings_ROM;
        command[3] = 0x00;
        command[4] = 0x00;
        iap_entry (command, result);
        if (result[0] == CMD_SUCCESS){break;}
        if (result[0] == BUSY){continue;}
        goto flash_write_exit;
    }

    // Запись сектора.
    while (1)
    {
        command[0] = IAP_CMD_WRITE;
        command[1] = (U32)(Buf_Dst);
        command[2] = (U32)(Buf_Src);
        command[3] = 512;//0x2000;
        command[4] = 8000;
        iap_entry (command, result);
        if (result[0] == CMD_SUCCESS){break;}
        if (result[0] == BUSY){continue;}
        goto flash_write_exit;
    }

flash_write_exit:
    ConfigurePLL();