# Firmware Resource Usage

The firmware uses the Arm Cortex-M33 processor system stack. It expects that the Arm Cortex-M33 processor's stack pointer points to a valid stack that grows downward (i.e., decreasing memory addresses).

Other system memory used by the system are listed in the "Reserved Resources" table.

Table: Reserved Resources
Reservation | Addresses | Notes
--- | --- | ---
NVR0 to NVR3 | 0x00080000 to 0x000803FF | CryptoCell-312 support records and tables
NVR6 | 0x00080600 to 0x000806FF | System custom trim records. Firmware and sample applications use these records if available when the Sys_Trim_LoadCustom() function is called, selecting defaults for trim settings if they are not available. Optional contents include: 0x80600 : 4-byte signature consisting of four ASCII encoded capital letters or numbers SIP*, TRR* signatures are reserved for use by onsemi. 0x80604 : 4-byte ICH_TRIM To be stored to ACS_VCC_CTRL_ICH_TRIM in the ACS_VCC_CTRL register (valid range is 0x00000000 to 0x0000000F). 0x80608 : 4-byte XTAL_TRIM To be stored to RF_REG2E_XTAL_TRIM_XTAL_TRIM in the RF_REG2E register (valid range is 0x00000000 to 0x000000FF). 0x806F0: 4-byte Unix-style test timestamp 0x806FC : CRC32 calculated over 0x80600 to 0x806FB Trims are considered available if all of the following are true: The signature is valid The calculated CRC is correct The provided trim is within the valid range.
NVR7 | 0x00080700 to 0x000807FF | Trim records; accessible using the TRIM_Type structure from rsl15_map.h
MNVR | 0x00080800 to 0x000808FF | Manufacturing and manufacturing trim records; cannot be modified outside of manufacturing.
FLASH_RSVD | 0x00158000 to 0x00158BFF | Arm CryptoCell-312 DEU transfer space
FLASH_BOND_RSVD | 0x00158C00 to 0x001593FF | Recommended location for Bluetooth Low Energy bond information
SystemCoreClock | 0x20000000 to 0x20000003 | Reserved for mandatory global variable required by CMSIS.
ROM Status | 0x20000004 to 0x20000013 | Program ROM status variables
ROM Reserved (Flash Library) | 0x20000014 to 0x20000017 | Reserved for ROM-linked flash library

Other system components (DMA channels, LSAD inputs, etc.) that are used by the firmware are noted in the documentation for the specific component.

Some RSL15 product variants might have additional custom trim values stored in the NVR6 region. Sample codes in the SDK include the SYS_TRIM_LOAD_CUSTOM() macro function, which reads and applies those values.

In detail, the SYS_TRIM_LOAD_CUSTOM() function reads the custom value of the DC-DC inductor charge current trim and the custom value of the XTAL 48 MHz oscillator trim, and loads them into corresponding registers (the ICH_TRIM field of the ACS_VCC_CTRL register, the RF_REG2E_XTAL_TRIM_XTAL_TRIM_INIT field of the RF_REG2E register, and the RF_REG2E_XTAL_TRIM_XTAL_TRIM field of the same register) if all of the following conditions are met:

- A custom flash value identifier, CUST or SIP1, is found.
- CRC value is verified correctly.
- Valid trim values are found.

When the custom flash value identifier is not found, no custom flash value has been programmed. As a result, the SYS_TRIM_LOAD_CUSTOM() function returns without reading or loading any trim values as mentioned above. In other words, in this case, default trim values will be used.

NOTE: Only call the SYS_TRIM_LOAD_CUSTOM() function after the RF block is powered. If it is called before the RF block is powered, and the device has been programmed with valid contents in its NVR6, a hardfault results, and the device gets reset.