Тема: pic32mx nvm
Показать сообщение отдельно
Старый 17.03.2017, 22:21   #1
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,179
Вес репутации: 4133/90
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию pic32mx nvm

друг на работе 2 дня делал pic32mx flash programming. но постигла неудача. у него возникли серьезные затруднения в силу разных причин.

я решил написать код, чтобы уменьшить число затруднений при работе с nvm в pic32mx.

выложу под BSD , вроде бы рабочий, для типовых операций с flash.
в части erase нет проверки на исполнение в текущей странице.
этот вопрос гораздо лучше решать линкером, разместив все как надо.

для упрощения поиска запощу прямо еще кусок с write32. задрало искать нормальные простые примеры.
Код:
/**
 * burn new value to flash address
 * result value in flash cell is (current_value&set_value) 
 * @param virtual address
 * @param new_value
 * @return true on assign  
 */
__attribute__((leaf, noinline, nonnull(1))) bool nvm_write32(
							void* __restrict__ address,
							uint32_t new_value)
{
register uint32_t key0, key1, start_mask;
uint32_t phys_address;
	
	phys_address = ((uint32_t)address)&(0x1fffffff);
	
	if((phys_address >= _NVM_LOW_ADDRESS)&&
	(phys_address < (_NVM_LOW_ADDRESS + _FLASH_SIZE))&&
	(!(phys_address&0x03))){
		key0 = MAGIC0;
		key1 = MAGIC1;
		start_mask = _NVMCON_WR_M;
		pic32mx_nvm->con = _NVMCON_WORD_WRITE_M|_NVMCON_WREN_M;	
		LVD_WAR0;
		pic32mx_nvm->data = new_value;
		pic32mx_nvm->dstaddr = phys_address;
		__builtin_disable_interrupts();
		pic32mx_nvm->key = key0;
		pic32mx_nvm->key = key1;
		pic32mx_nvm->conset = start_mask;
		while(pic32mx_nvm->con&_NVMCON_WR_M);
		__builtin_enable_interrupts();
		LVD_WAR1;
		pic32mx_nvm->conclr =_NVMCON_WREN_M;	
		return (bool)(new_value == *((uint32_t*)address));
	}
	return false;
}
проверять с помощью
Код:
if(nvm_write32((void*)(&test_mas[temp]), 0)){
	__asm__("sdbbp");
}
тк. mplab очень серьезно дермирован в части отладки.

сорцы во вложении.
Вложения
Тип файла: zip pic32mx_nvm.zip (4.0 Кб, 3 просмотров)
besogon вне форума   Ответить с цитированием