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

 
 
> как записать параметр во Flash МК?
NikP
сообщение May 10 2017, 08:03
Сообщение #1


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

Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944




В процессе разработки появилась идея сохранять параметры (состояние перед выключением устройства) во Flash контроллера. Контроллер Миландровский 1986ВЕ1Т (аналог STM - F103).
В описании МК сказано, что при работе с Flash МК программа из неё выполняться не может, значит надо поместить некий обработчик( загрузчик ) в оперативку , записать то что надо, и снова отдавать управление основной программе.
Из описания МК я понял, что основная программа размещается с адреса 0х00000000 по 0х00100000, а для загрузчика можно использовать адреса 0х20100000 по 0х20104000.

К сожалению, программист из меня , мягко говоря, чуть ниже среднего. Поэтому просьба подсказать следующее:
1. Как можно в Кейле скомпилировать модуль (загрузчик), который можно целиком записать в нужную область SRAM? ( Сделать его как функцию?)
2. Как этот модуль загрузить в нужную область памяти ? ( конкретно - с адреса 0х20100000) и запустить его?
3. Как из модуля передать управление основной программе?
4. Может есть другие варианты решения данной задачи?

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Олег Гаврильченк...
сообщение May 10 2017, 09:07
Сообщение #2


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

Группа: Участник
Сообщений: 177
Регистрация: 10-02-15
Пользователь №: 85 052



Здравствуйте. Я, к сожалению, не работал с МК Миландр, деталей их устройства я не знаю. Но я программирую микроконтроллеры STM ARM ST32F4x и STM32F1x. И для них я я решал ту же задачу, записывал настройки во Flash память. Я опишу, как я делал это у себя. Flash память МК поделена на сектора разного размера(16, 32, 64 Кбайт) Стереть можно только сектор целиком. В Reference Manual не ясно написано, должна ли программа при записи во flash выполняться из SRAM или просто из другого Flash сектора. Я посмотрел примеры от ST, в них в SRAM ничего не записывалось и процедура стирания Flash была записана просто в другой Flash сектор. Я так и делаю у себя и это работает.
То есть, если я стираю/записываю сектор 10, то программа может выполнятся из Flash, но не в секторе 10.
Вот пример того, как я стираю/записываю flash у себя в STM32F4x

CODE
/**
* @brief Запись блока во flash
* @dst Адрес назначения(куда копировать)
* @src Адрес источника(откуда копировать)
* @num Кол-во байт для копирования
* @retval dst
*/
void* flash_memcpy(void* dst, void* src, int num)
{
int i;

irq_disable();

FLASH_Unlock();

for(i = 0; i < num; i++)
{
FLASH_ProgramByte((uint32_t)(dst) + i,
((uint8_t*)src)[i]);
FLASH_WaitForLastOperation();
}

FLASH_Lock();

irq_enable();

return dst;
}

/**
* @brief Стереть содержимое flash-памяти
*/
void flash_erase(void)
{
irq_disable();
FLASH_Unlock();

FLASH_EraseSector(FLASH_Sector_11, VoltageRange_3);

FLASH_Lock();

irq_enable();
}


Если же Вам все же нужно выполнять программу из SRAM, то в Keil проще всего воспользоваться функциональностью scatter/loader, например, как описано вот здесь. http://www.keil.com/support/docs/3723.htm
Go to the top of the page
 
+Quote Post



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

 


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


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