Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Кто знает как работать с EPPROM на STM8S
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
big-mikhael
Кто знает как работать с EPPROM на STM8S?
Deka
Наверное через регистры... wink.gif disco.gif
big-mikhael
Через какие и как? Интересует на СИ.
petrd
Цитата(big-mikhael @ Sep 25 2010, 21:18) *
Через какие и как? Интересует на СИ.

Сначала открываем Reference manual на семейство STM8S (RM0016) и читаем раздел Flash program memory and data EEPROM (Flash).
Для Cosmic и Raisonance открываем help библиотеки периферии и изучаем раздел Flash Examples. Особенность в том, что прежде, чем писать в EEPROM надо последовательно ввести в регистр DUKR два ключа для разблокировки процедуры записи. И еще надо помнить про тактовую частоту (для установки правильного времени доступа).
A.l.e.x.
Цитата(big-mikhael @ Sep 25 2010, 19:18) *
Через какие и как? Интересует на СИ.

в iаr в папке с примерами есть проекты с библиотекой. Там есть файл flash.c с набором соответствующих функций. У меня работают все, кроме функций, работающих с блоками(зависает чип).
vika1
Цитата(A.l.e.x. @ Sep 29 2010, 00:18) *
в iаr в папке с примерами есть проекты с библиотекой. Там есть файл flash.c с набором соответствующих функций. У меня работают все, кроме функций, работающих с блоками(зависает чип).

Для работы с блоками необходимо копировать исполняемый код в RAM
A.l.e.x.
Цитата(vika1 @ Sep 30 2010, 18:19) *
Для работы с блоками необходимо копировать исполняемый код в RAM

подскажите, где об этом почитать? (просто я до этого имел дело только с аvr)
vika1
Цитата(A.l.e.x. @ Oct 5 2010, 21:30) *
подскажите, где об этом почитать? (просто я до этого имел дело только с аvr)


Читайте AN2659 от ST
Doka
эк вас в дебри понесло..
вроде топикстартер спрашивал про data EEPROM (не про Flash program memory)
ukpyr
перед записью нужно снять защиту:
Код
FLASH_DUKR = 0xAE;
FLASH_DUKR = 0x56;
проще всего писать побайтно - простым присваиванием:
Код
@eeprom e1;

e1 = 0x5A
_Олег_
Цитата(ukpyr @ Feb 25 2011, 03:55) *
перед записью нужно снять защиту:
Код
FLASH_DUKR = 0xAE;
FLASH_DUKR = 0x56;
проще всего писать побайтно - простым присваиванием:
Код
@eeprom e1;

e1 = 0x5A


Эт в COSMIC не работает, может какие-то настройки линкера нужны?
ukpyr
Цитата
Эт в COSMIC не работает, может какие-то настройки линкера нужны?
у меня почему-то работала двойная запись, то есть последовательно писал в одну ячейку два раза. Почему так - непонятно
_Олег_
Цитата(ukpyr @ Sep 15 2011, 12:20) *
у меня почему-то работала двойная запись, то есть последовательно писал в одну ячейку два раза. Почему так - непонятно


Оказывется ключевым моментом является прописать библиотеу. В опциях проекта на вкладке linker в ячейку Objects прописать либу libl0.sm8
scifi
Я как раз недавно реализовал блочное программирование 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);
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.