Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-сен-23 09:52

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Проблемы с записью во FLASH
СообщениеДобавлено: 2016-авг-19 13:51 
Не в сети

Зарегистрирован: 2015-янв-19 16:23
Сообщения: 16
Здравствуйте!
Необходимо записать данные (обозначим массив 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, все равно не выходит.
ПОДСКАЖИТЕ ПОЖАЛУЙСТА, ГДЕ ОШИБСЯ/ЧТО НЕ ТАК ПОНЯЛ/КАК БЫТЬ)) Заранее спасибо!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2016-авг-22 08:25 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1141
Откуда: Тула
Попробуйте функциями из стандартной библиотеки.
Только обязательно не забудьте:
  • Поправить дефайны, связанные с тактированием ( 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();

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2016-авг-22 21:08 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 666
Откуда: г. Санкт-Петербург
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);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2016-авг-26 10:42 
Не в сети

Зарегистрирован: 2015-янв-19 16:23
Сообщения: 16
Спасибо за ответы, но, к сожалению, они пока не принесли нужного результата. Не могу понять в чем дело...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2016-авг-26 11:39 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1141
Откуда: Тула
Мы тоже.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2016-сен-15 15:00 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2016-сен-15 15:07 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1141
Откуда: Тула
Выглядит логично, разве что нужно помнить, что Keil стирает всю область основной флеш (где программа). Поэтому после перепрошивки нужно будет дописывать данные, либо перекомпилировать "кейловский прошивальщик" под проект, чтобы он не стирал данные.
Архитектурно, кажется логичнее сделать запись данных внутренними средствами прошивки.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2016-сен-16 09:22 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2016-сен-16 12:05 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1141
Откуда: Тула
Nzx писал(а):
Спасибо. Тогда еще хотелось бы уточнить: есть ли способ передачи управления на Си, или это возможно только на ассемблере?

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

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2016-сен-20 11:00 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2016-сен-20 11:27 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1141
Откуда: Тула
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() -- в ОЗУ, указанным выше способом.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2016-сен-21 08:48 
Не в сети

Зарегистрирован: 2015-янв-19 16:23
Сообщения: 16
А, понял. Спасибо! Буду пробовать)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2018-май-29 12:39 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 39
Дошли руки до использования программируемой памяти.
Оказалось, что код из 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с записью во FLASH
СообщениеДобавлено: 2018-июл-13 13:23 
Не в сети
Аватара пользователя

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

_________________
Странник


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB