Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Помогите решить проблему программирования Flash S12XDP512

Отправлено sway 30 мая 2008 г. 11:54


Вообщем пишу прогу которая должна сохранять данные в память,так как в даташите на MC9S12XDP512 написанна что встроенная флешка имеет обьем 512 Kb, решил попробывать сохранять данные в нее. Но возникла проблема при выполнее строки
/* Array address and program data */
WriteAddress[0] = Data;
прога просто виснет.
Подскажите пожалуйста как быть, у меня была мысль что я что та напутал с адрессом покоторому пытаюсь записывать в память, попробывал исправить не вышло(((((
Вообщем я делю Вот так вот:

#define TABLE_ADDRESS_LOW 0xE08000
#define TABLE_ADDRESS_HIGH 0xFFBFFF

#define OSC_SPEED 16000000

#pragma DATA_SEG FlashCtrl_DATA
#pragma CODE_SEG FlashCtrl_CODE

/* FlashCtrl_Init */
void FlashCtrl_Init(void)
{
#if OSC_SPEED == 4000000
/* 4mhz clock */
FCLKDIV = 20;
#else if OSC_SPEED == 16000000
/* 16mhz clock */
FCLKDIV = 72;
#endif
}

/* FlashCtrl_WriteWord */
byte FlashCtrl_WriteWord(word *__far WriteAddress,word Data){

/* Check range of WriteAddress */
if(WriteAddress < (word *__far)TABLE_ADDRESS_LOW || WriteAddress > (word *__far)TABLE_ADDRESS_HIGH)
return FALSE;


/* Has the FLASH divider clock been set— */
if(!FCLKDIV_FDIVLD)
FlashCtrl_Init();

/* Check command flag */
if(!FSTAT_CBEIF)
return FALSE;


/* Clear flags */
FSTAT = 48;

/* Array address and program data */
WriteAddress[0] = Data;

/* Word program command */
FCMD = 32;

/* Clear flag command buffer empty */
FSTAT = 128;

/* Is protection violation or acces error detected– */
if ((FSTAT_PVIOL == 1)||(FSTAT_ACCERR == 1))
return FALSE;

/* Wait to buffer empty */
while(FSTAT_CBEIF == 0);
/* Wait to command complete */
while(FSTAT_CCIF == 0);

/* Was write successful? */
if(WriteAddress[0] != Data)
return FALSE;


/* Return success */
return TRUE;
}

#pragma DATA_SEG DEFAULT
#pragma CODE_SEG DEFAULT

word DATA = 0x0000;
byte Res = 0;

void main(void) {
// * put your own code here
EnableInterrupts;

DATA = 0xA5A5;
Res = FlashCtrl_WriteWord((word *__far)0xE09500,DATA);
......
}

А это описание prm файла:
/* This is a linker parameter file for the MC9S12XDP512 */

NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */

SEGMENTS /* here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */
/* Register space */
/* IO_SEG = PAGED 0x0000 TO 0x07FF; */

/* nonpaged RAM */
RAM = READ_WRITE 0x2000 TO 0x3FFF ALIGN 2;
/* when changing the RAM_XGATE range, please check the Startup.cmd */
/* nonpaged EEPROM */
EEPROM = READ_ONLY 0x0C00 TO 0x0FFF;

/* paged EEPROM */
EEPROM_FC = READ_ONLY 0xFC0800 TO 0xFC0BFF;
EEPROM_FD = READ_ONLY 0xFD0800 TO 0xFD0BFF;
EEPROM_FE = READ_ONLY 0xFE0800 TO 0xFE0BFF;
/* EEPROM_FF = READ_ONLY 0xFF0800 TO 0xFF0BFF; intentionally not defined: equivalent to RAM */

/* paged RAM */
RAM_XGATE = READ_WRITE 0xFB1000 TO 0xFB1FFF ALIGN 2;
RAM_FC = READ_WRITE 0xFC1000 TO 0xFC1EFF;
RAM_XGATE_STK = READ_WRITE 0xFC1F00 TO 0xFC1FFF; // The stack is set by the XGATE compiler option -Cstv=D000
RAM_FD = READ_WRITE 0xFD1000 TO 0xFD1FFF;
/* RAM_FE = READ_WRITE 0xFE1000 TO 0xFE1FFF; intentionally not defined: equivalent to RAM */
/* RAM_FF = READ_WRITE 0xFF1000 TO 0xFF1FFF; intentionally not defined: equivalent to RAM */

/* unbanked FLASH */
ROM_4000 = READ_ONLY 0x4000 TO 0x7FFF;

ROM_C000 = READ_ONLY 0xC000 TO 0xFEFF;
/* ROM_FF00 = READ_ONLY 0xFF00 TO 0xFFFF; intentionally not defined: used for VECTOR commands below. */

/* paged FLASH */
PAGE_E0 = READ_ONLY 0xE08000 TO 0xE087FF;
FLASH_XGATE_E0 = READ_ONLY 0xE08800 TO 0xE0BFFF ALIGN 2;
PAGE_E1 = READ_ONLY 0xE18000 TO 0xE1BFFF;
PAGE_E2 = READ_ONLY 0xE28000 TO 0xE2BFFF;
PAGE_E3 = READ_ONLY 0xE38000 TO 0xE3BFFF;
PAGE_E4 = READ_ONLY 0xE48000 TO 0xE4BFFF;
PAGE_E5 = READ_ONLY 0xE58000 TO 0xE5BFFF;
PAGE_E6 = READ_ONLY 0xE68000 TO 0xE6BFFF;
PAGE_E7 = READ_ONLY 0xE78000 TO 0xE7BFFF;
PAGE_E8 = READ_ONLY 0xE88000 TO 0xE8BFFF;
PAGE_E9 = READ_ONLY 0xE98000 TO 0xE9BFFF;
PAGE_EA = READ_ONLY 0xEA8000 TO 0xEABFFF;
PAGE_EB = READ_ONLY 0xEB8000 TO 0xEBBFFF;
PAGE_EC = READ_ONLY 0xEC8000 TO 0xECBFFF;
PAGE_ED = READ_ONLY 0xED8000 TO 0xEDBFFF;
PAGE_EE = READ_ONLY 0xEE8000 TO 0xEEBFFF;
PAGE_EF = READ_ONLY 0xEF8000 TO 0xEFBFFF;
PAGE_F0 = READ_ONLY 0xF08000 TO 0xF0BFFF;
PAGE_F1 = READ_ONLY 0xF18000 TO 0xF1BFFF;
PAGE_F2 = READ_ONLY 0xF28000 TO 0xF2BFFF;
PAGE_F3 = READ_ONLY 0xF38000 TO 0xF3BFFF;
PAGE_F4 = READ_ONLY 0xF48000 TO 0xF4BFFF;
PAGE_F5 = READ_ONLY 0xF58000 TO 0xF5BFFF;
PAGE_F6 = READ_ONLY 0xF68000 TO 0xF6BFFF;
PAGE_F7 = READ_ONLY 0xF78000 TO 0xF7BFFF;
PAGE_F8 = READ_ONLY 0xF88000 TO 0xF8BFFF;
PAGE_F9 = READ_ONLY 0xF98000 TO 0xF9BFFF;
PAGE_FA = READ_ONLY 0xFA8000 TO 0xFABFFF;
PAGE_FB = READ_ONLY 0xFB8000 TO 0xFBBFFF;
PAGE_FC = READ_ONLY 0xFC8000 TO 0xFCBFFF;
/* PAGE_FD = READ_ONLY 0xFD8000 TO 0xFDBFFF; intentionally not defined: equivalent to ROM_4000 */

PAGE_FE = READ_ONLY 0xFE8000 TO 0xFEBFFF;
/* PAGE_FF = READ_ONLY 0xFF8000 TO 0xFFBFFF; intentionally not defined: equivalent to ROM_C000 */

//OSVECTORS = READ_ONLY 0xFF10 TO 0xFFFF; /* OSEK interrupt vectors (use your vector.o) */
END

PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */
_PRESTART, /* Used in HIWARE format: jump to _Startup at the code start */
STARTUP, /* startup data structures */
ROM_VAR, /* constant variables */
STRINGS, /* string literals */
VIRTUAL_TABLE_SEGMENT, /* C++ virtual table segment */
//.ostext, /* OSEK */
NON_BANKED, /* runtime routines which must not be banked */
COPY /* copy down information: how to initialize variables */
/* in case you want to use ROM_4000 here as well, make sure
that all files (incl. library files) are compiled with the
option: -OnB=b */
INTO ROM_C000/*, ROM_4000*/;
DEFAULT_ROM INTO PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8,
PAGE_F7, PAGE_F6, PAGE_F5, PAGE_F4, PAGE_F3, PAGE_F2, PAGE_F1, PAGE_F0,
PAGE_EF, PAGE_EE, PAGE_ED, PAGE_EC, PAGE_EB, PAGE_EA, PAGE_E9, PAGE_E8,
PAGE_E7, PAGE_E6, PAGE_E5, PAGE_E4, PAGE_E3, PAGE_E2, PAGE_E1, PAGE_E0;
DEFAULT_RAM, /* all variables, the default RAM location */
INTO RAM;
XGATE_STRING, /* XGATE string literals */
XGATE_CONST, /* XGATE constants */
XGATE_CODE /* XGATE code */
INTO RAM_XGATE; /* XGATE functions have to be copied into RAM by HCS12X */
PAGED_RAM INTO RAM_FC, RAM_FD;
//.vectors INTO OSVECTORS; /* OSEK */
END

ENTRIES /* keep the following unreferenced variables */
//_vectab OsBuildNumber /* OSEK */
END

STACKSIZE 0x100

VECTOR 0 _Startup /* reset vector: this is the default entry point for a C/C++ application. */


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 13:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru