Difference between revisions of "DFU Bootloader"

From Stm32World Wiki
Jump to navigation Jump to search
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[Category:STM32]][[Category:USB]][[Category:STM32 Hardware]][[Category:STM32 Development]][[Category:Work in progress]]
+
[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]
 
 
 
All [[STM32]] MCUs have a built-in bootloader which will allow reflashing. The [[Boot0]] pin is used to toggle between "normal" boot and this bootloader.  Unfortunately this process can not be controlled without manipulating the [[Boot0]] pin, so if we want to control this from our application, we will have to implement our own bootloader.
 
All [[STM32]] MCUs have a built-in bootloader which will allow reflashing. The [[Boot0]] pin is used to toggle between "normal" boot and this bootloader.  Unfortunately this process can not be controlled without manipulating the [[Boot0]] pin, so if we want to control this from our application, we will have to implement our own bootloader.
  
Line 12: Line 11:
 
!  
 
!  
 
!
 
!
! Start Addr
+
! Start Addr (incl.)
! End Addr
+
! End Addr (not incl.)
 
! Size (hex)
 
! Size (hex)
 
! Size (kb)
 
! Size (kb)
Line 22: Line 21:
 
| align=right | 0x8080000
 
| align=right | 0x8080000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 29: Line 28:
 
| align=right | 0x8078000
 
| align=right | 0x8078000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 36: Line 35:
 
| align=right | 0x8070000
 
| align=right | 0x8070000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 43: Line 42:
 
| align=right | 0x8068000
 
| align=right | 0x8068000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 50: Line 49:
 
| align=right | 0x8060000
 
| align=right | 0x8060000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 57: Line 56:
 
| align=right | 0x8058000
 
| align=right | 0x8058000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 64: Line 63:
 
| align=right | 0x8050000
 
| align=right | 0x8050000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 71: Line 70:
 
| align=right | 0x8048000
 
| align=right | 0x8048000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 78: Line 77:
 
| align=right | 0x8040000
 
| align=right | 0x8040000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 85: Line 84:
 
| align=right | 0x8038000
 
| align=right | 0x8038000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 92: Line 91:
 
| align=right | 0x8030000
 
| align=right | 0x8030000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 99: Line 98:
 
| align=right | 0x8028000
 
| align=right | 0x8028000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 106: Line 105:
 
| align=right | 0x8020000
 
| align=right | 0x8020000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 113: Line 112:
 
| align=right | 0x8018000
 
| align=right | 0x8018000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 120: Line 119:
 
| align=right | 0x8010000
 
| align=right | 0x8010000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
| align=right | Begin
 
| align=right | Begin
Line 127: Line 126:
 
| align=right | 0x8008000
 
| align=right | 0x8008000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|}
 
|}
  
Line 135: Line 134:
 
!  
 
!  
 
!
 
!
! Start Addr
+
! Start Addr (incl.)
! End Addr
+
! End Addr (not incl.)
 
! Size (hex)
 
! Size (hex)
 
! Size (kb)
 
! Size (kb)
Line 146: Line 145:
 
| align=right | 0x8080000
 
| align=right | 0x8080000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
| rowspan=15 | Test
+
| rowspan=15 | Application (480 kB)
 
|-
 
|-
 
|
 
|
Line 154: Line 153:
 
| align=right | 0x8078000
 
| align=right | 0x8078000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 161: Line 160:
 
| align=right | 0x8070000
 
| align=right | 0x8070000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 168: Line 167:
 
| align=right | 0x8068000
 
| align=right | 0x8068000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 175: Line 174:
 
| align=right | 0x8060000
 
| align=right | 0x8060000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 182: Line 181:
 
| align=right | 0x8058000
 
| align=right | 0x8058000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 189: Line 188:
 
| align=right | 0x8050000
 
| align=right | 0x8050000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 196: Line 195:
 
| align=right | 0x8048000
 
| align=right | 0x8048000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 203: Line 202:
 
| align=right | 0x8040000
 
| align=right | 0x8040000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 210: Line 209:
 
| align=right | 0x8038000
 
| align=right | 0x8038000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 217: Line 216:
 
| align=right | 0x8030000
 
| align=right | 0x8030000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 224: Line 223:
 
| align=right | 0x8028000
 
| align=right | 0x8028000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 231: Line 230:
 
| align=right | 0x8020000
 
| align=right | 0x8020000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 238: Line 237:
 
| align=right | 0x8018000
 
| align=right | 0x8018000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
|
 
|
Line 245: Line 244:
 
| align=right | 0x8010000
 
| align=right | 0x8010000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 
|-
 
|-
 
| align=right | Begin
 
| align=right | Begin
Line 252: Line 251:
 
| align=right | 0x8008000
 
| align=right | 0x8008000
 
| align=right | 0x8000
 
| align=right | 0x8000
| align=right | 32kB
+
| align=right | 32 kB
 +
| Bootloader (32 kB)
 
|}
 
|}
  

Latest revision as of 03:52, 10 July 2021

All STM32 MCUs have a built-in bootloader which will allow reflashing. The Boot0 pin is used to toggle between "normal" boot and this bootloader. Unfortunately this process can not be controlled without manipulating the Boot0 pin, so if we want to control this from our application, we will have to implement our own bootloader.

Overall Architecture

All STM32 MCUs (indeed all ARM processors) follows the Von Neumann architecture. This essentially - in this context - means that the instruction and data memory share the same address space. Since STM32 processors are 32-bit processors and since 32-bit addresses can address 4GB (4,294,967,296 bytes), sharing the address space between instruction and data memory is not a problem.

On STM32s, programs are stored in on-chip flash memory. Different STM32s have different amount of flash memory, but common for all is that it is mapped in the address space starting from 0x08000000.

Start Addr (incl.) End Addr (not incl.) Size (hex) Size (kb)
End --> 0x8078000 0x8080000 0x8000 32 kB
0x8070000 0x8078000 0x8000 32 kB
0x8068000 0x8070000 0x8000 32 kB
0x8060000 0x8068000 0x8000 32 kB
0x8058000 0x8060000 0x8000 32 kB
0x8050000 0x8058000 0x8000 32 kB
0x8048000 0x8050000 0x8000 32 kB
0x8040000 0x8048000 0x8000 32 kB
0x8038000 0x8040000 0x8000 32 kB
0x8030000 0x8038000 0x8000 32 kB
0x8028000 0x8030000 0x8000 32 kB
0x8020000 0x8028000 0x8000 32 kB
0x8018000 0x8020000 0x8000 32 kB
0x8010000 0x8018000 0x8000 32 kB
0x8008000 0x8010000 0x8000 32 kB
Begin --> 0x8000000 0x8008000 0x8000 32 kB

Under normal reset (Boot0 not activated), the MCU will jump to address 0x8000000 and begin execution from there.

Start Addr (incl.) End Addr (not incl.) Size (hex) Size (kb) Usage
End --> 0x8078000 0x8080000 0x8000 32 kB Application (480 kB)
0x8070000 0x8078000 0x8000 32 kB
0x8068000 0x8070000 0x8000 32 kB
0x8060000 0x8068000 0x8000 32 kB
0x8058000 0x8060000 0x8000 32 kB
0x8050000 0x8058000 0x8000 32 kB
0x8048000 0x8050000 0x8000 32 kB
0x8040000 0x8048000 0x8000 32 kB
0x8038000 0x8040000 0x8000 32 kB
0x8030000 0x8038000 0x8000 32 kB
0x8028000 0x8030000 0x8000 32 kB
0x8020000 0x8028000 0x8000 32 kB
0x8018000 0x8020000 0x8000 32 kB
0x8010000 0x8018000 0x8000 32 kB
0x8008000 0x8010000 0x8000 32 kB
Begin --> 0x8000000 0x8008000 0x8000 32 kB Bootloader (32 kB)

Bootloader

Application

Miscellaneous Links