Перейти к содержанию
    

Запись во флэш mb90f474l из программы

Есть сабжевый контроллер. Один из секторов внутренней флэш памяти хочу использовать для сохранения пользовательских данных. Процедуру записи во флэш взял из примеров от fujitsu. Контроллер на данной процедуре периодически подвисает. Т.е. может и нормально прошить если функцию немного погонять, но обычно виснет. Ниже исходник функции с выводом отладочной инфы. Виснет после 4.

/* Flash Memory write function, writes a buffer (Buffer_Add) to the Flash memory, size is number of words */
__near UINT8 Flash_Write(__far UINT16 *Flash_Add, UINT16 *Buffer_Add, INT16 numwords) {

  INT16 flag;  /* flag to indicate end of Flash memory write cycle */
  
////
UINT32 f = (UINT32)Flash_Add;
UINT32 b = (UINT32)Buffer_Add;
puthex(f>>24);puthex(f>>16);puthex(f>>8);puthex(f);puts("\n\r");
puthex(b>>24);puthex(b>>16);puthex(b>>8);puthex(b);puts("\n\r");
puthex(numwords>>8);puthex(numwords);puts("\n\r");

  __DI();
  if(FMCS_RDY == 0)Read_Reset();
  
  FMCS_WE = 1; /* enable write access to Flash memory */

  while (numwords >0) {
        flag=0;
////
puts("1");
        *SEQ_AAAA = 0xAA; /* unlock sequence for Flash memory write */
////
puts("2");
        *SEQ_5554 = 0x55;
////
puts("3");
        *SEQ_AAAA = 0xA0;
////
puts("4");
        *Flash_Add = *Buffer_Add;
////
puts("5");
        
        while (flag == 0) {
               if((*Flash_Add & 0x0080) == (*Buffer_Add & 0x0080)) { /* write cycle finished succesfully? */
                  flag = 1; 
                  numwords--;
                  Flash_Add++;
                  Buffer_Add++;
               }

               else {
                  if((*Flash_Add & 0x0020) == 0x0020) { /* time limit exceeded? */
                     if((*Flash_Add & 0x0080) == (*Buffer_Add & 0x0080)) { /* write cycle finished succesfully? */
                        flag = 1; 
                        numwords--;
                        Flash_Add++;
                        Buffer_Add++;
                     }

                     else {
                        flag = 2;
                        Read_Reset();
                        FMCS_WE = 0; /* disable Flash write */ 
                        __EI();
                        return(2);   /* return value 2, write buffer aborted due to timeout error */
                     }
                  }
               }
        }
        
  }  
  
  FMCS_WE = 0; /* disable Flash write */
  __EI();
  return(3);   /* return value 3, write buffer finished successfully */
}

 

Вывод в консоль:

00FF8000
000022EC
0046
1234

 

PS: Watchdog отключен.

Что может быть?

PS2: Тут вдруг подумалось, а не может ли это быть из-за того, что контроллер 474l работает на 16МГц (4 кварц * 4 множитель)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня аналогичная проблема, программа "зависает"/зацикливается на проверке выполнения записи. Пока еще не нашел причину. Контроллер тоже работает на 16 МГц.

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

1. Код программы записи должен находиться в ОЗУ.

2. В Start.asm - включить RAM-CODE ON (пункт 4.6/если не ошибаюсь).

3. Функция puts тоже должна быть в RAM, не использовать прерываний.

Если уже разобрался почему не пишет, опиши, пожайлуста, это в форуме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если уже разобрался почему не пишет, опиши, пожайлуста, это в форуме.

Покажите листинг файла, в котором производится запись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PS: Watchdog отключен.

Что может быть?

PS2: Тут вдруг подумалось, а не может ли это быть из-за того, что контроллер 474l работает на 16МГц (4 кварц * 4 множитель)?

Все работает на всех частотах и с WDT. За примеры надо брать исходники bootloader.

 

2. В Start.asm - включить RAM-CODE ON (пункт 4.6/если не ошибаюсь).

Это нереально, сами посудите... прога стартует во Flash, а стартовый код кем-то до этого должен быть закинут в RAM.

 

3. Функция puts тоже должна быть в RAM, не использовать прерываний.

Совсем не обязательно, в RAM должны быть только функции по работе с FLASH (запись слова, стирание сектора). Эти операции должны быть атомарны, из них никаких выводов делать нельзя, только через возвращаемый параметр или т.п.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это нереально, сами посудите... прога стартует во Flash, а стартовый код кем-то до этого должен быть закинут в RAM.

Имхо, тут имеется ввиду, что starup должен дополнительно выполнить копирование в рам нужных функций, объявленых в с атрибутом RAM_CODE (могу путать уже в названиях за давностью)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имхо, тут имеется ввиду, что starup должен дополнительно выполнить копирование в рам нужных функций, объявленых в с атрибутом RAM_CODE (могу путать уже в названиях за давностью)

Не обязательно это делать в startup, можно делать явно своей функцией, на первых шагах это надежнее.

И такой вариант есть в примерах (можно смотреть на примеры для других МК).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...