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

 
 
 
Reply to this topicStart new topic
> Как прочитать программно Flash память атмеги 128
inventor
сообщение Jun 8 2010, 09:48
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Вообще это возможно или нет?
Как читать / писать EEPROM я знаю,
интересует вопрос, как из программы прочитать flash память.
Go to the top of the page
 
+Quote Post
Savrik
сообщение Jun 8 2010, 10:02
Сообщение #2


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



Вы имеете ввиду флеш внутреннюю(On-chip In-System Reprogrammable Flash)? Ее читать и писать можно с секции бутлоадера, см. раздел в даташите "Boot Loader Support – Read-While-Write Self-Programming".
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 8 2010, 10:19
Сообщение #3


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(inventor @ Jun 8 2010, 13:48) *
Вообще это возможно или нет?
Как читать / писать EEPROM я знаю,
интересует вопрос, как из программы прочитать flash память.


Читать можно в любом месте ваше программы. Смотрите команду LPM


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 8 2010, 10:41
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(inventor @ Jun 8 2010, 13:48) *
интересует вопрос, как из программы прочитать flash память.

Нужно применить модификатор типа __flash (зависит от компилятора, это - для IAR)
Для WinAVR: __attribute__((__progmem__))


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
inventor
сообщение Jun 15 2010, 11:21
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Да, я чё-то туплю.
Нашел функции для чтения из flash: pgm_read_byte_near и pgm_read-word_near
ну и есть парные с атрибутом far
Насколько я понимаю, эта внутренняя флеш устроена таким образом,
что у нее в одной ячейке записаны ДВА байта.
и адресация у нее от 0 до 0xFFFF
ТО есть если я читаю предположим с адреса 0,
то я должен прочитать ДВА байта функцией pgm_read_word
а с адреса 1 следующие ДВА байта.
Но при последовательном вызове функции pgm_read_word(0), pgm_read_word(1)
я читаю по одному байту.
Я просто смотрю в отладчике и в гексоидном файле.
Понимаю, что по стандарту анси С у нас байтовая адресация, а не 2-х байтная.
Мне не совсем ясно, как мне залезть за предел в 64 кБайта на атмеге 128?
Или програмная адресация не соответсвует реальной?
ТО есть как мне предположим прочитать слово по адресу 0xFFFE?
Go to the top of the page
 
+Quote Post
YAM
сообщение Jun 15 2010, 12:03
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 7-07-04
Из: Ukraine
Пользователь №: 291



Ну типа так для IAR AVR:
unsigned int VAR;
VAR = *(unsigned int __farflash *)0x1FFFE; // Читаем последние 2 байта памяти программ


--------------------
Go to the top of the page
 
+Quote Post
inventor
сообщение Jun 15 2010, 12:34
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(YAM @ Jun 15 2010, 16:03) *
Ну типа так для IAR AVR:
unsigned int VAR;
VAR = *(unsigned int __farflash *)0x1FFFE; // Читаем последние 2 байта памяти программ


ТО есть получается что адрес FFFF применимо к функции pgm_read_word
будет читать из флеша по адресу FFFF/2 а не FFFF?
Я правильно понимаю?
Go to the top of the page
 
+Quote Post
YAM
сообщение Jun 15 2010, 12:52
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 7-07-04
Из: Ukraine
Пользователь №: 291



Цитата(inventor @ Jun 15 2010, 15:34) *
ТО есть получается что адрес FFFF применимо к функции pgm_read_word
будет читать из флеша по адресу FFFF/2 а не FFFF?
Я правильно понимаю?

Это зависит от типа компилятора. Я привел пример для IAR.
Но по любому, любой многобайтовый доступ к памяти программ будет преобразован к установке RAMPZ и байтовому чтению командой ELPM.


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 15 2010, 13:03
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(inventor @ Jun 15 2010, 14:21) *
Насколько я понимаю, эта внутренняя флеш устроена таким образом,
что у нее в одной ячейке записаны ДВА байта.
Не морочьте себе голову. Это странная прихоть писателей даташитов от атмела, что память адресуется словами. Обратите внимание, что согласно даташиту для команды LPM в Z грузится адрес слова сдвинутый на 1 и в младший бит - признак "младший/старший байт слова". Которые вместе образуют честный байтовый адрес. Чтение все равно происходит по одному байту за раз, а как оно устроено внутри - знают только сами разработчики кристалла. gcc-avr (WinAVR) использует нормальную байтовую адресацию. Словная адресация используется только для указателей на функции, которые физически не могут указывать на нечетный байтовый адрес.
Цитата(inventor @ Jun 15 2010, 14:21) *
ТО есть если я читаю предположим с адреса 0,
то я должен прочитать ДВА байта функцией pgm_read_word
а с адреса 1 следующие ДВА байта.
Нет. В первом случае получите 2 байта с адресов 0,1, во втором - с адресов 1,2.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
inventor
сообщение Jun 15 2010, 13:34
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(Сергей Борщ @ Jun 15 2010, 17:03) *
Не морочьте себе голову. Это странная прихоть писателей даташитов от атмела, что память адресуется словами. Обратите внимание, что согласно даташиту для команды LPM в Z грузится адрес слова сдвинутый на 1 и в младший бит - признак "младший/старший байт слова". Которые вместе образуют честный байтовый адрес. Чтение все равно происходит по одному байту за раз, а как оно устроено внутри - знают только сами разработчики кристалла. gcc-avr (WinAVR) использует нормальную байтовую адресацию. Словная адресация используется только для указателей на функции, которые физически не могут указывать на нечетный байтовый адрес.
Нет. В первом случае получите 2 байта с адресов 0,1, во втором - с адресов 1,2.

Спасибо.
Именно так и получается (0,1...1,2)
Просто я считал, что раз в документации написано,
что конечный адрес флеша FFFF, то и адресовать
я это должен соответсвенно по 16 бит.
Go to the top of the page
 
+Quote Post

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

 


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


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