Перейти к содержанию
    

Кто знает как работать с EPPROM на STM8S

Через какие и как? Интересует на СИ.

Сначала открываем Reference manual на семейство STM8S (RM0016) и читаем раздел Flash program memory and data EEPROM (Flash).

Для Cosmic и Raisonance открываем help библиотеки периферии и изучаем раздел Flash Examples. Особенность в том, что прежде, чем писать в EEPROM надо последовательно ввести в регистр DUKR два ключа для разблокировки процедуры записи. И еще надо помнить про тактовую частоту (для установки правильного времени доступа).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Через какие и как? Интересует на СИ.

в iаr в папке с примерами есть проекты с библиотекой. Там есть файл flash.c с набором соответствующих функций. У меня работают все, кроме функций, работающих с блоками(зависает чип).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в iаr в папке с примерами есть проекты с библиотекой. Там есть файл flash.c с набором соответствующих функций. У меня работают все, кроме функций, работающих с блоками(зависает чип).

Для работы с блоками необходимо копировать исполняемый код в RAM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для работы с блоками необходимо копировать исполняемый код в RAM

подскажите, где об этом почитать? (просто я до этого имел дело только с аvr)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите, где об этом почитать? (просто я до этого имел дело только с аvr)

 

Читайте AN2659 от ST

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

эк вас в дебри понесло..

вроде топикстартер спрашивал про data EEPROM (не про Flash program memory)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

перед записью нужно снять защиту:

FLASH_DUKR = 0xAE;
FLASH_DUKR = 0x56;

проще всего писать побайтно - простым присваиванием:

@eeprom e1;

e1 = 0x5A

Изменено пользователем ukpyr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

перед записью нужно снять защиту:

FLASH_DUKR = 0xAE;
FLASH_DUKR = 0x56;

проще всего писать побайтно - простым присваиванием:

@eeprom e1;

e1 = 0x5A

 

Эт в COSMIC не работает, может какие-то настройки линкера нужны?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эт в COSMIC не работает, может какие-то настройки линкера нужны?
у меня почему-то работала двойная запись, то есть последовательно писал в одну ячейку два раза. Почему так - непонятно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня почему-то работала двойная запись, то есть последовательно писал в одну ячейку два раза. Почему так - непонятно

 

Оказывется ключевым моментом является прописать библиотеу. В опциях проекта на вкладке linker в ячейку Objects прописать либу libl0.sm8

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я как раз недавно реализовал блочное программирование EEPROM в STM8S103. Авось пригодится:

 

Update: только что заметил, что в коде используется яровский "виртуальный регистр" (а именно байт по адресу 0). Это надо учитывать, если компилятор - не IAR. Естественно, код легко подправить, чтобы такой зависимости не было. Просто сейчас лень это делать...

 

/**
* @file  flash.c
* @brief Flash memory driver
*
* Implements 2 functions: block erase and block write. Block size is 64 bytes.
* This is done to minimize EEPROM programming time.
* Since programming code must be executed from RAM, the machine code is in the
* form of static arrays with corresponding assembly and C code shown in
* comments.
*/

#include "flash.h"
#include "stm8regs.h"

/*
void
block_erase(uint8_t *dst)
{
        FLASH_CR2 = 0x20;
        FLASH_NCR2 = 0xDF;
        *dst++ = 0;
        *dst++ = 0;
        *dst++ = 0;
        *dst = 0;
}
*/

static uint8_t block_erase_code[] = {
        0x35, 0x20, 0x50, 0x5B, /* MOV FLASH_CR2, #0x20  */
        0x35, 0xDF, 0x50, 0x5C, /* MOV FLASH_NCR2, #0xDF */
        0x4F,                   /* CLR A                 */
        0xF7,                   /* LD (X), A             */
        0x5C,                   /* INCW X                */
        0xF7,                   /* LD (X), A             */
        0x5C,                   /* INCW X                */
        0xF7,                   /* LD (X), A             */
        0x5C,                   /* INCW X                */
        0xF7,                   /* LD (X), A             */
        0x81,                   /* RET                   */
};

static void (*const block_erase)(uint8_t *dst) = (void (*)(uint8_t *dst))block_erase_code;

/*
void
block_write(uint8_t *src, uint8_t *dst)
{
        int8_t i;
        FLASH_CR2 = 0x10;
        FLASH_NCR2 = 0xEF;
        for (i = 64; i > 0; i--)
        {
                *dst++ = *src++;
        }
}
*/

static uint8_t block_write_code[] = {
        0x35, 0x10, 0x50, 0x5B, /* MOV FLASH_CR2, #0x10  */
        0x35, 0xEF, 0x50, 0x5C, /* MOV FLASH_NCR2, #0xDF */
        0x35, 0x40, 0x00, 0x00, /* MOV ?b0, #0x40        */
        0xF6,             /* loop: LD A, (X)             */
        0x90, 0xF7,             /* LD (Y), A             */
        0x5C,                   /* INCW X                */
        0x90, 0x5C,             /* INCW Y                */
        0xB6, 0x00,             /* LD A, ?b0             */
        0x4A,                   /* DEC A                 */
        0xB7, 0x00,             /* LD ?b0, A             */
        0x26, 0xF3,             /* JRNE loop             */
        0x81,                   /* RET                   */
};

static void (*const block_write)(uint8_t *src, uint8_t *dst) = (void (*)(uint8_t *src, uint8_t *dst))block_write_code;

static uint8_t block_buffer[64];

/**
* Unlock data EEPROM
*/
void
flash_init(void)
{
        FLASH_DUCR = 0xAE;
        FLASH_DUCR = 0x56;
}

/**
* Get a pointer to block buffer.
* Fill this buffer prior to calling flash_writeblock().
*/
void*
flash_getbuffer(void)
{
        return block_buffer;
}

/**
* Erase a 64-byte block
*/
void
flash_eraseblock(void* addr)
{
        block_erase(addr);
}

/**
* Write the contents of block_buffer into a 64-byte block
*/
void
flash_writeblock(void* addr)
{
        block_write(block_buffer, addr);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...