Aptahar 0 21 апреля, 2006 Опубликовано 21 апреля, 2006 · Жалоба Надо: 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 0 21 апреля, 2006 Опубликовано 21 апреля, 2006 · Жалоба Дык а указатели в Си для чего придуманы? 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 0 24 апреля, 2007 Опубликовано 24 апреля, 2007 · Жалоба Есть вопрос. Если писать во 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 0 24 апреля, 2007 Опубликовано 24 апреля, 2007 · Жалоба Есть вопрос. Если писать во flash как приведено ниже, то по дизассемблеру получается, что данные записываются в flash_add (по адресу переменной flash_add 0x06E6)? Или я не правильно понял? Не совсем понятно что вы хотите? И какие именно значения передаете в функцию? Что такое flash_add и Data_to_flash? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rumit2000 0 24 апреля, 2007 Опубликовано 24 апреля, 2007 (изменено) · Жалоба А вон у TI же на все случаи жизни есть примеры fet120_flash_write.txt Изменено 24 апреля, 2007 пользователем rumit2000 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iskrovec 0 25 апреля, 2007 Опубликовано 25 апреля, 2007 · Жалоба Это я взял функцию из какого-то примера и полностью не разобрался. Там действительно в функцию передается адрес переменной flash_add (она расположена во flash). Мне надо n-слов сохранить во flash, как правильно это сделать? Все, спасибо, разобрался по примеру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться