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

 
 
> работа с внутренней флэш, 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
Ответов
Annuta
сообщение Jul 12 2007, 10:51
Сообщение #2


Участник
*

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



вот написала по вашему совету прогу сначала. Эх... ну не работает!. crying.gif .. Не пинайте ногами если - что упускаю... програмимирую первый раз в жизни микроконтроллер!...
вот мой код
Код
#include <os_cpu.h>
#define TestAddr 0x0030000
#define EFC_PAGE_SIZE 256
#define EFC_PAGE_COUNT 256
#define EFC_PagesInTheLockRegion 32
#define EFC_PAGE_SIZE_UINT (EFC_PAGE_SIZE/4) //
#define u32 unsigned long
#define u8 unsigned char
#define DWORD unsigned long

__ramfunc void EFC_Init(void)
{
    while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
    AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(100 <<16)) | AT91C_MC_FWS_1FWS;
    while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
}

__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 = (adr & 0x3FFFF)/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;
  if (NeedReset) {
     l=0;
  }
     l=0;
while (l<Len) {
    EFC_WritePage(adr, (u32*)&(pbuf[l]));
    l+=EFC_PAGE_SIZE;
    adr+=EFC_PAGE_SIZE;
}
  if (NeedReset) {
      __asm("sub r0, r0,r0;");
      __asm("bx r0;");
  }
}

__ramfunc u32 EFC_ReadPage(u32 adr, u32 *pbuf)
{
unsigned int *pflash = (unsigned int *)adr;
unsigned int i;

EFC_Init();

for (i = 0; i < EFC_PAGE_SIZE_UINT; i++)
*(pbuf + i) = *(pflash + i );

return 1;
}

void TestEFC(void)
{
  unsigned int buf1[8192/4];
  int i;
  unsigned int *pbuf3=(unsigned int *)TestAddr;
  
  //AT91C_BASE_MC->MC_FCR = (0x5A << 24) | AT91C_MC_FCMD_ERASE_ALL;
  //while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
  
    for(i=0;i<8192/4;i++)
        buf1[i]=i+9;
    
  OS_CPU_SR  cpu_sr = 0;
  OS_ENTER_CRITICAL(); //Запретили прерывания
       EFCWrite( TestAddr ,(u8*)buf1,8192,0);
  OS_EXIT_CRITICAL();  //Разрешили прерывания
    
    for( i=0;i<8192/4;i++)
     if (buf1[i]!=pbuf3[i])
         buf1[i]=0;
}


вот прога делает такой финт ушами... как только я вызываю функцию записи в основном цикле
LED_On(2);
TestEFC();
LED_On(3);
Она зажигает второй лед, потом плата перегружается... !... все огоньки гаснут /как будто жму кнопочку на плате ресет/ ...и она снова работает... только сначала!... Третий лед не зажигается...


--------------------
Из комбинации лени и логики - получается программист! /народная мудрость/
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2007, 12:01
Сообщение #3


Гуру
******

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



Цитата(Annuta @ Jul 12 2007, 13:51) *
Она зажигает второй лед, потом плата перегружается... !... все огоньки гаснут /как будто жму кнопочку на плате ресет/ ...и она снова работает... только сначала!... Третий лед не зажигается...
Я извиняюсь, три вопроса -
1) у вас Watchdog Timer остановлен? Если нет, возможно как раз в этот момент истекает его тайм-аут.
2) вы пользуетесь внутрисхемным отладчиком? Если да, то можно пошагово дойти до точки "падения" и узнать какое именно действие вызывает перезагрузку.
3)У вас стоят "заглушки" на исключениях Prefetch Abort, DataAbort, Undefined Instruction? Если нет - поставьте пустые циклы с какой-то индикацией, уже будет больше информации.


--------------------
На любой вопрос даю любой ответ
"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
- - 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, 09:10
- - Сергей Борщ   Цитата(Angle @ Nov 21 2007, 11:10) Прогам...   Nov 21 2007, 11:20
- - 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 - 23:14
Рейтинг@Mail.ru


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