I_am_Lexx 0 14 ноября, 2016 Опубликовано 14 ноября, 2016 (изменено) · Жалоба Всем доброго дня. Проблема в следующем. Не могу научиться писать/стирать 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, ну или аналоги. Изменено 14 ноября, 2016 пользователем I_am_Lexx Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Asm_lock 0 16 июня, 2017 Опубликовано 16 июня, 2017 · Жалоба Насколько я знаю, в пиках флешак стирается страницами... 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться