Форум Микро-Чип

Форум Микро-Чип (http://www.microchip.su/index.php)
-   Вопросы начинающих (http://www.microchip.su/forumdisplay.php?f=14)
-   -   pic32mx nvm (http://www.microchip.su/showthread.php?t=18008)

besogon 17.03.2017 22:21

pic32mx nvm
 
Вложений: 1
друг на работе 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 очень серьезно дермирован в части отладки.

сорцы во вложении.

Vint 20.03.2017 10:50

Re: pic32mx nvm
 
для 32mx есть прибамбас штабной
dee_emulation_pic32_v1_0_1.

besogon 20.03.2017 11:10

Re: pic32mx nvm
 
Vint
увы, никак не могу прокомментировать.
скорее всего этот пример все же вызывает те или иные вопросы.
ну или имеет зависимости аля plib/harmony.

besogon 20.03.2017 11:31

Re: pic32mx nvm
 
в пример не вставлены структуры и магические числа.
понятное дело, что они есть в datasheet по целевому pic.
как пример сброшу на всякий случай.
Код:

typedef struct {
        volatile uint32_t con;
        volatile uint32_t conclr;
        volatile uint32_t conset;
        volatile uint32_t coninv;
        volatile uint32_t key;
        unsigned :32;
        unsigned :32;
        unsigned :32;
        volatile uint32_t dstaddr;
        volatile uint32_t dstaddrclr;
        volatile uint32_t dstaddrset;
        volatile uint32_t dstaddrinv;
        volatile uint32_t data;
        unsigned :32;
        unsigned :32;
        unsigned :32;       
        volatile uint32_t srcaddr;
        unsigned :32;
        unsigned :32;
        unsigned :32;       
}pic32mx_nvm_t;

#define _NVMCON_LVDSTAT_P        0x0000000B
#define _NVMCON_LVDSTAT_M        0x00000800
#define _NVMCON_LVDSTAT_L        0x00000001

#define _NVMCON_LVDERR_P        0x0000000C
#define _NVMCON_LVDERR_M        0x00001000
#define _NVMCON_LVDERR_L        0x00000001

#define _NVMCON_WRERR_P                0x0000000D
#define _NVMCON_WRERR_M                0x00002000
#define _NVMCON_WRERR_L                0x00000001

#define _NVMCON_WREN_P                0x0000000E
#define _NVMCON_WREN_M                0x00004000
#define _NVMCON_WREN_L                0x00000001

#define _NVMCON_WR_P                0x0000000F
#define _NVMCON_WR_M                0x00008000
#define _NVMCON_WR_L                0x00000001

#define _NVMCON_NVMOP_P                0x00000000
#define _NVMCON_NVMOP_M                0x0000000f
#define _NVMCON_NVMOP_L                0x00000004

#define _NVMCON_WORD_WRITE_M        0x00000001
#define _NVMCON_ROW_WRITE_M        0x00000003
#define _NVMCON_PAGE_ERASE_M        0x00000004

...

#define MAGIC0        (0xAA996655)
#define MAGIC1        (0x556699AA)

#define _NVM_LOW_ADDRESS        0x1D000000
#define _SRAM_LOW_ADDRESS        0x00000000

...
pic32mx_nvm_t* const pic32mx_nvm = (pic32mx_nvm_t*)0xbf80f400;
...
extern pic32mx_nvm_t* const pic32mx_nvm;
#define PIC32MX_NVM        ((pic32mx_nvm_t*)0xbf80f400)

скорее хотел сбросить, чтобы было легко что-нибудь найти, как отправную точку.


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

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