Показать сообщение отдельно
Старый 18.02.2020, 08:18   #2
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 3,162
Вес репутации: 4064/119
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Как читать данные из памяти программ в PIC24?

Механизм PSV-доступа в разных семействах 16-битной платформы может заметно отличаться. Полагаю, что Вы ведете речь о ранее озвученном Вами PIC24FJ128GA204. Если это так, то в даташите есть раздел 4.2.5 регламентирующий адресацию программной памяти через адресное пространство ОЗУ.
Основной переключатель адресного пространства - регистр DSRPAG.
Запись в него значений от 0x200 до 0x2FF приведет к доступности младшего слова (16 бит) программной памяти постранично (32К).
Запись от 0x300 до 0x3FF - старшего слова памяти программ соответственно.
Но собственно адрес доступа всегда должен содержать 1 в 15 разряде. То есть нулевой адрес страницы флеша будет доступен с указателем равным 0x8000.
В ассемблере XC16 (ASM16) есть специальный макрос, который упрощает этот доступ через метку (имя) массива констант во флеше.
Выглядит это как:
Код:
	mov		#psvpage(adres), W0
	mov		W0, DSRPAG
	mov		#psvoffset(adres), W0
	mov		[W0++], W1   ; W1 получил значение младшего слова [adres]
	mov		[W0], W2   ; W2 получил значение следующего слова [adres+2]
Причем загрузку DSRPAG совершенно не обязательно повторять, если речь идет об одной и той же странице флеша. Запишите туда значение один раз и затем пользуйтесь только #psvoffset

Последний раз редактировалось Марк; 18.02.2020 в 08:26.
Марк вне форума   Ответить с цитированием