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

 
 
 
Reply to this topicStart new topic
> Эмуляция EEPROM STM32 (an2594) кто пользовался? Подключил, компилируется, подскажите как писать/читать теперь?
smk
сообщение Apr 6 2012, 18:17
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Прошу подсказать где в памяти искать записанные значения и как правильно пользоваться штатными функциями EE_WriteVariable и EE_ReadVariable ? Прежде чем зашивать в железо решил посмотреть в симуляторе как оно работает. Компилируется и симулируется без замечаний, но я не могу найти куда оно все пишет? По указанным адресам значатся нули. Как писать и читать? Ну например записать/прочитать переменную размером в байт / два байта ? Массив char или int ? Кто пользовался, подскажите пожалуйста. Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 6 2012, 19:53
Сообщение #2


Гуру
******

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



А разве запись в флэш симулируется? Мне всегда казалось, что нет.
Go to the top of the page
 
+Quote Post
smk
сообщение Apr 7 2012, 04:29
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Пишется в память. Память можно посмотреть. Думаю все длжно работать.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 7 2012, 11:03
Сообщение #4


Гуру
******

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



Ну не знаю. Я обычно сам реализую эмуляцию EEPROM. Хотя на первых порах почерпнул несколько идей из ST App. Notes.
А что мешает пройти по программе по шагам и проследить, в каком месте происходит запись в флэш? Тогда все адреса и данные сразу найдутся.
Go to the top of the page
 
+Quote Post
smk
сообщение Apr 7 2012, 12:47
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(scifi @ Apr 7 2012, 14:03) *
Ну не знаю. Я обычно сам реализую эмуляцию EEPROM. Хотя на первых порах почерпнул несколько идей из ST App. Notes.
А что мешает пройти по программе по шагам и проследить, в каком месте происходит запись в флэш? Тогда все адреса и данные сразу найдутся.

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

А как Вы делаете чтение/запись и резервируете место под эмуляцию?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 7 2012, 21:34
Сообщение #6


Гуру
******

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



Цитата(smk @ Apr 7 2012, 16:47) *
Ходил уже. Находится либо программный код либо нули.

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

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

Чтение флэш тривиально. Запись - в соответствии с документом от ST под названием "Programming Manual". Там описаны регистры флэш и процедуры стирания и записи.
Резервирование тоже тривиально: в настройках линкера делаем так, чтобы код программы не размещался в двух секторах. Эти секторы и используем для эмуляции EEPROM.
Go to the top of the page
 
+Quote Post
smk
сообщение Apr 8 2012, 05:19
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Подскажите, в каком именно месте настроек линкера что нужно поменять чтобы сектора были пусты? У меня целевой контроллер с 256 кбайт, а памяти нужно выделить около 20 кбайт. Это как-то возможно? Может сначала объявить массив, посмотреть куда ляжет, а потом уже обвесить чтением/записью?

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


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

*ip = 0x08000000;
a=*ip;


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



--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 8 2012, 18:43
Сообщение #8


Гуру
******

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



Цитата(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;
Go to the top of the page
 
+Quote Post
smk
сообщение Apr 9 2012, 05:12
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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

Ну можно исправить на "начинающий". Корона не упадет. В любом случае спасибо за потраченное на меня время.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
smk
сообщение Apr 12 2012, 08:40
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Как выяснилось, 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;
}


Сообщение отредактировал IgorKossak - Apr 19 2012, 08:14
Причина редактирования: [codebox]


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Firer
сообщение Apr 17 2012, 10:07
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 7-01-05
Пользователь №: 1 832



SMK привет спасибо мне пригодилось!
А по каким адресам данные в флэш храните?
переменные объявляете с явным указанием адреса ( @ работает в keil?)
Или как-то по-другому?
Go to the top of the page
 
+Quote Post
smk
сообщение Apr 18 2012, 13:18
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(Firer @ Apr 17 2012, 13:07) *
SMK привет спасибо мне пригодилось!
А по каким адресам данные в флэш храните?
переменные объявляете с явным указанием адреса ( @ работает в keil?)
Или как-то по-другому?


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



--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 18 2012, 19:53
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



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

ой
а чего бы структуру со всеми данными не описать и потом спокойно по ее размеру записывать? не STM, а LPC пользуюсь, там чуть геморройнее, но тем не менее
Go to the top of the page
 
+Quote Post
smk
сообщение Apr 19 2012, 06:39
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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

Да без проблем. Дело вкуса. Там другое важно, а именно то, что для того чтобы перезаписать 1 байт стирать прийдется всю страницу, а єто 1 кбай или 2.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 20:13
Рейтинг@Mail.ru


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