Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Эмуляция EEPROM STM32 (an2594) кто пользовался? Подключил, компилируется
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
smk
Прошу подсказать где в памяти искать записанные значения и как правильно пользоваться штатными функциями EE_WriteVariable и EE_ReadVariable ? Прежде чем зашивать в железо решил посмотреть в симуляторе как оно работает. Компилируется и симулируется без замечаний, но я не могу найти куда оно все пишет? По указанным адресам значатся нули. Как писать и читать? Ну например записать/прочитать переменную размером в байт / два байта ? Массив char или int ? Кто пользовался, подскажите пожалуйста. Спасибо.
scifi
А разве запись в флэш симулируется? Мне всегда казалось, что нет.
smk
Пишется в память. Память можно посмотреть. Думаю все длжно работать.
scifi
Ну не знаю. Я обычно сам реализую эмуляцию EEPROM. Хотя на первых порах почерпнул несколько идей из ST App. Notes.
А что мешает пройти по программе по шагам и проследить, в каком месте происходит запись в флэш? Тогда все адреса и данные сразу найдутся.
smk
Цитата(scifi @ Apr 7 2012, 14:03) *
Ну не знаю. Я обычно сам реализую эмуляцию EEPROM. Хотя на первых порах почерпнул несколько идей из ST App. Notes.
А что мешает пройти по программе по шагам и проследить, в каком месте происходит запись в флэш? Тогда все адреса и данные сразу найдутся.

Ходил уже. Находится либо программный код либо нули.

А как Вы делаете чтение/запись и резервируете место под эмуляцию?
scifi
Цитата(smk @ Apr 7 2012, 16:47) *
Ходил уже. Находится либо программный код либо нули.

Значит плохо искали. Или запись в флэш всё-таки не симулируется.

Цитата(smk @ Apr 7 2012, 16:47) *
А как Вы делаете чтение/запись и резервируете место под эмуляцию?

Чтение флэш тривиально. Запись - в соответствии с документом от ST под названием "Programming Manual". Там описаны регистры флэш и процедуры стирания и записи.
Резервирование тоже тривиально: в настройках линкера делаем так, чтобы код программы не размещался в двух секторах. Эти секторы и используем для эмуляции EEPROM.
smk
Подскажите, в каком именно месте настроек линкера что нужно поменять чтобы сектора были пусты? У меня целевой контроллер с 256 кбайт, а памяти нужно выделить около 20 кбайт. Это как-то возможно? Может сначала объявить массив, посмотреть куда ляжет, а потом уже обвесить чтением/записью?

Цитата(scifi @ Apr 8 2012, 00:34) *
Чтение флэш тривиально.


Цитата
unsigned int *ip;
unsigned int a, b, c;

*ip = 0x08000000;
a=*ip;


Тривиально это так ?

scifi
Цитата(smk @ Apr 8 2012, 09:19) *
Подскажите, в каком именно месте настроек линкера что нужно поменять чтобы сектора были пусты?

Зависит от линкера (яр, кейл или что-то ещё). См. мануал, нет желания его для вас толковать.

Цитата(smk @ Apr 8 2012, 09:19) *
Тривиально это так ?

Рядом с вашим ником стоит надпись "профессионал" и 1400 сообщений. Но вопрос откровенно начинающий. Я в непонятках.
Тривиально - это так:
Код
unsigned int *ip;
unsigned int a, b, c;

ip = (unsigned int*)0x08000000;
a=*ip;
smk
Цитата(scifi @ Apr 8 2012, 21:43) *
Рядом с вашим ником стоит надпись "профессионал" и 1400 сообщений. Но вопрос откровенно начинающий. Я в непонятках.

Ну можно исправить на "начинающий". Корона не упадет. В любом случае спасибо за потраченное на меня время.
smk
Как выяснилось, Keil действительно не показывает в симуляторе запись во flash. Уж не знаю почему они так сделали, но собственно сам программный код видно, а записанное из программы нет. И при попытке чтения из программы (в симуляторе) тоже имеем нули, каковые и отображаются симулятором по соответствующим адресам. В железе же работает и чтение и запись. Привожу код, может кому сэкономлю пару минут...

CODE
unsigned int Read32FromFlash (unsigned int address)
{
unsigned int *ip;
unsigned int a;
ip = (unsigned int*)address;
a=*ip;
return a;
}


void FLASH32_Unlock(void)
{
FLASH->KEYR = ((uint32_t)0x45670123);
FLASH->KEYR = ((uint32_t)0xCDEF89AB);
}

void FLASH32_Lock(void)
{
FLASH->CR |= FLASH_CR_LOCK;
}


void FLASH_Program32Word(unsigned int Address, unsigned int Data)
{
__IO uint32_t tmp = 0;
while ((FLASH->SR & FLASH_SR_BSY) != 0 );
FLASH->CR |= FLASH_CR_PG; /* Programm the flash */
//FLASH->CR |= (0x00000001);
*(__IO uint16_t*)Address = (uint16_t)Data;
while ((FLASH->SR & FLASH_SR_BSY) != 0 );
tmp = Address + 2;
*(__IO uint16_t*) tmp = Data >> 16;
while ((FLASH->SR & FLASH_SR_BSY) != 0 );
FLASH->CR &= ~FLASH_CR_PG;
}
Firer
SMK привет спасибо мне пригодилось!
А по каким адресам данные в флэш храните?
переменные объявляете с явным указанием адреса ( @ работает в keil?)
Или как-то по-другому?
smk
Цитата(Firer @ Apr 17 2012, 13:07) *
SMK привет спасибо мне пригодилось!
А по каким адресам данные в флэш храните?
переменные объявляете с явным указанием адреса ( @ работает в keil?)
Или как-то по-другому?


Переменные не объявляю. При написании программ резервируется страница и в ней хранится все что нужно. Помечаете (на бумажке, например) для себя чтоб не забыть где что лежит. Этот способ хорош только для очень редко меняющихся переменных поскольку сокращает ресурс FLASH. На этой почве сделал библиотечку работы с AT24C256 или другой с диапазоном адресов 2 байта. Мне ко всему прочему надо более 10 кбайт хранить.

toweroff
Цитата(smk @ Apr 18 2012, 17:18) *
Помечаете (на бумажке, например) для себя чтоб не забыть где что лежит.

ой
а чего бы структуру со всеми данными не описать и потом спокойно по ее размеру записывать? не STM, а LPC пользуюсь, там чуть геморройнее, но тем не менее
smk
Цитата(toweroff @ Apr 18 2012, 22:53) *
ой
а чего бы структуру со всеми данными не описать и потом спокойно по ее размеру записывать? не STM, а LPC пользуюсь, там чуть геморройнее, но тем не менее

Да без проблем. Дело вкуса. Там другое важно, а именно то, что для того чтобы перезаписать 1 байт стирать прийдется всю страницу, а єто 1 кбай или 2.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.