Jump to content

    

Recommended Posts

Ну мне сыкотно так сразу код залить попробывать (всё же так и завалить камень можно).

 

DINT; // выкл. все прерывания
Uint16  val[SIZE]; // константа которая перезаписывается во flash
Uint16  i;
Uint16  Status;

typedef struct {
    Uint32  FirstFailAddr;
    Uint16  ExpectedData;
    Uint16  ActualData;
}FLASH_ST;
FLASH_ST FlashStatus;

Status = Flash_Erase(SECTORH,&FlashStatus);
if(Status != 0) 
{
       ESTOPO;
} 


Status = Flash_Program((Uint16 *) 0x3D8000,val,SIZE,&FlashStatus); // 0x3D8000 - адрес начала секции H
if(Status != 0) 
{
    ESTOPO;
}

  
Status = Flash_Verify((Uint16 *) 0x3D8000,val,SIZE,&FlashStatus);
if(Status != 0) 
{
    ESTOPO;
}  

EINT;

 

Весь код выше в секции ramfank (то есть копируется в ОЗУ) Выполняется по поднятию какого нибудь флага (моя переменная).

Все остальные настройки (такие как конфигурация тактирования) выполнены ранее так как в качестве скелета взял работающий исходник.

 

Что еще посоветуете?

 

Руки зачесались, попробывал, всё работает. Попробывал и не помещать в ОЗУ этот код, всётаки манипуляции с той часть flash где находиться код не произвожу, тоже работает.

 

Щас мысль: может и прерывания запрещать в данном случае нет смысла?

Edited by ELEKTROS

Share this post


Link to post
Share on other sites

Главное с адресами ничего не напутать, чтоб в CSM ничего не записать, а так больше-то и нечего бояться.

На счёт прерываний, в памяти сидит, что их нужно выключать во время запися внутренней флэш-памяти.

 

Попробывал и не помещать в ОЗУ этот код, всётаки манипуляции с той часть flash где находиться код не произвожу, тоже работает.

В ОЗУ помещать необходимо, если только всё стереть хотите, если участки, где нет кода программы, то и нет необходимости.

 

Share this post


Link to post
Share on other sites
Подскажите, сейчас мне не совсем загрузчик нужен, но работа тоже с flash (камень f28069).

Выделил я свою секцию в *.cmd, для сохранения констант:

mydata_servise       : > FLASHH,     PAGE = 0

попробывал со структурой не получается, щас пробую хотябы с одной переменной, вот так пишу в файле с переменными

#pragma DATA_SECTION(wer, "mydata_servise");
      volatile Uint16 wer=3;

 

Потом смотрю в отладке адрес этой переменной 0x3D8000 как бы правильно, но значение её 0xFFFF. Секцию H использую только для этого. Что еще объявить чтобы по этому адресу появилось присвоенное значение?

Еще интересно если убрать в конфигурации загрузчика галочку на секции H ничего не происходит, если же галочку убрать на других секциях где код находиться, то загрузчик ругается и не прошивает.

 

Для переменных нужно создавать не в

mydata_servise       : > FLASHH,     PAGE = 0

а, в RAM выделить также микро-секцию. я делал так, у себя в .cmd "отрезал" мелкие кусочки,

Просто к сведению, там ведь можно не только склеивать, но и обрезать.

volatile это совсем с другого предназначения, и он тут неуместен.

Для явного указания месторасположения в флеше достаточно указать const. (о, вам там кстати ответили тоже самое)

 

 

Когда например используется #pragma DATA_SECTION , то нужно указывать не переменную, а функцию, например:

#pragma DATA_SECTION(wer, "mydata_servise");
      Uint16 wer (Uint16 *datain)

 

Пишу на память(код на работе), могу гдето описку допустить, но думаю смысл вы поняли.

 

Щас мысль: может и прерывания запрещать в данном случае нет смысла?

Ух, не советовал бы, я наексперементировался... кстати при таймере в прерывании еще иногда работает, и даже иногда пишет верно, но зачастую с сбоями.

А вот если включить прерывание в АЦП, то вообще, только сбои при записи.

Короче я после детальных эксперементов решил всё таки прекратить баловаться с прерываниями.

Писать нужно только данные которые находятся в ОЗУ. В теории можно с секции которая не стирается, но у меня были какие то там сбои, уже точно не помню что именно.

Share this post


Link to post
Share on other sites

Насчёт прерываний, не использую в моменты стирания, программирования. Насчёт секция для функций обозначается как CODE_SECTION. DATA_SECTION для данных. У меня структура данных с кучей переменных, одна такая переменная в RAM заведена, а одна типа const во FLASHH. При запуске всего кода структура из FLASHH копируется в RAM функцией memcopy. сохраняется во FLASHH впринципе всё кодом который я приводил выше.

 

Для явного указания месторасположения в флеше достаточно указать const это я понял уже давно, но чтобы конкретное место, знаю только способ через секцию так как я указал выше.

 

Щас уже в отпуск ушёл, но проблема непонятная осталась, а имено не всегда API функции выполняются удачно, процентов 60 случаев все три API функции "долго" весят, а потом выдают неудачный результат. Пробывал подождать 0.1 секунды после выполнения DINT, всё равно тоже самое. Функции API копирую в RAM предварительно, но разницы что копирую что нет, не заметил.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this