Перейти к содержанию
    

Запись во флэшь

Надо:

 

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);

}

 

КАК??? без ассемблерной вставки можно? если нет, то как с ней?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык а указатели в Си для чего придуманы?

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;
...
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть вопрос. Если писать во 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть вопрос. Если писать во flash как приведено ниже, то по дизассемблеру получается, что данные записываются в flash_add (по адресу переменной flash_add 0x06E6)? Или я не правильно понял?

Не совсем понятно что вы хотите? И какие именно значения передаете в функцию? Что такое flash_add и Data_to_flash?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вон у TI же на все случаи жизни есть примеры

fet120_flash_write.txt

Изменено пользователем rumit2000

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это я взял функцию из какого-то примера и полностью не разобрался. Там действительно в функцию передается адрес переменной flash_add (она расположена во flash). Мне надо n-слов сохранить во flash, как правильно это сделать?

 

Все, спасибо, разобрался по примеру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...