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

Не получается работать с 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);
}

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация