2. Memory and bus architecture
2.1 System architecture
The main system consists of:
- • Two masters:
- – Cortex ® -M0+ core
- – General-purpose DMA
- • Three slaves:
- – Internal SRAM
- – Internal flash memory
- – AHB with AHB-to-APB bridge that connects all the APB peripherals
These are interconnected using a multilayer AHB bus architecture as shown in Figure 1 .
Figure 1. System architecture

The diagram illustrates the system architecture. At the center is a 'Bus matrix'. To its left, the 'Arm ® Cortex ® -M0+ core' is connected via a 'System bus', and 'GPIO Ports A,B,C,D,E,F' are connected via 'IOPORT'. Below the core, 'DMA1/2 DMAMUX channels 1 to 12' are connected via a 'DMA bus'. The 'Bus matrix' is connected to 'Flash memory interface' and 'SRAM' via the 'System bus'. The 'Bus matrix' is also connected to an 'AHB-to-APB bridge' via an 'AHB' bus. The 'AHB-to-APB bridge' is connected to a large block of 'APB' peripherals via an 'APB' bus. The 'AHB' bus also connects to 'CRC', 'AES', and 'EXTI' blocks. The 'APB' peripherals block includes: SYSCFG, ADC, DAC, COMP1, COMP2, COMP3, TIM1, TIM2, TIM3, TIM4, TIM6, TIM7, TIM14 to TIM17, LPTIM1, LPTIM2, UCPD1, UCPD2, IWDG, WWDG, RTC, PWR, I2C1, I2C2, I2C3, USART1 to USART6, LPUART1, LPUART2, SPI1/I2S1, SPI2/I2S2, SPI3, USB, FDCAN, HDMI-CEC, and DBG. 'RCC' and 'RNG' blocks are also connected to the 'AHB' bus. 'DMA requests' are shown from the 'CRC', 'AES', and 'EXTI' blocks to the 'DMA1/2 DMAMUX channels 1 to 12'.
System bus (S-bus)
This bus connects the system bus of the Cortex ® -M0+ core (peripheral bus) to a bus matrix that manages the arbitration between the core and the DMA.
DMA bus
This bus connects the AHB master interface of the DMA to the bus matrix that manages the access of CPU and DMA to SRAM, flash memory and AHB/APB peripherals.
Bus matrix
The bus matrix manages the access arbitration between the core system bus and the DMA master bus. The arbitration uses a Round Robin algorithm. The bus matrix is composed of masters (CPU, DMA) and slaves (flash memory interface, SRAM and AHB-to-APB bridge).
AHB peripherals are connected on system bus through the bus matrix to allow DMA access.
AHB-to-APB bridge (APB)
The AHB-to-APB bridge provides full synchronous connections between the AHB and the APB bus.
Refer to Section 2.2: Memory organization for the address mapping of the peripherals connected to this bridge.
After each device reset, all peripheral clocks are disabled (except for the SRAM and flash memory). Before using a peripheral its clock in the RCC_AHBENR, RCC_APBENRx or RCC_IOPENR register must first be enabled.
Note: When a 16- or 8-bit access is performed on an APB register, the access is transformed into a 32-bit access: the bridge duplicates the 16- or 8-bit data to feed the 32-bit vector.
2.2 Memory organization
2.2.1 Introduction
Program memory, data memory, registers and I/O ports are organized within the same linear 4-Gbyte address space.
The bytes are coded in memory in Little Endian format. The lowest numbered byte in a word is considered the word's least significant byte and the highest numbered byte the most significant.
The addressable memory space is divided into eight main blocks, of 512 Mbytes each.
2.2.2 Memory map and register boundary addresses
Figure 2. Memory map

The diagram illustrates the memory map for the STM32G0 series microcontrollers. It is divided into three main columns: Addressable space, Used space, and Reserved space. The Addressable space column shows blocks 0 through 7, starting from 0x0000 0000 at the bottom to 0xFFFF FFFF at the top. The Used space column lists the actual memory and peripheral allocations, including Code, RAM, Peripherals, System memory, Main Flash memory, Option bytes, Engineering bytes, OTP, IOPORT, AHB, and APB. The Reserved space column shows the upper address limits for each allocation. A legend at the top indicates that white boxes represent 'Used space' and grey boxes represent 'Reserved space'.
| Addressable space | Used space | Reserved space |
|---|---|---|
| 0x0000 0000 | Main Flash memory / System memory / RAM (3) | 0x0000 0000 |
| block 0 | Main Flash memory | 0x0800 0000 |
| 0x2000 0000 | RAM | (2) |
| block 1 | System memory | 0x1FFF 0000 |
| 0x4000 0000 | Peripherals | 0x1FFF 7000 |
| block 2 | OTP | 0x1FFF 73FF |
| 0x6000 0000 | Engineering bytes | 0x1FFF 7500 |
| block 3 | Option bytes | 0x1FFF 7800 |
| 0x8000 0000 | APB | 0x4000 0000 |
| block 4 | APB | 0x4001 0000 |
| 0xA000 0000 | ARM Cortex M0+ internal peripherals | 0x4001 5BFF |
| block 5 | AHB | 0x4002 0000 |
| 0xC000 0000 | IOPORT | 0x4002 63FF |
| block 6 | 0x5000 0000 | |
| 0xE000 0000 | 0x5000 1FFF | |
| block 7 | ||
| 0xFFFF FFFF |
- 1. STM32G0B1xx and STM32G0C1xx: 0x0007 FFFF; STM32G071xx and STM32G081xx: 0x0001 FFFF; STM32G051xx and STM32G061xx, STM32G031xx and STM32G041xx: 0x0000 FFFF.
- 2. STM32G0B1xx and STM32G0C1xx: 0x0807 FFFF; STM32G071xx and STM32G081xx: 0x0801 FFFF; STM32G051xx and STM32G061xx, STM32G031xx and STM32G041xx: 0x0800 FFFF.
- 3. Depends on boot configuration
All the memory map areas that are not allocated to on-chip memories and peripherals are considered as reserved. For the detailed mapping of available memory and register areas, refer to the following tables.
Table 2. STM32G0B1xx and STM32G0C1xx memory boundary addresses| Type | Boundary address | Size | Memory Area | Register description |
|---|---|---|---|---|
| SRAM | 0x2002 4000 - 0x3FFF FFFF | ~512 MB | Reserved | - |
| 0x2000 0000 - 0x2002 3FFF | 144 KB | SRAM | Section 2.3 on page 66 | |
| Code | 0x1FFF 7880- 0x1FFF FFFF | ~34 KB | Reserved | - |
| 0x1FFF 7800 - 0x1FFF 787F | 128 B | Option bytes | Section 3.4 on page 82 | |
| 0x1FFF 7500 - 0x1FFF 77FF | 768 B | Engineering bytes | - | |
| 0x1FFF 7400- 0x1FFF 74FF | 256 B | Reserved | - | |
| 0x1FFF 7000 - 0x1FFF 73FF | 1 KB | OTP | - | |
| 0x1FFF 0000 - 0x1FFF 6FFF | 28 KB | System memory | - | |
| 0x0808 0000 - 0x1FFF D7FF | ~384 MB | Reserved | - | |
| 0x0800 0000 - 0x0807 FFFF | 512 KB | Main flash memory | Section 3.3.1 on page 71 | |
| 0x0008 0000 - 0x07FF FFFF | ~128 MB | Reserved | - | |
| 0x0000 0000 - 0x0007 FFFF | 512 KB | Main flash memory, system memory or SRAM depending on boot configuration | - |
| Type | Boundary address | Size | Memory Area | Register description |
|---|---|---|---|---|
| SRAM | 0x2000 9000 - 0x3FFF FFFF | ~512 MB | Reserved | - |
| 0x2000 0000 - 0x2000 8FFF | 36 KB | SRAM | Section 2.3 on page 66 | |
| Code | 0x1FFF 7880- 0x1FFF FFFF | ~34 KB | Reserved | - |
| 0x1FFF 7800 - 0x1FFF 787F | 128 B | Option bytes | Section 3.4 on page 82 | |
| 0x1FFF 7500 - 0x1FFF 77FF | 768 B | Engineering bytes | - | |
| 0x1FFF 7400- 0x1FFF 74FF | 256 B | Reserved | - | |
| 0x1FFF 7000 - 0x1FFF 73FF | 1 KB | OTP | - | |
| 0x1FFF 0000 - 0x1FFF 6FFF | 28 KB | System memory | - | |
| 0x0802 0000 - 0x1FFF D7FF | ~384 MB | Reserved | - | |
| 0x0800 0000 - 0x0801 FFFF | 128 KB | Main flash memory | Section 3.3.1 on page 71 | |
| 0x0002 0000 - 0x07FF FFFF | ~128 MB | Reserved | - | |
| 0x0000 0000 - 0x0001 FFFF | 128 KB | Main flash memory, system memory or SRAM depending on boot configuration | - |
| Type | Boundary address | Size | Memory Area | Register description |
|---|---|---|---|---|
| SRAM | 0x2000 4800 - 0x3FFF FFFF | ~512 MB | Reserved | - |
| 0x2000 0000 - 0x2000 47FF | 18 KB | SRAM | Section 2.3 on page 66 |
| Type | Boundary address | Size | Memory Area | Register description |
|---|---|---|---|---|
| Code | 0x1FFF 7880- 0x1FFF FFFF | ~34 KB | Reserved | - |
| 0x1FFF 7800 - 0x1FFF 787F | 128 B | Option bytes | Section 3.4 on page 82 | |
| 0x1FFF 7500 - 0x1FFF 77FF | 768 B | Engineering bytes | - | |
| 0x1FFF 7400- 0x1FFF 74FF | 256 B | Reserved | - | |
| 0x1FFF 7000 - 0x1FFF 73FF | 1 KB | OTP | - | |
| 0x1FFF 2000 - 0x1FFF 6FFF | ~20 KB | Reserved | - | |
| 0x1FFF 0000 - 0x1FFF 1FFF | 8 KB | System memory | - | |
| 0x0801 0000 - 0x1FFF D7FF | ~384 MB | Reserved | - | |
| 0x0800 0000 - 0x0800 FFFF | 64 KB | Main flash memory | Section 3.3.1 on page 71 | |
| 0x0001 0000 - 0x07FF FFFF | ~128 MB | Reserved | - | |
| 0x0000 0000 - 0x0000 FFFF | 64 KB | Main flash memory, system memory or SRAM depending on boot configuration | - |
| Type | Boundary address | Size | Memory Area | Register description |
|---|---|---|---|---|
| SRAM | 0x2000 2000 - 0x3FFF FFFF | ~512 MB | Reserved | - |
| 0x2000 0000 - 0x2000 1FFF | 8 KB | SRAM | Section 2.3 on page 66 | |
| Code | 0x1FFF 7880- 0x1FFF FFFF | ~34 KB | Reserved | - |
| 0x1FFF 7800 - 0x1FFF 787F | 128 B | Option bytes | Section 3.4 on page 82 | |
| 0x1FFF 7500 - 0x1FFF 77FF | 768 B | Engineering bytes | - | |
| 0x1FFF 7400- 0x1FFF 74FF | 256 B | Reserved | - | |
| 0x1FFF 7000 - 0x1FFF 73FF | 1 KB | OTP | - | |
| 0x1FFF 2000 - 0x1FFF 6FFF | ~20 KB | Reserved | - | |
| 0x1FFF 0000 - 0x1FFF 1FFF | 8 KB | System memory | - | |
| 0x0801 0000 - 0x1FFF D7FF | ~384 MB | Reserved | - | |
| 0x0800 0000 - 0x0800 FFFF | 64 KB | Main flash memory | Section 3.3.1 on page 71 | |
| 0x0001 0000 - 0x07FF FFFF | ~128 MB | Reserved | - | |
| 0x0000 0000 - 0x0000 FFFF | 64 KB | Main flash memory, system memory or SRAM depending on boot configuration | - |
The following table gives the boundary addresses of the peripherals.
Table 6. STM32G0x1 peripheral register boundary addresses
| Bus | Boundary address | Size | Peripheral | Peripheral register map |
|---|---|---|---|---|
| - | 0xE000 0000 - 0xE00F FFFF | 1MB | Cortex®-M0+ internal peripherals | - |
| IOPORT | 0x5000 1800 - 0x5FFF FFFF | ~256 MB | Reserved | - |
| 0x5000 1400 - 0x5000 17FF | 1 KB | GPIOF | Section 7.5.12 on page 245 | |
| 0x5000 1000 - 0x5000 13FF | 1 KB | GPIOE | Section 7.5.12 on page 245 | |
| 0x5000 0C00 - 0x5000 0FFF | 1 KB | GIOPD | Section 7.5.12 on page 245 | |
| 0x5000 0800 - 0x5000 0BFF | 1 KB | GPIOC | Section 7.5.12 on page 245 | |
| 0x5000 0400 - 0x5000 07FF | 1 KB | GPIOB | Section 7.5.12 on page 245 | |
| 0x5000 0000 - 0x5000 03FF | 1 KB | GPIOA | Section 7.5.12 on page 245 | |
| AHB | 0x4002 6400 - 0x4FFF FFFF | ~256 MB | Reserved | - |
| 0x4002 6000 - 0x4002 63FF | 1 KB | AES | Section 20.7.18 on page 513 | |
| 0x4002 5400 - 0x4002 5FFF | 3 KB | Reserved | - | |
| 0x4002 5000 - 0x4002 53FF | 1 KB | RNG | Section 19.7.4 on page 465 | |
| 0x4002 3400 - 0x4002 4FFF | 3 KB | Reserved | - | |
| 0x4002 3000 - 0x4002 33FF | 1 KB | CRC | Section 14.4.6 on page 340 | |
| 0x4002 2400 - 0x4002 2FFF | 3 KB | Reserved | - | |
| 0x4002 2000 - 0x4002 23FF | 1 KB | FLASH | Section 3.7.22 on page 112 | |
| 0x4002 1C00 - 0x4002 1FFF | 3 KB | Reserved | - | |
| 0x4002 1800 - 0x4002 1BFF | 1 KB | EXTI | Section 13.5.16 on page 332 | |
| 0x4002 1400 - 0x4002 17FF | 1 KB | Reserved | - | |
| 0x4002 1000 - 0x4002 13FF | 1 KB | RCC | Section 5.4.25 on page 213 | |
| 0x4002 0C00 - 0x4002 0FFF | 1 KB | Reserved | - | |
| 0x4002 0800 - 0x4002 0BFF | 1 KB | DMAMUX | Section 11.6.7 on page 310 | |
| 0x4002 0400 - 0x4002 07FF | 1 KB | DMA2 | Section 10.6.7 on page 293 | |
| 0x4002 0000 - 0x4002 03FF | 1 KB | DMA1 | Section 10.6.7 on page 293 | |
| APB | 0x4001 5C00 - 0x4001 FFFF | 32 KB | Reserved | - |
| 0x4001 5800 - 0x4001 5BFF | 1 KB | DBG | Section 40.10.5 on page 1366 | |
| 0x4001 4C00 - 0x4001 57FF | 3 KB | Reserved | - | |
| 0x4001 4800 - 0x4001 4BFF | 1 KB | TIM17 | Section 25.6.21 on page 821 | |
| 0x4001 4400 - 0x4001 47FF | 1 KB | TIM16 | Section 25.6.21 on page 821 |
Table 6. STM32G0x1 peripheral register boundary addresses (continued)
| Bus | Boundary address | Size | Peripheral | Peripheral register map |
|---|---|---|---|---|
| APB | 0x4001 4000 - 0x4001 43FF | 1 KB | TIM15 | Section 25.6.21 on page 821 |
| 0x4001 3C00 - 0x4001 3FFF | 1 KB | USART6 | Section 33.8.15 on page 1069 | |
| 0x4001 3800 - 0x4001 3BFF | 1 KB | USART1 | Section 33.8.15 on page 1069 | |
| 0x4001 3400 - 0x4001 37FF | 1 KB | Reserved | - | |
| 0x4001 3000 - 0x4001 33FF | 1 KB | SPI1/I2S1 | Section 35.9.10 on page 1181 | |
| 0x4001 2C00 - 0x4001 2FFF | 1 KB | TIM1 | Section 21.4 on page 576 | |
| 0x4001 2800 - 0x4001 2BFF | 1 KB | Reserved | - | |
| 0x4001 2400 - 0x4001 27FF | 1 KB | ADC | Section 15.13 on page 397 | |
| 0x4001 0400 - 0x4001 23FF | 8 KB | Reserved | - | |
| 0x4001 0200 - 0x4001 03FF | 1 KB | COMP | Section 18.6.4 on page 453 | |
| 0x4001 0080 - 0x4001 01FF | SYSCFG(ITLINE) (1) | Section 8.1.35 on page 265 | ||
| 0x4001 0030 - 0x4001 007F | VREFBUF | Section 17.3.3 on page 439 | ||
| 0x4001 0000 - 0x4001 002F | SYSCFG | Section 8.1.35 on page 265 | ||
| 0x4000 BC00 - 0x4000 FFFF | 17 KB | Reserved | - | |
| 0x4000 B400 - 0x4000 BBFF | 2 KB | FDCAN message RAM | - | |
| 0x4000 B000 - 0x4000 B3FF | 1 KB | TAMP (+ BKP registers) | Section 31.6.9 on page 918 | |
| 0x4000 A800 - 0x4000 AFFF | 2 KB | Reserved | - | |
| 0x4000 A400 - 0x4000 A7FF | 1 KB | UCPD2 | Section 38.8.15 on page 1332 | |
| 0x4000 A000 - 0x4000 A3FF | 1 KB | UCPD1 | Section 38.8.15 on page 1332 | |
| 0x4000 9C00 - 0x4000 9FFF | 1 KB | USB RAM2 | - | |
| 0x4000 9800 - 0x4000 9BFF | 1 KB | USB RAM1 | - | |
| 0x4000 9400 - 0x4000 97FF | 1 KB | LPTIM2 | Section 26.7.10 on page 848 | |
| 0x4000 8C00 - 0x4000 93FF | 2 KB | Reserved | - | |
| 0x4000 8800 - 0x4000 8BFF | 1 KB | I2C3 | Section 32.9.12 on page 983 | |
| 0x4000 8400 - 0x4000 87FF | 1 KB | LPUART2 | Section 33.8.15 on page 1069 | |
| 0x4000 8000 - 0x4000 83FF | 1 KB | LPUART1 | Section 33.8.15 on page 1069 | |
| 0x4000 7C00 - 0x4000 7FFF | 1 KB | LPTIM1 | Section 26.7.10 on page 848 | |
| 0x4000 7800 - 0x4000 7BFF | 1 KB | CEC | Section 39.7.7 on page 1352 | |
| 0x4000 7400 - 0x4000 77FF | 1 KB | DAC | Section 16.7.21 on page 430 | |
| 0x4000 7000 - 0x4000 73FF | 1 KB | PWR | Section 4.4.20 on page 153 | |
| 0x4000 6C00 - 0x4000 6FFF | 1 KB | CRS | Section 6.7.5 on page 227 | |
| 0x4000 6800 - 0x4000 6BFF | 1 KB | FDCAN2 | Section 36.4.38 on page 1244 | |
| 0x4000 6400 - 0x4000 67FF | 1 KB | FDCAN1 | Section 36.4.38 on page 1244 | |
| 0x4000 6000 - 0x4000 63FF | 1 KB | Reserved | - | |
| 0x4000 5C00 - 0x4000 5FFF | 1 KB | USB | Section 37.6.8 on page 1289 |
| Bus | Boundary address | Size | Peripheral | Peripheral register map |
|---|---|---|---|---|
| APB | 0x4000 5800 - 0x4000 5BFF | 1 KB | I2C2 | Section 32.9.12 on page 983 |
| 0x4000 5400 - 0x4000 57FF | 1 KB | I2C1 | Section 32.9.12 on page 983 | |
| 0x4000 5000 - 0x4000 53FF | 1 KB | USART5 | Section 33.8.15 on page 1069 | |
| 0x4000 4C00 - 0x4000 4FFF | 1 KB | USART4 | Section 33.8.15 on page 1069 | |
| 0x4000 4800 - 0x4000 4BFF | 1 KB | USART3 | Section 33.8.15 on page 1069 | |
| 0x4000 4400 - 0x4000 47FF | 1 KB | USART2 | Section 33.8.15 on page 1069 | |
| 0x4000 4000 - 0x4000 43FF | 1 KB | Reserved | - | |
| 0x4000 3C00 - 0x4000 3FFF | 1 KB | SPI3 | Section 35.9.10 on page 1181 | |
| 0x4000 3800 - 0x4000 3BFF | 1 KB | SPI2/I2S2 | Section 35.9.10 on page 1181 | |
| 0x4000 3400 - 0x4000 37FF | 1 KB | Reserved | - | |
| 0x4000 3000 - 0x4000 33FF | 1 KB | IWDG | Section 28.4.6 on page 858 | |
| 0x4000 2C00 - 0x4000 2FFF | 1 KB | WWDG | Section 29.5.4 on page 864 | |
| 0x4000 2800 - 0x4000 2BFF | 1 KB | RTC | Section 30.6.21 on page 902 | |
| 0x4000 2400 - 0x4000 27FF | 1 KB | Reserved | - | |
| 0x4000 2000 - 0x4000 23FF | 1 KB | TIM14 | Section 24.4.13 on page 731 | |
| 0x4000 1800 - 0x4000 1FFF | 2 KB | Reserved | - | |
| 0x4000 1400 - 0x4000 17FF | 1 KB | TIM7 | Section 23.4.9 on page 706 | |
| 0x4000 1000 - 0x4000 13FF | 1 KB | TIM6 | Section 23.4.9 on page 706 | |
| 0x4000 0C00 - 0x4000 0FFF | 1 KB | Reserved | - | |
| 0x4000 0800 - 0x4000 0BFF | 1 KB | TIM4 | Section 22.4.31 on page 691 | |
| 0x4000 0400 - 0x4000 07FF | 1 KB | TIM3 | Section 22.4.31 on page 691 | |
| 0x4000 0000 - 0x4000 03FF | 1 KB | TIM2 | Section 22.4.31 on page 691 |
1. SYSCFG (ITLINE) registers use 0x4001 0000 as reference peripheral base address.
2.3 Embedded SRAM
The following table summarizes the SRAM resources on the devices, with parity check enabled and disabled.
Table 7. SRAM size| Device | SRAM with parity enabled (Kbyte) | SRAM with parity disabled (Kbyte) |
|---|---|---|
| STM32G0B1xx and STM32G0C1xx | 128 | 144 |
| STM32G071xx and STM32G081xx | 32 | 36 |
| STM32G051xx and STM32G061xx | 16 | 18 |
| STM32G031xx and STM32G041xx | 8 | 8 |
The SRAM can be accessed by bytes, half-words (16 bits) or full words (32 bits), at maximum system clock frequency without wait state and thus by both CPU and DMA.
Parity check
The user can enable the parity check using the option bit RAM_PARITY_CHECK in the user option byte (refer to Section 3.4: FLASH option bytes ).
The data bus width is 36 bits because 4 bits are available for parity check (1 bit per byte) in order to increase memory robustness, as required for instance by Class B or SIL norms.
The parity bits are computed and stored when writing into the SRAM. Then, they are automatically checked when reading. If one bit fails, an NMI is generated. In addition, to get the SRAM parity error at the same cycle time that it is occurring, a bus error is generated (triggering a HardFault exception) together with the NMI. This avoids the corrupted data to be used by the application, but with the side effect of having both NMI and HardFault interrupts generated. The same error can also be linked to the BRK_IN Break input of TIM1/15/16/17, with the SRAM_PARITY_LOCK control bit in the SYSCFG configuration register 2 (SYSCFG_CFGR2) . The SRAM Parity Error flag (SRAM_PEF) is available in the SYSCFG configuration register 2 (SYSCFG_CFGR2) .
Note: When enabling the SRAM parity check, it is advised to initialize by software the whole SRAM at the beginning of the code, to avoid getting parity errors when reading non-initialized locations.
2.4 Flash memory overview
The flash memory is composed of two distinct physical areas:
- • The main flash memory block. It contains the application program and user data if necessary.
- • The information block. It is composed of three parts:
- – option bytes for hardware and memory protection user configuration
- – system memory which contains the proprietary bootloader code
- – OTP (one-time programmable) area
Refer to Section 3: Embedded flash memory (FLASH) for more details.
The flash memory interface implements instruction access and data access based on the AHB protocol. It implements the prefetch buffer that speeds up CPU code execution. It also implements the logic necessary to carry out the flash memory operations (Program/Erase) controlled through the flash memory registers.
2.5 Boot configuration
In the STM32G0x1, three different boot modes can be selected through the BOOT0 pin, BOOT_LOCK bit in FLASH_SECR register, and boot configuration bits nBOOT1, BOOT_SEL and nBOOT0 in the user option byte, as shown in the following table.
Table 8. Boot modes
| Boot mode configuration | Selected boot area | ||||
|---|---|---|---|---|---|
| BOOT_LOCK bit | nBOOT1 bit | BOOT0 pin | nBOOT_SEL bit | nBOOT0 bit | |
| 0 | x | 0 | 0 | x | Main flash memory (1) |
| 0 | 1 | 1 | 0 | x | System memory |
| 0 | 0 | 1 | 0 | x | Embedded SRAM |
| 0 | x | x | 1 | 1 | Main flash memory (1) |
| 0 | 1 | x | 1 | 0 | System memory |
| 0 | 0 | x | 1 | 0 | Embedded SRAM |
| 1 | x | x | x | x | Main flash memory forced |
- 1. Boot forced to system memory when EMPTY bit of the FLASH access control register (FLASH_ACR) is set. See the Empty check section.
The BOOT0 pin is sampled on the NRST (external reset) rising edge. Refer to the NRST (external reset) description in Section 5.1.2: System reset for further details about how the PF2-NRST pin mode impacts the BOOT0 sampling. The user option bits are loaded during the option byte load (OBL) process.
The boot mode configuration is then latched on the fourth rising edge of SYSCLK after a reset. It is up to the user to set the boot mode configuration related to the required boot mode.
The boot mode configuration is also re-sampled when exiting Standby or Shutdown mode. Consequently, it must be kept in the required boot mode configuration while in Standby or in Shutdown mode. After this startup delay has elapsed, the CPU fetches the top-of-stack value from address 0x0000 0000, then starts code execution from the boot memory at 0x0000 0004.
Depending on the selected boot mode, main flash memory, system memory or SRAM is accessible as follows:
- • Boot from main flash memory: the main flash memory is aliased in the boot memory space (0x0000 0000), but still accessible from its original memory space (0x0800 0000). In other words, the flash memory contents can be accessed starting from address 0x0000 0000 or 0x0800 0000.
- • Boot from system memory: the system memory is aliased in the boot memory space (0x0000 0000), but still accessible from its original memory space 0x1FFF0000.
- • Boot from the embedded SRAM: the SRAM is aliased in the boot memory space (0x0000 0000), but it is still accessible from its original memory space (0x2000 0000).
Caution: BOOT0 pin shares the same GPIO with serial wire clock (SWCLK) that is used by the debugger to connect with the device, based on the fact that these functionalities can be considered almost completely disjoint. Nevertheless, to ensure system robustness, the
STM32G0x1 devices provide an hardware mechanism to force BOOT0 low (boot from User flash memory) if a debugger access is detected (and BOOT0 information is taken from the pin), in order to use SWCLK clock for debugger serial communications and at the same time have a safe boot configuration for the device itself. This configuration is kept until next power-on following debugger access.
2.5.1 Physical remap
Once the boot mode is selected, the application software can modify the memory accessible in the code area. This modification is performed by programming the MEM_MODE bits in the SYSCFG configuration register 1 (SYSCFG_CFGR1) .
2.5.2 Embedded bootloader
The embedded bootloader is located in the system memory, programmed by ST during production. It is used to reprogram the flash memory using one of the following serial interfaces:
- • USART or I2C (applies to all devices)
- • SPI (applies to STM32G071xx and STM32G081xx and to STM32G0B1xx and STM32G0C1xx)
- • USB (DFU) or FDCAN (applies to STM32G0B1xx and STM32G0C1xx)
For further details, refer to the device data sheets and AN2606.
2.5.3 Forcing boot from main flash memory
The BOOT_LOCK bit allows forcing a unique entry point in the main flash memory for boot, regardless of the other boot mode configuration bits or the empty check flag. For more details, refer to Section 3.5.6: Forcing boot from main flash memory .
2.5.4 Empty check
Internal empty check flag (the EMPTY bit of the FLASH access control register (FLASH_ACR) ) is implemented to allow easy programming of virgin devices by the bootloader. This flag is checked when the boot configuration defines the main flash memory as the target boot area and the BOOT_LOCK bit is not set. When the EMPTY flag is set, the device is considered empty and system memory (bootloader) is selected instead of the main flash memory as a boot area, to allow the user to program the device. Refer to AN2606 for more details concerning the bootloader and GPIO configuration in system memory boot mode (some of the GPIOs are reconfigured from the High-Z state).
The EMPTY flag is updated by hardware only during the loading of option bytes: it is set when the full 72-bit content (including ECC) of the address 0x0800 0000 is read as 0xFF FFFF FFFF FFFF FFFF, otherwise it is cleared. It means that, after programming of a virgin device, a power on reset or setting of OBL_LAUNCH bit in FLASH_CR register is required to clear the EMPTY flag (the system reset has no impact on this flag). Software can also modify the EMPTY flag directly in the FLASH_ACR register.
Note: If the device is programmed for the first time but the EMPTY flag is not updated, the device still selects the system memory as a boot area after a system reset.