реклама на сайте
подробности

 
 
> Как записать long int во флэш?, Закипаю, блин!
Димон Безпарольн...
сообщение Jan 9 2015, 18:20
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Первый вариант - разложить на байты и воспользоваться своим простым алгоритмом записи:

Цитата
unsigned char t1, t2, t3, t4;
unsigned long int F, Freq = 103500;
t1= (Freq);
t2= (Freq>>8);
t3= (Freq>>16);
t4= (Freq>>24);

F = (t4<<24)|(t3<<16)|(t2<<8)|t1;

t1 = sizeof(F);
printf("\n%li",F);


С успехом работает на компьютерном компиляторе С-Free(он 32-х разрядный), но нихрена не работает в AvrStudio, выдавая ошибку в строке F = (t4<<24)|(t3<<16)|(t2<<8)|t1;: ../main.c:84: warning: left shift count >= width of type. Подозреваю что это из - за разрядности.

Второй вариант - воспользоваться стандартными средствами:
Цитата
void eeprom_write_dword ( uint32_t *addr , uint32_t value )

Но я не пойму что такое uint32_t *addr. По идее это должен быть адрес флэш, куда я пишу эти 4 байта. Тогда почему он 4-разрядный?

Третий вариант - найти в памяти адрес это переменной и побайтово записать во флэш. Но я не знаю как это сделать. Помогите советом.

Сделал так:
Цитата
char K;
K = eeprom_read_byte ((uint8_t*) 0xff0);
eeprom_write_dword ((uint32_t*)&K,Freq);
K=K+4;
eeprom_write_byte ((uint8_t*)0xff0,K);


Пока не работает. Разбираюсь.

Сообщение отредактировал Димон Безпарольный - Jan 9 2015, 18:21
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Димон Безпарольн...
сообщение Jan 10 2015, 12:37
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Заработало! Вот решил немного прибраться - получил по полной. Написал код:

Код
//Чтение числа частот в памяти
char NumBytesRe (void) {uint8_t cnt=eeprom_read_byte((uint8_t*)0xFE0); return cnt;}

//Запись числа частот в память
void NumBytesWR (uint8_t cnt) {eeprom_write_byte((uint8_t*)0xFE0,cnt);}


//Чтение текущего выводимого канала памяти
uint8_t CurrMemChR (void) {uint8_t MEM = eeprom_read_byte((uint8_t*)0xFB0); return MEM;}
//Запись текущего выводимого канала в память
void CurrMemChWR (uint8_t MEM) {eeprom_write_byte((uint8_t*)0xFB0,MEM);}


//Чтение текущей выводимой частоты из памяти
uint32_t CurrFreqR (void) {uint32_t Fr=eeprom_read_dword ((const uint32_t *) 0xFA0); return Fr;}
//Запись текущей выводимой частоты в память
void CurrFreqWR (uint32_t Fr) {eeprom_write_dword((uint32_t*)0xFA0,Fr);}


//Чтение частоты из памяти
uint32_t FreqR (uint32_t* ADR) {uint32_t Fr=eeprom_read_dword (ADR); return Fr;}
//Запись частоты в память
void FreqWR (uint32_t* ADR, uint32_t Fr) {eeprom_write_dword(ADR,Fr);}


//Очистка индексов памяти
void MEMWipe (void) {
eeprom_write_byte((uint8_t*)0xFE0,(uint8_t)0);    //Число станций в базе
eeprom_write_byte((uint8_t*)0xFB0,(uint8_t)0);}    //Текущий выводимый канал памяти


Получил сообщение: cc1plus.exe: warning: command line option "-std=gnu99" is valid for C/ObjC but not for C++
Попытка использовать первую же функцию: NumBytesRe привела к ошибки: D:\8051\AVR\Projects\PriemXA6\default/../main.c:75: undefined reference to `NumBytesRe', хотя она выше места использования объявлена:
Код
extern uint8_t NumBytesRe (void);//Чтение числа частот в памяти

Придется пока оставить как есть.


Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th August 2025 - 19:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01435 секунд с 7
ELECTRONIX ©2004-2016