Перейти к содержанию
    

Не получается работать с flash.

Всем доброго дня.

 

Проблема в следующем. Не могу научиться писать/стирать flash в микроконтроллере PIC24FJ1024GB606.

Среда: MPLAB X.

Компилятор: XC16 ver.1.26.

 

Сказу скажу, что в структуре памяти разбираюсь не очень, но программирую PIC давно. Так что некоторые вещи понимаю.

 

Ранее для записи настроечных параметров в микроконтроллер, типа PIC24FJ64GB004, использовал библиотеку DEE Emulation 16-bit - эмулятор EEPROM. Использовал функции read, write и горя не знал.

 

При попытке запустить ее (DEE) на PIC24FJ1024GB606 оказалось, что она не работает. Стал смотреть ее. Оказалось регистр NVMCOM - регистр контроля Flash памяти в библиотеке DEE не соответствует требуемому. Попробовал поменять - не помогло. Далее в библиотеке разбираться не стал.

 

Открыл документы даташит на мк и "PIC24F Flash Program Memory" - DS30009715C. Надергал примеров из документа на flash. В итоге получилось следующее:

 

unsigned int __attribute__((section(".defaults"), space(prog))) factoryPARAM[512]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; // объявил область памяти.

 

Доработанный пример стирания из даташита на мк:

void erasing(void)

{

// C example using MPLAB XC16

unsigned long progAddr = (unsigned long)(&factoryPARAM); // 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

}

 

Не стирает.

 

Пример ниже выдернул из "PIC24F Flash Program Memory". factoryPARAM - моя область памяти.

 

void erasing(void)

{

unsigned int offset;

 

NVMCON = 0x4003;

 

offset = __builtin_tbloffset(factoryPARAM);

TBLPAG = __builtin_tblpage(factoryPARAM);

 

__builtin_tblwtl(offset, 0);

__builtin_disi(5);

__builtin_write_NVM();

}

 

Ничего не стирает.

 

Прошу помочь разобраться, чего я делаю не так. С библиотекой начинал работать за 5 мин. Сейчас убил 2 дня пробуя все варианты. Читать документы полностью тяжко.

Естественно, прошу помощи именно по указанному семейству МК, типа PIC24FJ1024GA610/GB610 FAMILY, ну или аналоги.

Изменено пользователем I_am_Lexx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я знаю, в пиках флешак стирается страницами...

 

void FlashPageErase(uint16_t Adru, uint16_t Adr)

{

uint16_t saveTBLPAG = TBLPAG;

TBLPAG = Adru;

__builtin_tblwtl(Adr, 0);

 

#if defined( __dsPIC33E__ )

NVMADRU = Adru;

NVMADR = Adr;

#endif

 

NVMCON = FLASH_PAGE_ERASE_CODE;

SET_CPU_IPL(7);

__builtin_write_NVM();

while (NVMCONbits.WR) {}

NVMCON = 0x0001;

TBLPAG = saveTBLPAG;

SET_CPU_IPL(0);

}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...