реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Кто знает как работать с EPPROM на STM8S, Кто знает как работать с EPPROM на STM8S
big-mikhael
сообщение Sep 24 2010, 13:44
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 11-03-09
Пользователь №: 45 990



Кто знает как работать с EPPROM на STM8S?
Go to the top of the page
 
+Quote Post
Deka
сообщение Sep 25 2010, 16:22
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 248
Регистрация: 18-07-06
Из: Сочи
Пользователь №: 18 890



Наверное через регистры... wink.gif disco.gif
Go to the top of the page
 
+Quote Post
big-mikhael
сообщение Sep 25 2010, 17:18
Сообщение #3





Группа: Новичок
Сообщений: 9
Регистрация: 11-03-09
Пользователь №: 45 990



Через какие и как? Интересует на СИ.
Go to the top of the page
 
+Quote Post
petrd
сообщение Sep 25 2010, 19:42
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 3-06-08
Пользователь №: 38 012



Цитата(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 два ключа для разблокировки процедуры записи. И еще надо помнить про тактовую частоту (для установки правильного времени доступа).
Go to the top of the page
 
+Quote Post
A.l.e.x.
сообщение Sep 28 2010, 20:18
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 69
Регистрация: 4-02-08
Из: Винница
Пользователь №: 34 732



Цитата(big-mikhael @ Sep 25 2010, 19:18) *
Через какие и как? Интересует на СИ.

в iаr в папке с примерами есть проекты с библиотекой. Там есть файл flash.c с набором соответствующих функций. У меня работают все, кроме функций, работающих с блоками(зависает чип).
Go to the top of the page
 
+Quote Post
vika1
сообщение Sep 30 2010, 16:19
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 8-11-05
Пользователь №: 10 601



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

Для работы с блоками необходимо копировать исполняемый код в RAM
Go to the top of the page
 
+Quote Post
A.l.e.x.
сообщение Oct 5 2010, 17:30
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 69
Регистрация: 4-02-08
Из: Винница
Пользователь №: 34 732



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

подскажите, где об этом почитать? (просто я до этого имел дело только с аvr)
Go to the top of the page
 
+Quote Post
vika1
сообщение Nov 7 2010, 19:08
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 8-11-05
Пользователь №: 10 601



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


Читайте AN2659 от ST
Go to the top of the page
 
+Quote Post
Doka
сообщение Dec 19 2010, 17:35
Сообщение #9


Electrical Engineer
******

Группа: СуперМодераторы
Сообщений: 2 163
Регистрация: 4-10-04
Пользователь №: 778



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


--------------------
Блог iDoka.ru
CV linkedin.com/in/iDoka
Sources github.com/iDoka


Never stop thinking...........................
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Feb 24 2011, 23:55
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



перед записью нужно снять защиту:
Код
FLASH_DUKR = 0xAE;
FLASH_DUKR = 0x56;
проще всего писать побайтно - простым присваиванием:
Код
@eeprom e1;

e1 = 0x5A


Сообщение отредактировал ukpyr - Feb 24 2011, 23:56
Go to the top of the page
 
+Quote Post
_Олег_
сообщение Sep 15 2011, 07:17
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 89
Регистрация: 5-10-07
Пользователь №: 31 098



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

e1 = 0x5A


Эт в COSMIC не работает, может какие-то настройки линкера нужны?
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Sep 15 2011, 08:20
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



Цитата
Эт в COSMIC не работает, может какие-то настройки линкера нужны?
у меня почему-то работала двойная запись, то есть последовательно писал в одну ячейку два раза. Почему так - непонятно
Go to the top of the page
 
+Quote Post
_Олег_
сообщение Sep 15 2011, 10:06
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 89
Регистрация: 5-10-07
Пользователь №: 31 098



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


Оказывется ключевым моментом является прописать библиотеу. В опциях проекта на вкладке linker в ячейку Objects прописать либу libl0.sm8
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 15 2011, 11:12
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Я как раз недавно реализовал блочное программирование 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);
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 01:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01451 секунд с 7
ELECTRONIX ©2004-2016