33. Debug support (DBG)

33.1 Overview

The STM32L0x3 devices are built around a Cortex ® -M0+ core which contains hardware extensions for advanced debugging features. The debug extensions allow the core to be stopped either on a given instruction fetch (breakpoint) or data access (watchpoint). When stopped, the core’s internal state and the system’s external state may be examined. Once examination is complete, the core and the system may be restored and program execution resumed.

The debug features are used by the debugger host when connecting to and debugging the STM32L0x3 MCUs.

One interface for debug is available:

Figure 315. Block diagram of STM32L0x3 MCU and Cortex ® -M0+-level debug support

Block diagram of STM32L0x3 MCU and Cortex-M0+-level debug support. The diagram shows the STM32 MCU debug support block containing a Cortex-M0 debug support sub-block. External signals SWDIO and SWCLK enter a SW-DP block. The Cortex-M0 debug support includes the Cortex-M0 Core, a Bus matrix, and a Debug AP. The Bus matrix connects to a System interface. The Debug AP connects to a Bridge, NVIC, DWT, and BPU. The Bridge further connects to a DBGMCU block. The diagram is labeled MS19240V2.
Block diagram of STM32L0x3 MCU and Cortex-M0+-level debug support. The diagram shows the STM32 MCU debug support block containing a Cortex-M0 debug support sub-block. External signals SWDIO and SWCLK enter a SW-DP block. The Cortex-M0 debug support includes the Cortex-M0 Core, a Bus matrix, and a Debug AP. The Bus matrix connects to a System interface. The Debug AP connects to a Bridge, NVIC, DWT, and BPU. The Bridge further connects to a DBGMCU block. The diagram is labeled MS19240V2.
  1. 1. The debug features embedded in the Cortex ® -M0+ core are a subset of the Arm ® CoreSight Design Kit.

The Arm ® Cortex ® -M0+ core provides integrated on-chip debug support. It is comprised of:

It also includes debug features dedicated to the STM32L0x3 microcontrollers:

Note: For further information on debug functionality supported by the Arm ® Cortex ® -M0+ core, refer to the Cortex ® -M0+ Technical Reference Manual (see Section 33.2: Reference Arm ® documentation ).

33.2 Reference Arm ® documentation

33.3 Pinout and debug port pins

The STM32L0x3 MCUs are available in various packages with different numbers of available pins.

33.3.1 SWD port pins

Two pins are used as outputs for the SW-DP as alternate functions of general purpose I/Os. These pins are available on all packages.

Table 172. SW debug port pins

SW-DP pin nameSW debug portPin assignment
TypeDebug assignment
SWDIOIOSerial Wire Data Input/OutputPA13
SWCLKISerial Wire ClockPA14

33.3.2 SW-DP pin assignment

After reset (SYSRESETn or PORESETn), the pins used for the SW-DP are assigned as dedicated pins which are immediately usable by the debugger host.

However, the MCU offers the possibility to disable the SWD port and can then release the associated pins for general-purpose I/O (GPIO) usage. For more details on how to disable SW-DP port pins, please refer to Section 9.3.2: I/O pin alternate function multiplexer and mapping on page 240 .

33.3.3 Internal pull-up & pull-down on SWD pins

Once the SW I/O is released by the user software, the GPIO controller takes control of these pins. The reset states of the GPIO control registers put the I/Os in the equivalent states:

Embedded pull-up and pull-down resistors remove the need to add external resistors.

33.4 ID codes and locking mechanism

There are several ID codes inside the MCU. ST strongly recommends the tool manufacturers to lock their debugger using the MCU device ID located at address 0x40015800.

33.4.1 MCU device ID code

The STM32L0x3 products integrate an MCU ID code. This ID identifies the ST MCU part number and the die revision.

This code is accessible by the software debug port (two pins) or by the user software.

Only the DEV_ID[15:0] should be used for identification by the debugger/programmer tools (the revision ID must not be taken into account).

For code example, refer to A.20.1: DBG read device Id code example .

DBG_IDCODE

Address: 0x4001 5800

Only 32-bit access supported. Read-only

31302928272625242322212019181716
REV_ID
rrrrrrrrrrrrrrrr
1514131211109876543210
Res.Res.Res.Res.DEV_ID
rrrrrrrrrrr

Bits 31:16 REV_ID[15:0] : Revision identifier

This field indicates the revision of the device (see Table 173: REV_ID values ).

Bits 15:12 Reserved: read 0b0110.

Bits 11:0 DEV_ID[11:0] : Device identifier

This field indicates the device ID:

Category 3 devices: 0x417

Category 5 devices: 0x447

Table 173. REV_ID values

REV_IDCat. 3 devicesCat. 5 devices
0x1000Rev A
0x1008Rev Z-
0x1018Rev Y-
0x1038Rev 1, P, Q, X-
0x2000-Rev B
0x2008-Rev 1, P, Q, Z

33.5 SWD port

33.5.1 SWD protocol introduction

This synchronous serial protocol uses two pins:

The protocol allows two banks of registers (DPACC registers and APACC registers) to be read and written to.

Bits are transferred LSB-first on the wire.

For SWDIO bidirectional management, the line must be pulled-up on the board (100 k \( \Omega \) recommended by Arm ® ). These pull-up resistors can be configured internally. No external pull-up resistors are required. .

Each time the direction of SWDIO changes in the protocol, a turnaround time is inserted where the line is not driven by the host nor the target. By default, this turnaround time is one bit time, however this can be adjusted by configuring the SWCLK frequency.

33.5.2 SWD protocol sequence

Each sequence consist of three phases:

  1. 1. Packet request (8 bits) transmitted by the host
  2. 2. Acknowledge response (3 bits) transmitted by the target
  3. 3. Data transfer phase (33 bits) transmitted by the host or the target

Table 174. Packet request (8-bits)

BitNameDescription
0StartMust be “1”
1APnDP0: DP Access
1: AP Access
2RnW0: Write Request
1: Read Request
4:3A[3:2]Address field of the DP or AP registers (refer to Table 178 on page 960 )
Table 174. Packet request (8-bits) (continued)
BitNameDescription
5ParitySingle bit parity of preceding bits
6Stop0
7ParkNot driven by the host. Must be read as “1” by the target because of the pull-up

Refer to the Cortex ® -M0+ TRM for a detailed description of DPACC and APACC registers.

The packet request is always followed by the turnaround time (default 1 bit) where neither the host nor target drive the line.

Table 175. ACK response (3 bits)
BitNameDescription
0..2ACK001: FAULT
010: WAIT
100: OK

The ACK Response must be followed by a turnaround time only if it is a READ transaction or if a WAIT or FAULT acknowledge has been received.

Table 176. DATA transfer (33 bits)
BitNameDescription
0..31WDATA or RDATAWrite or Read data
32ParitySingle parity of the 32 data bits

The DATA transfer must be followed by a turnaround time only if it is a READ transaction.

33.5.3 SW-DP state machine (reset, idle states, ID code)

The State Machine of the SW-DP has an internal ID code which identifies the SW-DP. It follows the JEP-106 standard. This ID code is the default Arm ® one and is set to 0x0BC1 1477 (corresponding to Cortex ® -M0+).

Note: Note that the SW-DP state machine is inactive until the target reads this ID code.

Further details of the SW-DP state machine can be found in the Cortex ® -M0+ TRM and the CoreSight Design Kit r1p0 TRM.

33.5.4 DP and AP read/write accesses

33.5.5 SW-DP registers

Access to these registers are initiated when APnDP=0

Table 177. SW-DP registers

A[3:2]R/WCTRLSEL bit of SELECT registerRegisterNotes
00ReadIDCODEThe manufacturer code is set to the default Arm® code for Cortex®-M0+: 0x0BC1 1477 (identifies the SW-DP)
00WriteABORT
01Read/Write0DP-CTRL/STATPurpose is to:
  • – request a system or debug power-up
  • – configure the transfer operation for AP accesses
  • – control the pushed compare and pushed verify operations.
  • – read some status flags (overrun, power-up acknowledges)
01Read/Write1WIRE CONTROLPurpose is to configure the physical serial port protocol (like the duration of the turnaround time)
10ReadREAD RESENDEnables recovery of the read data from a corrupted debugger transfer, without repeating the original AP transfer.

Table 177. SW-DP registers (continued)

A[3:2]R/WCTRLSEL bit of SELECT registerRegisterNotes
10WriteSELECTThe purpose is to select the current access port and the active 4-words register window
11Read/WriteREAD BUFFERThis read buffer is useful because AP accesses are posted (the result of a read AP request is available on the next AP transaction).
This read buffer captures data from the AP, presented as the result of a previous read, without initiating a new transaction

33.5.6 SW-AP registers

Access to these registers are initiated when APnDP=1

There are many AP Registers addressed as the combination of:

Table 178. 32-bit debug port registers addressed through the shifted value A[3:2]

AddressA[3:2] valueDescription
0x000Reserved, must be kept at reset value.
0x401DP CTRL/STAT register. Used to:
– Request a system or debug power-up
– Configure the transfer operation for AP accesses
– Control the pushed compare and pushed verify operations.
– Read some status flags (overrun, power-up acknowledges)
0x810DP SELECT register: Used to select the current access port and the active 4-words register window.
– Bits 31:24: APSEL: select the current AP
– Bits 23:8: reserved
– Bits 7:4: APBANKSEL: select the active 4-words register window on the current AP
– Bits 3:0: reserved
0xC11DP RDBUFF register: Used to allow the debugger to get the final result after a sequence of operations (without requesting new JTAG-DP operation)

33.6 Core debug

Core debug is accessed through the core debug registers. Debug access to these registers is by means of the debug access port. It consists of four registers:

Table 179. Core debug registers

RegisterDescription
DHCSRThe 32-bit Debug Halting Control and Status Register
This provides status information about the state of the processor enable core debug halt and step the processor
DCRSRThe 17-bit Debug Core Register Selector Register:
This selects the processor register to transfer data to or from.
DCRDRThe 32-bit Debug Core Register Data Register:
This holds data for reading and writing registers to and from the processor selected by the DCRSR (Selector) register.
DEMCRThe 32-bit Debug Exception and Monitor Control Register:
This provides Vector Catching and Debug Monitor Control.

These registers are not reset by a system reset. They are only reset by a power-on reset. Refer to the Cortex ® -M0+ TRM for further details.

To Halt on reset, it is necessary to:

33.7 BPU (Break Point Unit)

The Cortex ® -M0+ BPU implementation provides four breakpoint registers. The BPU is a subset of the Flash Patch and Breakpoint (FPB) block available in Armv7-M (Cortex ® -M3 and Cortex ® -M4).

33.7.1 BPU functionality

The processor breakpoints implement PC based breakpoint functionality.

Refer the Armv6-M Arm ® and the Arm ® CoreSight Components Technical Reference Manual for more information about the BPU CoreSight identification registers, and their addresses and access types.

33.8 DWT (Data Watchpoint)

The Cortex ® -M0+ DWT implementation provides two watchpoint register sets.

33.8.1 DWT functionality

The processor watchpoints implement both data address and PC based watchpoint functionality, a PC sampling register, and support comparator address masking, as described in the Armv6-M Arm ® .

33.8.2 DWT Program Counter Sample Register

A processor that implements the data watchpoint unit also implements the Armv6-M optional DWT Program Counter Sample Register (DWT_PCSR). This register permits a debugger to periodically sample the PC without halting the processor. This provides coarse grained profiling. See the Armv6-M Arm ® for more information.

The Cortex ® -M0+ DWT_PCSR records both instructions that pass their condition codes and those that fail.

33.9 MCU debug component (DBG)

The MCU debug component helps the debugger provide support for:

33.9.1 Debug support for low-power modes

To enter low-power mode, the instruction WFI or WFE must be executed.

The MCU implements several low-power modes which can either deactivate the CPU clock or reduce the power of the CPU.

The core does not allow FCLK or HCLK to be turned off during a debug session. As these are required for the debugger connection, during a debug, they must remain active. The MCU integrates special means to allow the user to debug software in low-power modes.

For this, the debugger host must first set some debug configuration registers to change the low-power mode behavior:

This enables the internal RC oscillator clock to feed FCLK and HCLK in Stop mode.

When one of the DBG_STANDBY, DBG_STOP and DBG_SLEEP bit is set and the internal reference voltage is stopped in low-power mode (ULP bit set in PWR_CR register), then the Fast wakeup must be enabled (FWU bit set in PWR_CR).

For code example, refer to A.20.2: DBG debug in LPM code example .

33.9.2 Debug support for timers, watchdog and I 2 C

During a breakpoint, it is necessary to choose how the counter of timers and watchdog should behave:

For the I 2 C, the user can choose to block the SMBUS timeout during a breakpoint.

33.9.3 Debug MCU configuration register (DBG_CR)

The DBG_CR register allows to configure the low-power modes when the MCU is under debug. When one of DBG_CR bits is set, if ULP bit is set in PWR_CR, then FWU bit of PWR_CR must be set.

It is mapped at address 0x4001 5804.

This register is asynchronously reset by the PORESET (and not the system reset). It can be written by the debugger under system reset.

If the debugger host does not support these features, it is still possible for the user software to write to these registers.

Address: 0x04

Only 32-bit access supported

POR Reset: 0x0000 0000 (not reset by system reset)

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DBG_STANDBYDBG_STOPDBG_SLEEP
rwrwrw

Bits 31:3 Reserved, must be kept at reset value.

Bit 2 DBG_STANDBY : Debug Standby mode

0: (FCLK=Off, HCLK=Off) The whole digital part is unpowered.

From software point of view, exiting from Standby is identical than fetching reset vector (except a few status bit indicated that the MCU is resuming from Standby)

1: (FCLK=On, HCLK=On) In this case, the digital part is not unpowered and FCLK and HCLK are provided by the internal RC oscillator which remains active. In addition, the MCU generate a system reset during Standby mode so that exiting from Standby is identical than fetching from reset

Bit 1 DBG_STOP : Debug Stop mode

0: (FCLK=Off, HCLK=Off) In Stop mode, the clock controller disables all clocks (including HCLK and FCLK). When exiting from Stop mode, the clock configuration is identical to the one after RESET. Consequently, the software must reprogram the clock controller to enable the PLL, the Xtal, etc.

1: (FCLK=On, HCLK=On) In this case, when entering Stop mode, FCLK and HCLK are provided by the internal RC oscillator which remains active in Stop mode. When exiting Stop mode, the software must reprogram the clock controller to enable the PLL, the Xtal, etc. (in the same way it would do in case of DBG_STOP=0)

Bit 0 DBG_SLEEP : Debug Sleep mode

0: In Sleep mode, FCLK is clocked by the system clock previously configured by the software while HCLK is disabled. The clock controller configuration is not reset and remains in its previously programmed state. As a consequence, when exiting from Sleep mode, the software does not need to reconfigure the clock controller.

1: In this case, when entering in Sleep mode, HCLK is fed by the same clock that is provided to FCLK (system clock previously configured by the software).

33.9.4 Debug MCU APB1 freeze register (DBG_APB1_FZ)

The DBG_APB1_FZ register is used to configure the following APB peripherals, when the MCU under debug:

This register is mapped at address 0x4001 5808.

The register is asynchronously reset by the POR (and not the system reset). It can be written by the debugger under system reset.

Address offset: 0X08

Only 32-bit access are supported.

Power on reset (POR): 0x0000 0000 (not reset by system reset)

31302928272625242322212019181716
DBG_LPTIMER_STOPDBG_I2C3_STOPRes.Res.Res.Res.Res.Res.Res.Res.DBG_I2C1_STOPRes.Res.Res.Res.Res.
r/wr/wr/w
1514131211109876543210
Res.Res.Res.DBG_IWDG_STOPDBG_WWDG_STOPDBG_RTC_STOPRes.Res.Res.Res.DBG_TIM7_STOPDBG_TIM6_STOPRes.Res.DBG_TIM3_STOPDBG_TIM2_STOP
r/wr/wr/wr/wr/wr/wr/w

Bit 31 DBG_LPTIMER_STOP : LPTIM1 counter stopped when core is halted

Bit 30 DBG_I2C3_STOP : I2C3 SMBUS timeout mode stopped when core is halted

Bits 29:22 Reserved, must be kept at reset value.

Bit 21 DBG_I2C1_STOP : I2C1 SMBUS timeout mode stopped when core is halted

Bits 20:13 Reserved, must be kept at reset value.

Bit 12 DBG_IWDG_STOP : Debug independent watchdog stopped when core is halted

  1. Bit 11 DBG_WWDG_STOP : Debug window watchdog stopped when core is halted
    • 0: The window watchdog counter clock continues even if the core is halted
    • 1: The window watchdog counter clock is stopped when the core is halted
  2. Bit 10 DBG_RTC_STOP : Debug RTC stopped when core is halted
    • 0: The clock of the RTC counter is fed even if the core is halted
    • 1: The clock of the RTC counter is stopped when the core is halted
  3. Bits 9:6 Reserved, must be kept at reset value.
  4. Bit 5 DBG_TIM7_STOP : TIM7 counter stopped when core is halted
    • 0: The counter clock of TIM7 is fed even if the core is halted
    • 1: The counter clock of TIM7 is stopped when the core is halted
  5. Bit 4 DBG_TIM6_STOP : TIM6 counter stopped when core is halted
    • 0: The counter clock of TIM6 is fed even if the core is halted
    • 1: The counter clock of TIM6 is stopped when the core is halted
  6. Bits 3:2 Reserved, must be kept at reset value.
  7. Bit 1 DBG_TIM3_STOP : TIM3 counter stopped when core is halted
    • 0: The counter clock of TIM3 is fed even if the core is halted
    • 1: The counter clock of TIM3 is stopped when the core is halted
  8. Bit 0 DBG_TIM2_STOP : TIM2 counter stopped when core is halted
    • 0: The counter clock of TIM2 is fed even if the core is halted
    • 1: The counter clock of TIM2 is stopped when the core is halted

33.9.5 Debug MCU APB2 freeze register (DBG_APB2_FZ)

The DBG_APB2_FZ register is used to configure some APB peripheral features when the MCU is under DEBUG:

This register is mapped at address 0x4001580C.

It is asynchronously reset by the POR (and not the system reset). It can be written by the debugger under system reset.

Address: 0x0C

Only 32-bit access is supported.

POR: 0x0000 0000 (not reset by system reset)

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DBG_TIM22_STOPRes.Res.DBG_TIM21_STOPRes.Res.
rwrw

Bits 31:6 Reserved, must be kept at reset value.

Bit 5 DBG_TIM22_STOP : TIM22 counter stopped when core is halted

0: The counter clock of TIM22 is fed even if the core is halted

1: The counter clock of TIM22 is stopped when the core is halted

Bits 4:3 Reserved, must be kept at reset value.

Bit 2 DBG_TIM21_STOP : TIM21 counter stopped when core is halted

0: The counter clock of TIM21 is fed even if the core is halted

1: The counter clock of TIM21 is stopped when the core is halted

Bits 1:0 Reserved, must be kept at reset value.

33.10 DBG register map

The following table summarizes the Debug registers.

Table 180. DBG register map and reset values

Addr.Register313029282726252423222120191817161514131211109876543210
0x40015800DBG_IDCODEREV_IDRes.Res.Res.Res.DEV_ID
Reset value (1)XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0x40015804DBG_CRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.ooo
Reset valueooo
0x40015808DBG_APB1_FZDBG_LPTIMER_STOPDBG_I2C3_STOPRes.Res.Res.Res.Res.Res.Res.Res.DBG_I2C1_STOPRes.Res.Res.Res.Res.Res.Res.Res.DBG_WDG_STOPDBG_WWDG_STOPDBG_RTC_STOPRes.Res.Res.Res.Res.Res.DBG_TIM7_STOPDBG_TIM6_STOPRes.Res.DBG_TIM3_STOP
Reset valueoooooooooo
0x4001580CDBG_APB2_FZRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.ooRes.Res.o
Reset valueooo

1. The reset value is product dependent. For more information, refer to Section 33.4.1: MCU device ID code .