Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 24.11.2016, 11:20   #1
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 12
Вес репутации: 100/25
LexxExe will become famous soon enoughLexxExe will become famous soon enough
По умолчанию Не получается работать с flash памятью

MCU: PIC24FJ1024GB606.
Среда: MPLAB X. v3.35.
Компилятор: XC16 ver.1.26.

Пытаюсь научиться писать/стирать/читать flash память контроллера.
Сейчас получается чтение, не получается стирание.

Код:
// объявляю массив pm_array в памяти программ
__prog__ unsigned int __attribute__ ((section(".settings"), space(prog)))
pm_array[2] = {0x1234, 0x5678};

// таким образом получается считать эти данные
void flash_read(void)
{
    int addrOffset;

    TBLPAG = __builtin_tblpage(&pm_array);
    addrOffset = __builtin_tbloffset(&pm_array);

    readData1 = __builtin_tblrdl(addrOffset);
    readData2 = __builtin_tblrdl(addrOffset += 2);
}

// А ВОТ ДАЛЬШЕ ПРОБЛЕМА С СТИРАНИЕМ!!!
void flash_erase(void)
{
    unsigned long progAddr = (unsigned long)&pm_array;

    NVMCON = 0x4003;

    NVMADRH = progAddr>>16;
    NVMADRL = progAddr & 0xFFFF;

    __builtin_disi(5);
    __builtin_write_NVM();
}
После прохода строки: (NVMADRL = progAddr & 0xFFFF в окне watch
регистры NVMADRL и NVMADRH остаются равные 0x0000,
т.е. не меняются. После выполнения функции flash_erase()
и нажатии в MPLABX кнопки reset процесс сброса повисает.
Видимо я затер область старта. При нажатии на паузу,
программа переходит в область обработчика исключения:
void __attribute__((__interrupt__,no_auto_psv,shadow)) _AddressError(void)
{
Nop();
}

Подскажите, чего я не так делаю?

Последний раз редактировалось Greg; 24.11.2016 в 12:59.
LexxExe вне форума   Ответить с цитированием
Старый 24.11.2016, 13:22   #2
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,718
Вес репутации: 4345/90
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Не получается работать с flash памятью

Цитата:
Сообщение от LexxExe Посмотреть сообщение
...Подскажите, чего я не так делаю?
Вникать неохота, вот это точно работает:
Код:
void flash_erase(unsigned long prog_addr)    // 1024 байта!
{
  unsigned int tblpag_;

    tblpag_ = TBLPAG;

    TBLPAG = prog_addr >> 16;                            // Initialize PM Page Boundary SFR

    prog_addr &= 0x0000FC00;

  __builtin_tblwtl((unsigned int) prog_addr, 0x0000);    // Set base address of erase block

    NVMCON = 0x4042;                                     // Initialize NVMCON

    asm("DISI #5");                                      // Block all interrupts with priority < 7 for next 5 instructions

  __builtin_write_NVM();                                 // C30 function to perform unlock

    TBLPAG = tblpag_;
}
Vlad&mir вне форума   Ответить с цитированием
Старый 24.11.2016, 13:52   #3
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 12
Вес репутации: 100/25
LexxExe will become famous soon enoughLexxExe will become famous soon enough
По умолчанию Re: Не получается работать с flash памятью

Спасибо за пример кода, Vlad&mir. Еще не попробовал, но решил сначала вникнуть в Ваш пример.

1)
NVMCON = 0x4042; означает, что NVMOP = 0010

0010= Row programming operation,
а не

0011= Erase a page of program or executive memory;
Это говорит о том, что Вы предлагайте мне зашить контроллер, вместо стирания или у Вас другой контроллер, или я чего-то не понимаю. Объясните, пожалуйста.

2)
Не понял откуда берется маска на адрес: prog_addr &= 0x0000FC00;?
LexxExe вне форума   Ответить с цитированием
Старый 24.11.2016, 14:24   #4
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 12
Вес репутации: 100/25
LexxExe will become famous soon enoughLexxExe will become famous soon enough
По умолчанию Re: Не получается работать с flash памятью

Попробовал Ваш код. В принципе ожидаемо не получилось((. Так и не понял или ли Вы предлагайте писать нули в flash, вместо стирания, или у Вас другой контроллер и другое содержание регистра NVMCON.
LexxExe вне форума   Ответить с цитированием
Старый 24.11.2016, 14:30   #5
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 38
Сообщений: 3,163
Вес репутации: 3463/102
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Не получается работать с flash памятью

Цитата:
Сообщение от LexxExe Посмотреть сообщение
Попробовал Ваш код. В принципе ожидаемо не получилось((. Так и не понял или ли Вы предлагайте писать нули в flash, вместо стирания, или у Вас другой контроллер и другое содержание регистра NVMCON.
Стирание флеш - это заполнение её 1-цами. Любая запись во флеш - это сброс этих единиц в нули. Записать 1 не возможно.
Т.е. если в ячейке было 0xFF то записать туда можно любое число (вернее оно потом оттуда считается) к примеру 0xC0.
Если дальше в эту ячейку попытаться записать 0xFF, то все-равно будет прочитанно 0xC0. А вот запись 0x80 пройдет успешно, прочитается 0x80.
Если в ячейку записать 0 - то при любой записи там всегда будет 0, вплоть до операции стирания.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 24.11.2016, 14:41   #6
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 12
Вес репутации: 100/25
LexxExe will become famous soon enoughLexxExe will become famous soon enough
По умолчанию Re: Не получается работать с flash памятью

+1. Согласен с Вами. Стало быть мой вопрос к Vlad&mir остается актуальным??? Что делает предлагаемый Вами код с названием flash_erase()?

Может есть у кого предложение почему регистры NVMADRH, NVMADRL не меняются в ходе выполнения кода программы (смотрю в watch). В то же время меняются напрямую в окне watch. Может есть какие защиты!??? Я не в курсе. В Fuses никаких защит явно не устанавливал. Может что-то бывает защищено по умолчанию?
LexxExe вне форума   Ответить с цитированием
Старый 24.11.2016, 14:44   #7
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 38
Сообщений: 3,163
Вес репутации: 3463/102
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Не получается работать с flash памятью

Цитата:
Сообщение от LexxExe Посмотреть сообщение
+1. Согласен с Вами. Стало быть мой вопрос к Vlad&mir остается актуальным??? Что делает предлагаемый Вами код с названием flash_erase()?

Может есть у кого предложение почему регистры NVMADRH, NVMADRL не меняются в ходе выполнения кода программы (смотрю в watch). В то же время меняются напрямую в окне watch. Может есть какие защиты!??? Я не в курсе. В Fuses никаких защит явно не устанавливал. Может что-то бывает защищено по умолчанию?
А что говорит даташит на последовательность действий при стирании/записи ячейки?
В 16х пиках нужно было определенную малитву залить с определенной последовательностью при запрещенных прерываниях, только тогда открывался доступ к стиранию и записи. Но в даташите это все было описано.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 24.11.2016, 15:12   #8
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 12
Вес репутации: 100/25
LexxExe will become famous soon enoughLexxExe will become famous soon enough
Post Re: Не получается работать с flash памятью

Вот пример с даташит.
Код:
// C example using MPLAB XC16
   unsigned long progAddr = 0xXXXXXX; // Address of row to write
   unsigned int  offset;
//Set up pointer to the first memory location to be written
   NVMADRU = progAddr>>16;              // Initialize PM Page Boundary SFR
   NVMADR = progAddr & 0xFFFF;          // Initialize lower word of address
   NVMCON = 0x4003;                     // Initialize NVMCON
   asm("DISI #5");                      // Block all interrupts with priority <7
// for next 5 instructions
   __builtin_write_NVM();                 // check function to perform unlock
// sequence and set WR
Можно сравнить с моим первый постом flash_erase().
Код:
__prog__ unsigned int __attribute__ ((section(".settings"), space(prog)))
pm_array[2] = {0x1234, 0x5678};

void flash_erase(void)
{
    unsigned long progAddr = (unsigned long)&pm_array;

    NVMCON = 0x4003;

    NVMADRH = progAddr>>16;
    NVMADRL = progAddr & 0xFFFF;

    __builtin_disi(5);
    __builtin_write_NVM();
}

В общем и целом все то же. Я так понимаю дело в деталях). Вот тока где я лажаю не ясно.
LexxExe вне форума   Ответить с цитированием
Старый 24.11.2016, 15:42   #9
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 38
Сообщений: 3,163
Вес репутации: 3463/102
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Не получается работать с flash памятью

Цитата:
Сообщение от LexxExe Посмотреть сообщение
Вот пример с даташит.
Код:
// C example using MPLAB XC16
   unsigned long progAddr = 0xXXXXXX; // Address of row to write
   unsigned int  offset;
//Set up pointer to the first memory location to be written
   NVMADRU = progAddr>>16;              // Initialize PM Page Boundary SFR
   NVMADR = progAddr & 0xFFFF;          // Initialize lower word of address
  NVMCON = 0x4003;                     // Initialize NVMCON
   asm("DISI #5");                      // Block all interrupts with priority <7
// for next 5 instructions
   __builtin_write_NVM();                 // check function to perform unlock
// sequence and set WR
Можно сравнить с моим первый постом flash_erase().
Код:
__prog__ unsigned int __attribute__ ((section(".settings"), space(prog)))
pm_array[2] = {0x1234, 0x5678};

void flash_erase(void)
{
    unsigned long progAddr = (unsigned long)&pm_array;

    NVMCON = 0x4003;

    NVMADRH = progAddr>>16;
    NVMADRL = progAddr & 0xFFFF;

    __builtin_disi(5);
    __builtin_write_NVM();
}
В общем и целом все то же. Я так понимаю дело в деталях). Вот тока где я лажаю не ясно.
А почему бы не сделать выделенное как в даташите (подстказка, порядок выполнения тоже имеет значение, когда дело касается записи во флеш)?
А номера регистров точно совпадают? Они у Вас и в даташите называются по разному.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 24.11.2016, 16:00   #10
pal1222@yandex.ru
Senior Member
 
Регистрация: 30.09.2008
Сообщений: 1,422
Вес репутации: 2147/66
pal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond repute
По умолчанию Re: Не получается работать с flash памятью

Проверь по .map размещение pm_array. Он не должен быть размещен на той же странице что и flash_erase. А скорее всего секции ".settings" вообще нет, но линкеры обычно игнорируют такие ошибки.
pal1222@yandex.ru вне форума   Ответить с цитированием
Старый 24.11.2016, 16:47   #11
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 12
Вес репутации: 100/25
LexxExe will become famous soon enoughLexxExe will become famous soon enough
По умолчанию Re: Не получается работать с flash памятью

Цитата:
Сообщение от pal1222@yandex.ru Посмотреть сообщение
Проверь по .map размещение pm_array. Он не должен быть размещен на той же странице что и flash_erase. А скорее всего секции ".settings" вообще нет, но линкеры обычно игнорируют такие ошибки.
Вы правы. Секция ".settings" создается, но явного выравнивания я не делал. Таким образом, моя секция размещается непосредственно за окончанием кода программы в адресе НЕ КРАТНОМ размеру страницы стирания. Этот размер 1024 инструкции или 3072 байта. Поэтому я затирал сам себя)). Сделал выравнивание:
__prog__ unsigned int __attribute__ ((section(".settings"), space(prog), aligned (4096))) pm_array[2] = {0x1234, 0x5678};

Осталось научиться писать данные.
Cложность работы с страницами flash в выравнивании данных, либо в явном указании адресов куда пишешь. Хотя второй вариант мне нравится менее.
LexxExe вне форума   Ответить с цитированием
Старый 25.11.2016, 13:33   #12
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 12
Вес репутации: 100/25
LexxExe will become famous soon enoughLexxExe will become famous soon enough
По умолчанию Re: Не получается работать с flash памятью

Всем спасибо за помощь.

Окончательный рабочий набор функций для программирования flash памяти в PIC24FJ1024GB606:
!Не написал функцию записи ROW.
!Все циферки и буковки в коде имеют свое значение, кроме записываемых данных (типа 0xXXXX).
!И, конечно, обязательно выравнивание секции (по началу страницы) при стирании страницы.
Код:
__prog__ unsigned int __attribute__ ((section(".settings"), space(prog), aligned (2048))) pm_array[4] = {0x1234, 0x5678};
unsigned int wr_Data1L = 0x3456, wr_Data1H = 0x12, wr_Data2L = 0xCDEF, wr_Data2H = 0xAB;
unsigned int rd_Data1L = 0, rd_Data1H = 0, rd_Data2L = 0, rd_Data2H = 0;

// erase page
void flash_erase(void)
{
	unsigned long progAddr = (unsigned long)&pm_array;
 
	NVMCON	= 0x4003;

	NVMADRH	= progAddr>>16;
	NVMADRL	= progAddr & 0xFFFF;

	__builtin_disi(5);
	__builtin_write_NVM();
}

// write double word
void flash_write(void)
{
	NVMCON	= 0x4001;
	TBLPAG	= 0xFA;

	__builtin_tblwtl(0, wr_Data1L);
	__builtin_tblwth(0, wr_Data1H);
	__builtin_tblwtl(2, wr_Data2L);
	__builtin_tblwth(2, wr_Data2H);

	NVMADRU	= __builtin_tblpage(&pm_array);
	NVMADR	= __builtin_tbloffset(&pm_array) & 0xF800;	//	page size 1024 PM words

	__builtin_disi(5);
	__builtin_write_NVM();
}

// read double word
void flash_read(void)
{
	int addrOffset;

	TBLPAG		= __builtin_tblpage(&pm_array);
	addrOffset	= __builtin_tbloffset(&pm_array);

	rd_Data1L	= __builtin_tblrdl(addrOffset);
	rd_Data1H	= __builtin_tblrdh(addrOffset);

	addrOffset	+= 2;

	rd_Data2L	= __builtin_tblrdl(addrOffset);
	rd_Data2H	= __builtin_tblrdh(addrOffset);
}
LexxExe вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
наше образование, или будущие ембеддеры - кто они... Vlad&mir Общетехнические вопросы 357 13.01.2015 11:34
Помогите мне не могу никак заставить порт А работать на вход p630304 Вопросы начинающих 11 10.02.2011 23:31
Не заставить работать АЦП (dsPIC33F...) в режиме «несколько измерений в БУФЕР» Юрий440 Продукция MICROCHIP 9 11.08.2007 14:50


Часовой пояс GMT +3, время: 16:09.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot