MTB specifics

From SEGGER - Support Wiki
Jump to: navigation, search

The ARM Micro Trace Buffer (MTB) is an on-chip trace buffer that allows to do post-mortem instruction trace via a regular J-Link with no need of a specific J-Trace unit. The MTB will use a specific amount of the on-chip RAM to store trace data while the core executes instructions. MTB is mainly used on smaller MCUs like Cortex-M0+/M23/M33 based ones.


MTB is a very limited version of trace that has the following limitations:

  • Instruction trace support only
  • No streaming trace possible
  • A portion of the target RAM may not be used by the application if MTB is used

RAM usage

Most MTBs have a trace buffer between 2 KB and 8 KB. By default, J-Link uses 512 bytes for MTB, starting at the MTB_BASE addr.

Configuration options provided by J-Link

An MTB consists of the following registers / bit fields that allow configuration of the MTB and the amount of RAM it uses:

Register / Bit field Description
MTB_BASE 32-bit register that specifies the base address of the MTB buffer
MTB_POINTER 32-bit register that specifies the offset (rel. to BASE) where the next trace packet will be stored by the HW
MTB_MASTER.MASK 5-bit bitfield that specifies the wrap-around point for the auto-inc logic of the MTB, on packet store.

While the MTB_BASE register is read-only for J-Link, the MTB_POINTER and MTB_MASTER.MASK can be written by J-Link. This allows the MTB RAM usage to be configured.


Specifies the wrap-around point for the auto-inc logic of the MTB, on packet store. MASK specifies the MSB that exists in the buffer. A MASK Value of 7 means that bits 0-7 exist in the buffer, which means a max. value (buffer size) of 0xFF + 1 = 0x100. If the increment causes POINTER[MASK:MASK] to change from 1 to 0, POINTER[MASK:0] will be changed to 0, while leaving the rest of POINTER untouched(!). The MASK value is stored as MASK - 4 because the MTB buffer size has to be a multiple of 16 bytes anyhow.

Example calculation:

  • 1 KB of RAM shall be used
  • 1 KB = 0x400 (MSB == bit 10, counting starts at bit 0)
  • MASK = 9 (Stored in register as: 10 - 4 = 6)
  • Buffer usage: 0x0 - 0x3FF

Default J-Link config

  1. J-Link reads out MTB_BASE to determine the base addr. of the MTB buffer
  2. J-Link writes the POINTER register to find out the MTB buffer size
  3. J-Link sets the POINTER register to 0 to start using the MTB buffer at MTB_BASE
  4. J-Link sets the MTB_MASTER.MASK to 4 to provide a 512 byte wrap-around (setting the RAM usage to 512 bytes, starting at MTB_BASE)

Command strings for MTB configuration

The following J-Link command strings are available for MTB configuration:

Command string Min. J-Link software version Description
CORESIGHT_SetMTBBaseAddr V5.10m Specifies where to find the MTB in the debug address space. Only needed in case the ROM table of the device is defect and does not allow auto-discovery of the MTB component
CORESIGHT_SetMTBBufBaseAddr V6.20g Specifies the base address of the MTB buffer (RAM that may be used by MTB). This is only needed for devices where the MTB_BASE register returns an incorrect address. (E.g. on the NXP KL26Z series devices)
CORESIGHT_SetMTBBufUseAddr V6.33i Specifies where the MTB shall start using the RAM. This address may be greater than MTB_BASE but must be within the bound of MTB_BASE + MaxBufSize - 16
CORESIGHT_SetMTBBufUsageSize V6.33i Specifies max. RAM usage for MTB. This must not exceed the max. usage size indicated by MTB_POINTER


  • For more information about how to use J-Link command strings, please refer to Using J-Link Command Strings
  • All command strings from above may only be passed after a connection to the target has been established successfully

Example configurations

In the following, some example configurations for different MTB configurations are given. The examples assume that:

  • J-Link can auto-discover the MTB component in the debug address space
  • J-Link can detect the base address of the MTB buffer via MTB_BASE register
  • J-Link can detect the max. RAM usage of MTB via the MTB_POINTER register

Target RAM = 0x20000000-0x20005FFF (24 KB)
MTB_BASE = 0x20004000
MTB max. RAM usage = 0x2000


MTB RAM usage: 0x20004000 - 0x200041FF (512 bytes)

Change RAM usage

Command string Value
CORESIGHT_SetMTBBufUsageSize 0x400

MTB RAM usage: 0x20004000 - 0x200043FF (1 KB)

Change RAM usage and start address

Command string Value
CORESIGHT_SetMTBBufUseAddr 0x20005C00
CORESIGHT_SetMTBBufUsageSize 0x400

MTB RAM usage: 0x20005C00 - 0x20005FFF (1 KB)