Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись во флэшь
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Aptahar
Надо:

typedef unsigned short int word;

void FLASH_WriteWord(word Adr, word Dat)
{

_BIC_SR(GIE);
while(FCTL3&BUSY == BUSY);

FCTL3 = FWKEY;
FCTL1 = FWKEY+WRT;

//Здесь надо записать Dat по адресу Adr

FCTL1 = FWKEY;
FCTL3 = FWKEY+LOCK;

_BIS_SR(GIE);
}

КАК??? без ассемблерной вставки можно? если нет, то как с ней?
rezident
Дык а указатели в Си для чего придуманы?
Код
void FLASH_WriteWord(word Adr, word Dat)
{ word *pAdr=(word *)Adr;

  _BIC_SR(GIE);
  while(FCTL3&BUSY == BUSY);

  FCTL3 = FWKEY;         
  FCTL1 = FWKEY+WRT;         

*pAdr=Dat;

  FCTL1 = FWKEY;         
  FCTL3 = FWKEY+LOCK;     

  _BIS_SR(GIE);
}

А еще лучше, если бы вы сразу указатель в функцию передавали, а не значение. Потому что, если случайно переменная адреса Adr будет нечетным числом, то хрен знает куда ваша Dat запишется. Точнее понятно куда, с выравниваением по четному адресу.

Лучше будет вот так.
Код
void FLASH_WriteWord(word *pAdr, word Dat)
{
...
*pAdr=Dat;
...
}
iskrovec
Есть вопрос. Если писать во flash как приведено ниже, то по дизассемблеру получается, что данные записываются в flash_add (по адресу переменной flash_add 0x06E6)? Или я не правильно понял?

flash_write(&flash_add,Data_to_flash);

void flash_write(word* address, word data) //
{
__bic_SR_register(GIE);
FCTL3 = FWKEY; // Unlock the flash.
FCTL1 = FWKEY | WRT; // Enable flash write.
*address = data; // Write the data to the flash.
FCTL1 = FWKEY; // Disable flash write.
FCTL3 = FWKEY | LOCK; // Lock the flash.
__bis_SR_register(GIE);
}// flash_write(word* address, data)

Дизассемблер:
flash_write(&flash_add,Data_to_flash);
0011AA 421E 06E8 mov.w &Data_to_flash,R14
0011AE 403C 06E6 mov.w #0x6E6,R12
0011B2 12B0 1F3A call #flash_write



flash_write:
001F3A C232 dint
FCTL3 = FWKEY; // Unlock the flash.
001F3C 40B2 A500 012C mov.w #0xA500,&FCTL3
FCTL1 = FWKEY | WRT; // Enable flash write.
001F42 40B2 A540 0128 mov.w #0xA540,&FCTL1
*address = data; // Write the data to the flash.
001F48 4E8C 0000 mov.w R14,0x0(R12)
FCTL1 = FWKEY; // Disable flash write.
001F4C 40B2 A500 0128 mov.w #0xA500,&FCTL1
FCTL3 = FWKEY | LOCK; // Lock the flash.
001F52 40B2 A510 012C mov.w #0xA510,&FCTL3
__bis_SR_register(GIE);
001F58 D232 eint
}// flash_write(word* address, data)
001F5A 4130 ret
rezident
Цитата(iskrovec @ Apr 24 2007, 18:22) *
Есть вопрос. Если писать во flash как приведено ниже, то по дизассемблеру получается, что данные записываются в flash_add (по адресу переменной flash_add 0x06E6)? Или я не правильно понял?

Не совсем понятно что вы хотите? И какие именно значения передаете в функцию? Что такое flash_add и Data_to_flash?
rumit2000
А вон у TI же на все случаи жизни есть примеры
Нажмите для просмотра прикрепленного файла
iskrovec
Это я взял функцию из какого-то примера и полностью не разобрался. Там действительно в функцию передается адрес переменной flash_add (она расположена во flash). Мне надо n-слов сохранить во flash, как правильно это сделать?

Все, спасибо, разобрался по примеру.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.