реклама на сайте
подробности

 
 
> работа с внутренней флэш, AT91SAM7X256
Annuta
сообщение Jul 6 2007, 11:16
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 42
Регистрация: 26-04-07
Из: Смоленск
Пользователь №: 27 333



Привет! У меня плата на AT91SAM7x256 - первый раз в жизни пытаюсь работать с внутреней флэш ... 07.gif
вот пишу что-то в память
Код
__ramfunc u32 EFC_WritePage(u32 adr, u32 *pbuf)
{
    unsigned int *pflash;
    unsigned int page;
    unsigned int region;
    unsigned int i;
  
  pflash = (unsigned int *)adr;
  page = (0x00310000)/EFC_PAGE_SIZE;
  region = (page/EFC_PagesInTheLockRegion);

  EFC_Init();

    if (AT91C_BASE_MC->MC_FSR & (region << 16)) {
    // lock set, clear it
    AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 <<16)) | AT91C_MC_FWS_2FWS;
    AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (region << 8 ) |AT91C_MC_FCMD_UNLOCK;
    }
    while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
    
    for (i = 0; i < EFC_PAGE_SIZE_UINT; i++)
    *(pflash + i ) = *(pbuf + i);
    
    AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (page << 8 ) |AT91C_MC_FCMD_START_PROG;
    while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));

  return 1;
}


__ramfunc void EFCWrite(u32 adr, u8 *pbuf, u32 Len, u32 NeedReset)
{
    u32 l;
    l=0;
    while (l<Len) {
    EFC_WritePage(adr, (u32*)&(pbuf[l]));
    l+=EFC_PAGE_SIZE;
    adr+=EFC_PAGE_SIZE;
    }
}


и кусочек xcl файла

Код
//*************************************************************************
// Read-only segments mapped to Flash 256K.
//*************************************************************************
-DROMSTART=00000040
-DROMEND=00030000
//*************************************************************************
// Read/write segments mapped to RAM.
//*************************************************************************
-DRAMSTART=00200000
-DRAMEND=0020FFFF

При попытке что-то записать из памяти стирается прошивка... то стириется то ли затирается - не мгу понять!... Хотя адреса не перекрещеваются... Не понимаю... ЧЕМ это вызвано! smile3046.gif ... и в xcl написано
"Read-Only" ...это значит что я могу только читать -- что надо прописать чтоб можно было и писать ?
Спасибо!

Сообщение отредактировал Annuta - Jul 6 2007, 11:21


--------------------
Из комбинации лени и логики - получается программист! /народная мудрость/
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Angle
сообщение Nov 21 2007, 09:10
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 8-08-07
Из: Екатеринбург
Пользователь №: 29 638



У меня такая проблема не могу записать во внутреннюю флэш.
Контроллер AT91SAM7A3, компилятор Keil.
В настройках проекта Оptions->Target ограничил размер ROM с 0x40000 до 0x30000

Кусок кода
Код
void EFC_Init(void)
{ unsigned long clkus;
    
// Calculate Flash Microsecond Cycle Number - Approximate (no Library Code)
//clkus = (1074*(clk >> 10)) >> 20;            // Master Clock Cycles in 1.0us
  clkus = (1611*(MCK >> 10)) >> 20;            // Master Clock Cycles in 1.5us
   // Set Flash Microsecond Cycle Number
  // Set Flash Waite State to max. (Single Cycle Access at Up to 30 MHz)
  AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN) & (clkus << 16)) | AT91C_MC_FWS_3FWS;
  AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;
}


int EFC_WritePage(DWORD adr, DWORD *pbuf)
{
  
    unsigned int *pflash;
    unsigned int page;
    unsigned int i;  

            
pflash = (unsigned int *)adr;
page = (adr - 0x00100000)/AT91C_IFLASH_PAGE_SIZE;
          
AT91C_BASE_MC->MC_FCR = AT91C_MC_CORRECT_KEY | AT91C_MC_FCMD_UNLOCK |AT91C_MC_PAGEN & (page << 8));
// Wait until the end of Command
while ((AT91C_BASE_MC->MC_FSR & AT91C_MC_EOL) != AT91C_MC_EOL);

for (i = 0; i <AT91C_IFLASH_PAGE_SIZE/4; i++)   *(pflash + i ) = *(pbuf + i);      

AT91C_BASE_MC->MC_FCR = AT91C_MC_CORRECT_KEY | AT91C_MC_FCMD_START_PROG |(AT91C_MC_PAGEN & (page << 8));

  // Wait until the end of Command
  while ((AT91C_BASE_MC->MC_FSR & AT91C_MC_EOP) != AT91C_MC_EOP);

// Check for Errors
  if (AT91C_BASE_MC->MC_FSR & (AT91C_MC_PROGE | AT91C_MC_LOCKE)) return (1);
  return (0);
    }

#define TestAddr AT91C_IFLASH+AT91C_IFLASH_SIZE-AT91C_IFLASH_PAGE_SIZE
BYTE TestEFC(void)
{
DWORD buf1[256];
  int i;
  BYTE result;
  for(i=1;i<=63;i++) buf1[i]=i;
  EFC_Init();  
  result=(BYTE)EFC_WritePage((DWORD)TestAddr,(DWORD*)buf1);
  return     result;
}

Прогамма зависает после выполнения строки кода
Код
while ((AT91C_BASE_MC->MC_FSR & AT91C_MC_EOL) != AT91C_MC_EOL);

В чем может быть причина ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 21 2007, 11:20
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Angle @ Nov 21 2007, 11:10) *
Прогамма зависает после выполнения строки кода
Код
while ((AT91C_BASE_MC->MC_FSR & AT91C_MC_EOL) != AT91C_MC_EOL);

В чем может быть причина ?
Кусочек, пишущий в FCR и ожидающий после этого готовности FSR должен исполняться из ОЗУ.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Annuta   работа с внутренней флэш   Jul 6 2007, 11:16
- - Timofey   Цитата(Annuta @ Jul 6 2007, 17:16) По ...   Jul 6 2007, 13:40
- - IV_K   в xcl из области ROM исключите страницы, которые п...   Jul 6 2007, 16:04
|- - Timofey   Цитата(IV_K @ Jul 6 2007, 22:04) в xcl из...   Jul 7 2007, 06:19
- - Annuta   Моя переменная #define EFC_PAGE_SIZE 128 Я просто...   Jul 9 2007, 05:27
|- - AlexBoy   Цитата(Annuta @ Jul 9 2007, 08:27) Моя пе...   Jul 9 2007, 09:30
|- - Timofey   Цитата(Annuta @ Jul 9 2007, 11:27) Моя пе...   Jul 9 2007, 09:59
- - Dron_Gus   Цитата(Annuta @ Jul 9 2007, 09:27) Код//*...   Jul 9 2007, 09:34
- - Annuta   Спасибо!! Вроде пишет - не могу провериить...   Jul 9 2007, 13:42
|- - Timofey   Код__ramfunc u32 EFC_ReadPage(u32 adr, u32 *pb...   Jul 9 2007, 16:07
- - Annuta   Происходят странные вещи!.. моя прога на этой ...   Jul 11 2007, 11:37
|- - Timofey   Цитата(Annuta @ Jul 11 2007, 17:37) Проис...   Jul 12 2007, 08:27
- - Annuta   вот написала по вашему совету прогу сначала. Эх......   Jul 12 2007, 10:51
|- - Сергей Борщ   Цитата(Annuta @ Jul 12 2007, 13:51) Она з...   Jul 12 2007, 12:01
- - Dron_Gus   Какой у Вас MCK? Далее EFC_WritePage: зачем Вы выз...   Jul 12 2007, 11:46
- - Dron_Gus   Отладчик в таких ситуациях может только мешать. Со...   Jul 12 2007, 12:12
- - Annuta   Спасибо, Dron_Gus!... да именно из-за этого пл...   Jul 12 2007, 13:33
|- - AlexBoy   Цитата(Annuta @ Jul 12 2007, 16:33) вот -...   Jul 12 2007, 14:59
- - Timofey   В функцию EFCWrite(); передается адрес 0x0030000 -...   Jul 12 2007, 18:21
|- - AlexBoy   Цитата(Timofey @ Jul 12 2007, 21:21) В фу...   Jul 13 2007, 09:27
|- - Timofey   Цитата(AlexBoy @ Jul 13 2007, 15:27) To A...   Jul 13 2007, 09:36
- - Annuta   Получилось!!! Спасибо БОЛЬШОЕ всем за ...   Jul 13 2007, 10:20
- - Waso   Мне в AT91 нужно менять только одно слово во флеше...   Oct 24 2007, 11:00
|- - Сергей Борщ   Цитата(Waso @ Oct 24 2007, 14:00) Мне в A...   Oct 24 2007, 12:02
|- - Waso   2 Сергей Борщ. Смысл понятен, но реализация в прим...   Oct 25 2007, 03:14
|- - Сергей Борщ   Цитата(Waso @ Oct 25 2007, 06:14) Разве ~...   Oct 25 2007, 07:44
- - _dem   сколько же у вас памяти жрет проект, если вы пишет...   Oct 24 2007, 12:20
|- - Сергей Борщ   Цитата(_dem @ Oct 24 2007, 15:20) скольк...   Oct 24 2007, 15:43
- - Angle   Цитата(Сергей Борщ @ Nov 21 2007, 16:20) ...   Nov 21 2007, 11:36
- - Сергей Борщ   Цитата(Angle @ Nov 21 2007, 13:36) А как ...   Nov 21 2007, 12:22


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 21:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016