Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Проблемы с записью во 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
Сообщения: 992
Откуда: Тула
Попробуйте функциями из стандартной библиотеки.
Только обязательно не забудьте:
  • Поправить дефайны, связанные с тактированием ( 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
Сообщения: 613
Откуда: г. Санкт-Петербург
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
Сообщения: 992
Откуда: Тула
Мы тоже.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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
Сообщения: 992
Откуда: Тула
Выглядит логично, разве что нужно помнить, что Keil стирает всю область основной флеш (где программа). Поэтому после перепрошивки нужно будет дописывать данные, либо перекомпилировать "кейловский прошивальщик" под проект, чтобы он не стирал данные.
Архитектурно, кажется логичнее сделать запись данных внутренними средствами прошивки.

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


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

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


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

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 992
Откуда: Тула
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
Сообщения: 992
Откуда: Тула
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
А, понял. Спасибо! Буду пробовать)


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

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


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

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


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

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