Big-mikhael 0 24 сентября, 2010 Опубликовано 24 сентября, 2010 · Жалоба Кто знает как работать с EPPROM на STM8S? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Deka 0 25 сентября, 2010 Опубликовано 25 сентября, 2010 · Жалоба Наверное через регистры... ;) :disco: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Big-mikhael 0 25 сентября, 2010 Опубликовано 25 сентября, 2010 · Жалоба Через какие и как? Интересует на СИ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrd 0 25 сентября, 2010 Опубликовано 25 сентября, 2010 · Жалоба Через какие и как? Интересует на СИ. Сначала открываем Reference manual на семейство STM8S (RM0016) и читаем раздел Flash program memory and data EEPROM (Flash). Для Cosmic и Raisonance открываем help библиотеки периферии и изучаем раздел Flash Examples. Особенность в том, что прежде, чем писать в EEPROM надо последовательно ввести в регистр DUKR два ключа для разблокировки процедуры записи. И еще надо помнить про тактовую частоту (для установки правильного времени доступа). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
7403 0 28 сентября, 2010 Опубликовано 28 сентября, 2010 · Жалоба Через какие и как? Интересует на СИ. в iаr в папке с примерами есть проекты с библиотекой. Там есть файл flash.c с набором соответствующих функций. У меня работают все, кроме функций, работающих с блоками(зависает чип). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
konst11 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 · Жалоба в iаr в папке с примерами есть проекты с библиотекой. Там есть файл flash.c с набором соответствующих функций. У меня работают все, кроме функций, работающих с блоками(зависает чип). Для работы с блоками необходимо копировать исполняемый код в RAM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
7403 0 5 октября, 2010 Опубликовано 5 октября, 2010 · Жалоба Для работы с блоками необходимо копировать исполняемый код в RAM подскажите, где об этом почитать? (просто я до этого имел дело только с аvr) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
konst11 0 7 ноября, 2010 Опубликовано 7 ноября, 2010 · Жалоба подскажите, где об этом почитать? (просто я до этого имел дело только с аvr) Читайте AN2659 от ST Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 4 19 декабря, 2010 Опубликовано 19 декабря, 2010 · Жалоба эк вас в дебри понесло.. вроде топикстартер спрашивал про data EEPROM (не про Flash program memory) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ukpyr 0 24 февраля, 2011 Опубликовано 24 февраля, 2011 (изменено) · Жалоба перед записью нужно снять защиту: FLASH_DUKR = 0xAE; FLASH_DUKR = 0x56; проще всего писать побайтно - простым присваиванием: @eeprom e1; e1 = 0x5A Изменено 24 февраля, 2011 пользователем ukpyr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium 0 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба перед записью нужно снять защиту: FLASH_DUKR = 0xAE; FLASH_DUKR = 0x56; проще всего писать побайтно - простым присваиванием: @eeprom e1; e1 = 0x5A Эт в COSMIC не работает, может какие-то настройки линкера нужны? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ukpyr 0 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба Эт в COSMIC не работает, может какие-то настройки линкера нужны?у меня почему-то работала двойная запись, то есть последовательно писал в одну ячейку два раза. Почему так - непонятно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium 0 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба у меня почему-то работала двойная запись, то есть последовательно писал в одну ячейку два раза. Почему так - непонятно Оказывется ключевым моментом является прописать библиотеу. В опциях проекта на вкладке linker в ячейку Objects прописать либу libl0.sm8 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба Я как раз недавно реализовал блочное программирование 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться