Jump to main content

##

# 3.36.16 Non-Volatile Memory Controller (NVMCTRL)

The Non-Volatile Memory (NVM) module provides an interface to the device's Non-Volatile Memory controller, so that memory pages can be written, read, erased, and reconfigured in a standardized manner.

## Using The Library

NVMCTRL Peripheral library provides non-Blocking API's and they can be used to perform below functionalities on the NVMCTRL peripheral.

- Initialize the NVMCTRL

- Register a callback

- Perform NVM write and erase operations

- Manage region locks

- Manage SmartEEPROM

- Check error and status of NVM

The Flash memory main address space on this device is arranged as two memory banks. It is possible to execute code from one memory bank while a write or erase operation is progressing on the other memory bank. The entire flash memory is divided into 32 regions.

Each region has a corresponding lock bit which can be programmed (with Lock Region command) to temporarily prevent write and erase operations. Temporarily here means until the region is unlocked with an unlock command. These lock bits can be erased (with an Unlock Region command)) to temporarily unlock a region. When the device is reset, region lock values are loaded with the default value stored in the NVM User Page.

The main address space is divided into blocks . Each of the block contains several flash pages. Commands used for the main address space and NVM User Page are different.

There are multiple commands to perform erase and write operations.

Memory | WP | WQW | EP | EB
--- | --- | --- | --- | ---
Main Address Space | X | X |  | X
User Page Address Space |  | X | X |

- EB: Erase Block

- EP: Erase Page

- WP: Write Page

- WQW: Write Quad Word

SmartEEPROM is the feature which perform EEPROM emulation on the device flash. There are fuse bits in the NVM User Page to configure SmartEEPROM total size and page size. Refer the datasheet and code examples for more details on the SmartEEPROM.

Here is an example code to erase a block and program a page of memory using polling method

    // Define a constant array in Flash.
    // It must be aligned to block boundary and size has to be in multiple of rows
    const uint8_t nvm_user_start_address[NVMCTRL_FLASH_BLOCKSIZE] __attribute__((aligned(NVMCTRL_FLASH_BLOCKSIZE),keep,externally_visible,space(prog)))= {0};

    void populate_buffer(uint8_t* data)
    {
        int i = 0;

        for (i = 0; i < (NVMCTRL_FLASH_PAGESIZE); i++)
        {
            *(data + i) = i;
        }
    }

    int main (void)
    {
        uint8_t pageBuffer[NVMCTRL_FLASH_PAGESIZE] = {0};

        /*Populate pageBuffer to programmed*/
        populate_buffer(pageBuffer);

        while(NVMCTRL_IsBusy());

        /* Erase the block */
        NVMCTRL_BlockErase((uint32_t)nvm_user_start_address);

        /* Wait for row erase  to complete */
        while(NVMCTRL_IsBusy());

        /* Program a page of data */
        NVMCTRL_PageWrite((uint32_t *)pageBuffer, (uint32_t)nvm_user_start_address);

        /* Wait for page program to compete */
        while(NVMCTRL_IsBusy());
    }

## Library Interface

Non-Volatile Memory Controller peripheral library provides the following interfaces:

Functions

Name | Description
--- | ---
NVMCTRL_Initialize | Initializes given instance of the NVMCTRL peripheral
NVMCTRL_Read | Reads length number of bytes from a given address in FLASH memory
NVMCTRL_SetWriteMode | Sets the write mode for Flash
NVMCTRL_PageWrite | Writes one page of data to given NVM address
NVMCTRL_BlockErase | Erases a Block in the NVM
NVMCTRL_ErrorGet | Returns error conditions of NVM controller
NVMCTRL_StatusGet | Returns status conditions of NVM controller
NVMCTRL_IsBusy | Returns the current status of NVM controller
NVMCTRL_RegionLock | Locks a NVMCTRL region
NVMCTRL_RegionUnlock | Unlocks a NVM region
NVMCTRL_RegionLockStatusGet | Returns the value of RUNLOCK register
NVMCTRL_BankSwap | Swaps NVM Banks
NVMCTRL_MainCallbackRegister | Sets the pointer to the function (and it's context) to be called when an operation on the Flash is complete, provided the corresponding interrupt is enabled
NVMCTRL_SmartEEPROM_IsBusy | Checks whether SmartEEPROM is ready to perform next command
NVMCTRL_SmartEepromStatusGet | Returns status conditions of SmartEEPROM
NVMCTRL_SmartEEPROM_IsActiveSectorFull | Check whether active sector used by the SmartEEPROM is full
NVMCTRL_SmartEepromSectorReallocate | Performs sector reallocation for the SmartEEPROM
NVMCTRL_SmartEepromFlushPageBuffer | Flush SmartEEPROM data when in buffered mode
NVMCTRL_SmartEEPROMCallbackRegister | Sets the pointer to the function (and it's context) to be called when an operation on the SmartEEPROM is complete, provided the corresponding interrupt is enabled
NVMCTRL_EnableMainFlashInterruptSource | Enables a given interrupt source for the Flash
NVMCTRL_DisableMainFlashInterruptSource | Disables a given interrupt source for the Flash
NVMCTRL_EnableSmartEepromInterruptSource | Enables a given interrupt source for the SmartEEPROM
NVMCTRL_DisableSmartEepromInterruptSource | Disables a given interrupt source for the SmartEEPROM
NVMCTRL_PageBufferWrite | Writes data to the internal buffer of NVM known as the page buffer
NVMCTRL_PageBufferCommit | Commits the data present in NVM internal page buffer to flash memory

Data types and constants

Name | Type | Description
--- | --- | ---
NVMCTRL_FLASH_START_ADDRESS | Macro | Defines the start address of NVMCTRL Flash
NVMCTRL_FLASH_SIZE | Macro | Defines the size (in bytes) of Flash
NVMCTRL_FLASH_PAGESIZE | Macro | Defines the size (in bytes) of a NVMCTRL Page
NVMCTRL_FLASH_BLOCKSIZE | Macro | Defines the size (in bytes) of a NVMCTRL Block
NVMCTRL_WRITEMODE | Enum | Defines the NVMCTRL Write Modes
NVMCTRL_INTERRUPT0_SOURCE | Enum | Defines the Interrupt sources for the main flash
NVMCTRL_INTERRUPT1_SOURCE | Enum | Defines the Interrupt sources for the SmartEEPROM
NVMCTRL_CALLBACK | Typedef | Defines the data type and function signature for the NVMCTRL peripheral callback function