1.3.15 1.5.14 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

The main Flash memory can not be read while it is being erased or written, the CPU is stalled during the entire operation.

  • All functions that modify the main Flash can be run from RAM memory to avoid CPU stall while main main Flash is being erased or written.

  • Some devices has the Flash region that support read-while-write feature, it is called Data Flash. The user could execute code from main Flash while the the Data Flash is being erased or written.

The FLASH memory is divided into a number of physical rows, each containing four identically sized flash pages. Pages may be read or written to individually, however pages must be erased before being reprogrammed and the smallest granularity available for erasure is one single row.

NVM APIs are implemented to be non-blocking, the API will return immediately unless stalled by Flash operation. The user application can either use polling or callback method to indicate the transfer status.

  • With polling, the application will need to continuously check if the flash operation is completed.

  • With callback, the registered callback function will be called once the flash operation is completed. This means the application do not have to poll continuously.

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

// Define a constant array in Flash.
// It must be aligned to row boundary and size has to be in multiple of rows
const uint8_t nvm_user_start_address[NVMCTRL_FLASH_ROWSIZE] __attribute__((aligned(NVMCTRL_FLASH_ROWSIZE),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 row */
    NVMCTRL_RowErase((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_PageWrite Writes one page of data to given NVM address
NVMCTRL_RowErase Erases a Row in the NVM
NVMCTRL_ErrorGet Returns the error state 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_DATA_FLASH_Read Reads length number of bytes from a given address in Data FLASH memory
NVMCTRL_DATA_FLASH_PageWrite Writes one page of data to given DATA_FLASH address
NVMCTRL_DATA_FLASH_RowErase Erases a Row in the DATA_FLASH
NVMCTRL_CallbackRegister Sets the pointer to the function (and it's context) to be called when the operation is complete
NVMCTRL_CacheInvalidate Invalidates all cache lines
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_ROWSIZE Macro Defines the size (in bytes) of a NVMCTRL Row
NVMCTRL_DATA_FLASH_START_ADDRESS Macro Defines the start address of NVMCTRL DATA_FLASH
NVMCTRL_DATA_FLASH_SIZE Macro Defines the size (in bytes) of DATA_FLASH
NVMCTRL_DATA_FLASH_PAGESIZE Macro Defines the size (in bytes) of a NVMCTRL DATA_FLASH Page
NVMCTRL_DATA_FLASH_ROWSIZE Macro Defines the size (in bytes) of a NVMCTRL DATA_FLASH Row
NVMCTRL_ERROR Enum Defines the NVMCTRL Error Type
NVMCTRL_CALLBACK Typedef Defines the data type and function signature for the NVMCTRL peripheral callback function