Миландр
http://forum.milandr.ru/

Проблемы с записью во FLASH
http://forum.milandr.ru/viewtopic.php?f=36&t=3533
Страница 1 из 1

Автор:  Nzx [ 2016-авг-19 13:51 ]
Заголовок сообщения:  Проблемы с записью во FLASH

Здравствуйте!
Необходимо записать данные (обозначим массив Temp[]) во встроенную FLASH-память. Почитал мануал и написал вот такой вот код для выполнения данного действия из ОЗУ:
Код:
MDR_RST_CLK->PER_CLOCK|=(1<<3);
//----------
MDR_EEPROM->KEY=0x8AAA5551;
MDR_EEPROM->CMD=0x01;//           //Regim programmirovaniya
MDR_EEPROM->CMD|=(0<<9);       // IFREN = 0 (dlya osnovnoi pamyati)
MDR_EEPROM->ADR=(0x08000000);
MDR_EEPROM->DI=Temp[0];
MDR_EEPROM->CMD|=(1<<6);       //XE=1
MDR_EEPROM->CMD|=(1<<12);   //PROG=1
sleep(6);
MDR_EEPROM->CMD|=(1<<13);   //NVSTR=1
sleep(11);
MDR_EEPROM->CMD|=(1<<7);      //YE=1
for (iTXCxa=1; iTXCxa<4; iTXCxa++)
{
   sleep(41);
   MDR_EEPROM->CMD|=(0<<7);      //YE=0
   sleep(1);
   MDR_EEPROM->ADR=(0x08000000+iTXCxa*4);
   MDR_EEPROM->DI=Temp[iTXCxa];
   sleep(1);
   MDR_EEPROM->CMD|=(1<<7);
}
//Konec zapisi
sleep(1);
MDR_EEPROM->CMD|=(0<<12);    //PROG=0
sleep(6);
MDR_EEPROM->CMD|=(0<<6);      //XE=0
MDR_EEPROM->CMD|=(0<<13);   //NVSTR=0

      sleep(1);

Помимо мануала, еще посмотрел код программы для прошивки через UART ("1986UARTWSD"), откуда и взял этот "sleep"
Код:
void sleep(int id)
{
   do
   {
    id++;
    id -= 2;
   }
   while (id!=0);
}

Но не совсем уверен, правильно ли это в моем случае (частота работы 96МГц).
Вообщем ничего у меня не вышло (ничего не записывается). Пробовал брать код из UARTWSD, все равно не выходит.
ПОДСКАЖИТЕ ПОЖАЛУЙСТА, ГДЕ ОШИБСЯ/ЧТО НЕ ТАК ПОНЯЛ/КАК БЫТЬ)) Заранее спасибо!!!

Автор:  prostoRoman [ 2016-авг-22 08:25 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

Попробуйте функциями из стандартной библиотеки.
Только обязательно не забудьте:
  • Поправить дефайны, связанные с тактированием ( HSE_Value, FLASH_PROG_FREQ_MHZ (96.0) ) и вызвать ф-цию SystemCoreClockUpdate(); после инициализации тактирования.
  • Отключить все прерывания __disable_irq();
  • Линковать библиотечный файл в ОЗУ.
Код:
   __disable_irq();
   EEPROM_ErasePage(0x08000000, EEPROM_Info_Bank_Select);
   for(i=0; i<4096; i+=4) {
      data = p[i/4];
      EEPROM_ProgramWord( i+0x08000000, EEPROM_Info_Bank_Select, data);
   }
   __enable_irq();

Автор:  vasili [ 2016-авг-22 21:08 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

Nzx писал(а):
...
Помимо мануала, еще посмотрел код программы для прошивки через UART ("1986UARTWSD"), откуда и взял этот "sleep"
Код:
void sleep(int id)
{
    do
   {
    id++;
    id -= 2;
   }
   while (id!=0);
}

Но не совсем уверен, правильно ли это в моем случае (частота работы 96МГц).
Вообщем ничего у меня не вышло (ничего не записывается). Пробовал брать код из UARTWSD, все равно не выходит.
ПОДСКАЖИТЕ ПОЖАЛУЙСТА, ГДЕ ОШИБСЯ/ЧТО НЕ ТАК ПОНЯЛ/КАК БЫТЬ)) Заранее спасибо!!!

Этот код для частоты ядра HSI 8 МГц.
Для частоты ядра 96МГц попробуйте
Код:
void sleep(int id)
{
   id *= 12;
   do
   {
    id++;
    id -= 2;
   }
   while (id!=0);
}

Автор:  Nzx [ 2016-авг-26 10:42 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

Спасибо за ответы, но, к сожалению, они пока не принесли нужного результата. Не могу понять в чем дело...

Автор:  prostoRoman [ 2016-авг-26 11:39 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

Мы тоже.

Автор:  Nzx [ 2016-сен-15 15:00 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

А подскажите пожалуйста, правильно ли я понимаю, что для того, чтобы данные хранились во FLASH вместе с рабочей программой нужно:
    1)Подсчитать размеры и того и другого, и исходя из полученных результатов “разделить флэш на две части” (не забыв, что размер основной памяти 128Кбайт)
    2)Установить необходимый диапазон области памяти в компиляторе (для KEIL: Configurate flash tools -> Target -> IROM1, IRAM1) для основной рабочей программы (в случае записи ее через JTAG).
    3)Данные записываются во FLASH из ОЗУ. Для этого нужно через UART-загрузчик соответствующую программу (для записи данных во FLASH) записать в ОЗУ и по RS передать необходимые данные.
Помимо этого, в случае, когда нужно в процессе жизненного цикла программы заменить эти данные (в моем случае возможна такая ситуация, что нужно будет время от времени менять(перезаписывать) данные на те, которые приходят с другого МК по UART), необходимо, чтобы программа для записи так же хранилась во FLASH, а при запуске(или в нужный момент) перезаписывалась в ОЗУ, после чего ей передавалось бы управление.

Автор:  prostoRoman [ 2016-сен-15 15:07 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

Выглядит логично, разве что нужно помнить, что Keil стирает всю область основной флеш (где программа). Поэтому после перепрошивки нужно будет дописывать данные, либо перекомпилировать "кейловский прошивальщик" под проект, чтобы он не стирал данные.
Архитектурно, кажется логичнее сделать запись данных внутренними средствами прошивки.

Автор:  Nzx [ 2016-сен-16 09:22 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

Спасибо. Тогда еще хотелось бы уточнить: есть ли способ передачи управления на Си, или это возможно только на ассемблере?

Автор:  prostoRoman [ 2016-сен-16 12:05 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

Nzx писал(а):
Спасибо. Тогда еще хотелось бы уточнить: есть ли способ передачи управления на Си, или это возможно только на ассемблере?

Управления ф-ции в ОЗУ? Для этого надо чтобы она там была и была правильно скомпилирована. в Keil это решается указанием в свойствах файла размещать полученный из него код в ОЗУ. Остальное приведено выше, никакого ассемблера.

Автор:  Nzx [ 2016-сен-20 11:00 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

Ну я имел в виду то, что мне не совсем понятно, как сделать так, чтобы во время выполнения основной программы (хранящийся на FLASH), периодически запускалась программа из ОЗУ, по завершении которой продолжалась бы работа FLASH программы? Если говорить об ассемблере, то, как я понимаю, это выполнялось бы через go to (или как там правильно, не помню). А в случае с СИ?

Автор:  prostoRoman [ 2016-сен-20 11:27 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

prostoRoman писал(а):
Для этого надо чтобы она там была и была правильно скомпилирована. в Keil это решается указанием в свойствах файла размещать полученный из него код в ОЗУ.

И просто вызываете ф-цию. Все сложности берет на себя компилятор.
Код:
   __disable_irq();
   EEPROM_ErasePage(0x08000000, EEPROM_Info_Bank_Select);
   for(i=0; i<4096; i+=4) {
      data = p[i/4];
      EEPROM_ProgramWord( i+0x08000000, EEPROM_Info_Bank_Select, data);
   }
   __enable_irq();

Сам этот код расположен во флеше, а ф-ции EEPROM_ErasePage() и EEPROM_ProgramWord() -- в ОЗУ, указанным выше способом.

Автор:  Nzx [ 2016-сен-21 08:48 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

А, понял. Спасибо! Буду пробовать)

Автор:  Dimonira [ 2018-май-29 12:39 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

Дошли руки до использования программируемой памяти.
Оказалось, что код из SPL библиотеки MDR32F9Qx_eeprom не попадает в RAM (EXECUTABLE_MEMORY_SECTION), хотя в исходниках вроде как всё предусмотрено.
Выяснилось, что виной тому странное использование символа __GNUC__ препроцессора в заголовочном файле MDR32F9Qx_eeprom.h. В результате мешанины #ifdef/#else и прочего, определение атрибута EXECUTABLE_MEMORY_SECTION пропадало, если в опциях Keil компилятора C/C++ стоит галка "GNU extensions". Если галку снять, то функции попадают в RAM. А всё из-за того, что Keil определяет и __CC_ARM, и __GNUC__ (при наличии галки). Пришлось поправить MDR32F9Qx_eeprom.h. Теперь работает. Было так:
Код:
#if defined ( __ICCARM__ )
   #define __RAMFUNC      __ramfunc
#elif defined (__CMCARM__)
  #define __RAMFUNC       __ramfunc
#elif defined ( __CC_ARM )
  #define __RAMFUNC
#elif defined ( __GNUC__ )
  #define __RAMFUNC       __attribute__((section(".ramfunc")))
#endif

#if defined ( __GNUC__ )
  #define __RAMFUNCSECTION
#else
  #define __RAMFUNCSECTION  __attribute__((section("EXECUTABLE_MEMORY_SECTION")))
#endif

Сделал так:
Код:
#if defined ( __ICCARM__ )
  #define __RAMFUNC      __ramfunc
  #define __RAMFUNCSECTION
#elif defined (__CMCARM__)
  #define __RAMFUNC       __ramfunc
  #define __RAMFUNCSECTION
#elif defined ( __CC_ARM )
  #define __RAMFUNC
  #define __RAMFUNCSECTION  __attribute__((section("EXECUTABLE_MEMORY_SECTION")))
#elif defined ( __GNUC__ )
  #define __RAMFUNC       __attribute__((section(".ramfunc")))
  #define __RAMFUNCSECTION
#endif

Автор:  stranderer [ 2018-июл-13 13:23 ]
Заголовок сообщения:  Re: Проблемы с записью во FLASH

FLASH-память записывается пословно, а стирается постранично. Если Вам нужно некий массив держать во флеш-памяти, опишите его в программе как массив констант, расположенный с начала страницы, следующей после программы (можно взять последнюю из 8 имеющихся страниц). Функция, перезаписывающая эти данные (с предварительным стиранием страницы) должна быть описана как работающая в ОЗУ. Сам я работаю в Фитон-овской среде разработки, но думаю, что в Кейл-е тоже есть такие возможности

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/