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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Эмуляция EEPROM в первых двух секторах STM32F4, Старт программы с предопределённого адреса
A. Fig Lee
сообщение Aug 30 2013, 10:39
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



С огнем играете. Сколько там циклов перезаписи?
У нас в старых STM32F107 уже ошибки записи выдает.
Если EEPROM интенсивно не использовать, то ничего, конечно..


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 30 2013, 12:03
Сообщение #17


Гуру
******

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



Цитата(vlad_new @ Aug 30 2013, 14:18) *
Я тут то же ковырялся с дырой для флеша в кейле. Ничего у меня с дыркой в регионе не вышло.

Дык Кейл этого и не умеет. Там нужно руками раскладывать секции сверху и снизу от дырки.
Go to the top of the page
 
+Quote Post
Rash
сообщение Oct 7 2014, 06:41
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Цитата(AlexUT4 @ Aug 28 2013, 22:40) *
Большое спасибо за наводку....


сделал по такому примеру, всё работает, но есть следующий вопрос:
При такой записи регион с дырой получается, но есть одно НО, вектора прерываний разместятся с адреса 0x08000000, а код весь будет размещён после выделенных регионом под EEPROM. Т.е. такой записи (где используются сектора 1 и 2) код разместится с адреса 0x0800c000, а если назначить для эмуляции EEPROM сектора 2 и 3, то код разместится уже по адресу 0x08010000. Т.о. получается, если делать дыру во флеши для EEPROM надо использовать всегда сектора начиная с 1-го иначе будет потеря секторов флеши. И также 0 сектор тоже практически будет потерян по памяти, т.к. в нём кроме таблицы прерываний ничего не размещается (т.е. для эмуляции EEPROM будут потеряны 3 сектора, 2 сектора на EEPROM, а один будет гулять практически пустым). Можно ли это как то обойти, может ещё нужно в линкере чего-то прописывать? Прибивать ф-ции или массивы констант по конкретным адресам желания нет.
В данном проект памяти хватает и потеря 3-х секторов по 16К не критична, но на будущее хочется уметь использовать всю память

Сообщение отредактировал IgorKossak - Oct 7 2014, 14:11
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 7 2014, 09:34
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Rash @ Oct 7 2014, 09:41) *
И также 0 сектор тоже практически будет потерян по памяти, т.к. в нём кроме таблицы прерываний ничего не размещается
Мне сейчас неохота рыть документацию, но у F1xx при включении защиты от чтения первые два сектора автоматически защищаются и от записи. И переписать их можно только стерев весь кристалл. Здесь нет чего-то подобного? Как бы не получилось, что включив защиту от чтения вы поломаете работу этой эмулированной ЭСППЗУ. А в целом я бы отдал нулевой сектор загрузчику и забыл про него, а программу размещал бы целым куском уже после секторов эмуляции ЭСППЗУ.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
adnega
сообщение Oct 7 2014, 09:48
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Сергей Борщ @ Oct 7 2014, 13:34) *
А в целом я бы отдал нулевой сектор загрузчику и забыл про него, а программу размещал бы целым куском уже после секторов эмуляции ЭСППЗУ.

+1. Собственно, с такой картой распределения секторов ничего лучше и не придумаешь.

Код
MEMORY
{
  RAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 128K
  CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
  BKPSRAM(rw!x): ORIGIN = 0x40024000, LENGTH = 4K
  
  BOOTLOADER (rx) : ORIGIN = 0x08000000, LENGTH = 16K
  EEPROM (rw!x) : ORIGIN = 0x08004000, LENGTH = 16K + 16K
  IMAGE (rw!x) : ORIGIN = 0x0800C000, LENGTH = 16K + 64K
  FLASH (rwx) : ORIGIN = 0x08020000, LENGTH = 128K
}
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 7 2014, 10:14
Сообщение #21


Гуру
******

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



Цитата(Rash @ Oct 7 2014, 10:41) *
Можно ли это как то обойти, может ещё нужно в линкере чего-то прописывать? Прибивать ф-ции или массивы констант по конкретным адресам желания нет.

ИМХО, такой фичи нет.

Цитата(Rash @ Oct 7 2014, 10:41) *
В данном проект памяти хватает и потеря 3-х секторов по 16К не критична, но на будущее хочется уметь использовать всю память

Ну так и не надо дёргаться раньше времени. Страшный день, когда кончится память, скорее всего никогда не наступит. Кроме того, как известно, "преждевременная оптимизация - корень всех зол".
А если когда-нибудь действительно припрёт, то ручками разложить секции не так уж и сложно.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Oct 7 2014, 17:58
Сообщение #22


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Сергей Борщ @ Oct 7 2014, 13:34) *
...я бы отдал нулевой сектор загрузчику и забыл про него, а программу размещал бы целым куском уже после секторов эмуляции ЭСППЗУ.


ещё можно добавить, что если обернуть функциями по динамичеки равномерному заполнению и стиранию этой эмулированной эспэпэзэу, то
мелкие сегменты в 16килл идеально ложаться на чанки оперирования этой памятью, при данном распределении.
Go to the top of the page
 
+Quote Post
Rash
сообщение Oct 8 2014, 14:17
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231




не много не по секторам, но про эмуляцию.

Модернизировал то, что написано STM, добавил возможность писать не только 16, но и 8 и 32 битные данные (выбирается через дефайн).
И запустил их тестовый проект. Так вот, при записи 16 битных и 32 битных данных, проблем нет, а при записи 8-ми битных данных при переходе с одной страницы на другую страницу, заполненная страница не всегда полностью очищается, что приводит к дальнейшему неверному чтению данных.
Это происходит в ф-ции EE_PageTransfer(...) , где страница очищается ф-цией
Код
flash_status = FLASH_EraseSector(old_page_Id, VOLTAGE_RANGE);

Если ставить точки останова в ф-ции EE_PageTransfer(...), не важно в каких местах, то такой проблемы нет.
Другой вариант решения этой проблемы добавлением инструкции __DSB() или задержки (хватило где-то 35 NOPов)
Код
static uint16_t EE_PageTransfer(uint32_t v_addr, uint32_t data)
{
                                 ...
  flash_status = FLASH_EraseSector(old_page_Id, VOLTAGE_RANGE);
  __DSB();
                                 ...
}

либо отредактировать FLASH_EraseSector() в конце дописать __DSB(), на всякий случай
Go to the top of the page
 
+Quote Post

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

 


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


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