|
работа с внутренней флэш, AT91SAM7X256 |
|
|
|
Jul 6 2007, 11:16
|

Участник

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

|
Привет! У меня плата на AT91SAM7x256 - первый раз в жизни пытаюсь работать с внутреней флэш ... вот пишу что-то в память Код __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 При попытке что-то записать из памяти стирается прошивка... то стириется то ли затирается - не мгу понять!... Хотя адреса не перекрещеваются... Не понимаю... ЧЕМ это вызвано!  ... и в xcl написано "Read-Only" ...это значит что я могу только читать -- что надо прописать чтоб можно было и писать ? Спасибо!
Сообщение отредактировал Annuta - Jul 6 2007, 11:21
--------------------
Из комбинации лени и логики - получается программист! /народная мудрость/
|
|
|
|
|
 |
Ответов
|
Jul 12 2007, 10:51
|

Участник

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

|
вот написала по вашему совету прогу сначала. Эх... ну не работает!.  .. Не пинайте ногами если - что упускаю... програмимирую первый раз в жизни микроконтроллер!... вот мой код Код #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); Она зажигает второй лед, потом плата перегружается... !... все огоньки гаснут /как будто жму кнопочку на плате ресет/ ...и она снова работает... только сначала!... Третий лед не зажигается...
--------------------
Из комбинации лени и логики - получается программист! /народная мудрость/
|
|
|
|
|
Jul 12 2007, 12:01
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|