<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://stm32world.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lth</id>
	<title>Stm32World Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://stm32world.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lth"/>
	<link rel="alternate" type="text/html" href="https://stm32world.com/wiki/Special:Contributions/Lth"/>
	<updated>2026-11-02T23:01:26Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.0</generator>
	<entry>
		<id>https://stm32world.com/w/index.php?title=STM32_W5500_Ethernet&amp;diff=8779</id>
		<title>STM32 W5500 Ethernet</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=STM32_W5500_Ethernet&amp;diff=8779"/>
		<updated>2026-11-02T06:44:06Z</updated>

		<summary type="html">&lt;p&gt;Lth: Created page with &amp;quot;{{Video |series=STM32 Tutorial Video |number=105 |title=STM32 W5500 Ethernet |youtube-id=hQ6y2UWLS7Q |description=in this STM32World tutorial we're going to cover using W5500...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Video&lt;br /&gt;
|series=STM32 Tutorial Video&lt;br /&gt;
|number=105&lt;br /&gt;
|title=STM32 W5500 Ethernet&lt;br /&gt;
|youtube-id=hQ6y2UWLS7Q&lt;br /&gt;
|description=in this STM32World tutorial we're going to cover using W5500 to provide Ethernet connectivity.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=W25Qxx_lib&amp;diff=8778</id>
		<title>W25Qxx lib</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=W25Qxx_lib&amp;diff=8778"/>
		<updated>2026-10-31T08:16:54Z</updated>

		<summary type="html">&lt;p&gt;Lth: Created page with &amp;quot;Category:STM32Category:RP2350Category:Work in progress To be added&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:RP2350]][[Category:Work in progress]]&lt;br /&gt;
To be added&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=RP2350_SPI_Flash_(W25Qxx)&amp;diff=8777</id>
		<title>RP2350 SPI Flash (W25Qxx)</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=RP2350_SPI_Flash_(W25Qxx)&amp;diff=8777"/>
		<updated>2026-10-31T06:21:48Z</updated>

		<summary type="html">&lt;p&gt;Lth: Created page with &amp;quot;{{Video |series=RP Pico Video |number=23 |title=RP2350 SPI Flash (W25Qxx) |youtube-id=LyosRtGzYB4 |description=Adding RP2350 support to our old stm32-w25qxx library creating w...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Video&lt;br /&gt;
|series=RP Pico Video&lt;br /&gt;
|number=23&lt;br /&gt;
|title=RP2350 SPI Flash (W25Qxx)&lt;br /&gt;
|youtube-id=LyosRtGzYB4&lt;br /&gt;
|description=Adding RP2350 support to our old stm32-w25qxx library creating w25qxx_lib.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Category:STM32_Bootloader_Video&amp;diff=8776</id>
		<title>Category:STM32 Bootloader Video</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Category:STM32_Bootloader_Video&amp;diff=8776"/>
		<updated>2026-10-29T06:56:58Z</updated>

		<summary type="html">&lt;p&gt;Lth: Created page with &amp;quot;STM32 Bootloader Videos&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 Bootloader Videos&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=STM32_Bootloader_Video&amp;diff=8775</id>
		<title>STM32 Bootloader Video</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=STM32_Bootloader_Video&amp;diff=8775"/>
		<updated>2026-10-29T06:56:29Z</updated>

		<summary type="html">&lt;p&gt;Lth: Redirected page to STM32 Tutorial Videos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[STM32 Tutorial Videos]]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Update_Bootloader_Intro&amp;diff=8774</id>
		<title>Secure Firmware Update Bootloader Intro</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Update_Bootloader_Intro&amp;diff=8774"/>
		<updated>2026-10-29T06:54:59Z</updated>

		<summary type="html">&lt;p&gt;Lth: Created page with &amp;quot;{{Video |series=STM32 Bootloader Video |number=0 |title=Secure Firmware Update Bootloader Intro |youtube-id=CJXLDo2Cew8 |description=This video will introduce our new Bootload...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Video&lt;br /&gt;
|series=STM32 Bootloader Video&lt;br /&gt;
|number=0&lt;br /&gt;
|title=Secure Firmware Update Bootloader Intro&lt;br /&gt;
|youtube-id=CJXLDo2Cew8&lt;br /&gt;
|description=This video will introduce our new Bootloader series, where we will design and implement a secure bootloader, which will use TLS to validate a signed firmware.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Main_Page&amp;diff=8773</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Main_Page&amp;diff=8773"/>
		<updated>2026-10-29T06:51:40Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__ __NOTOC__ {{metadesc|STM32World Wiki Main Page - all about STM32 and Similar MCUs}}&lt;br /&gt;
{| width=100%&lt;br /&gt;
|-&lt;br /&gt;
| width=33% |&lt;br /&gt;
| width=33% |&lt;br /&gt;
| width=33% |&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | {{Box|title=Welcome|edit=Main Page/Welcome|height=300px}}&lt;br /&gt;
{{:Main Page/Welcome}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[Recent Changes]]|theme=2|height=300px}}&lt;br /&gt;
{{#ask: [[:+]][[!Main Page]][[!Main Page/Welcome]][[!~STM32 Tutorial*]][[!~STM32 Bare Metal Video*]][[!~STM32 Basics*]][[!~STM32 Short*]][[!~STM32 Rant*]][[!~STM32 Miscellaneous*]][[!~KiCAD Video*]][[!~Streamline Video*]][[!~Colibri Video*]][[!~RP Pico Video*]][[!~Electronics Video*]][[!~STM32 Remake Video*]][[!~STM32 Bootloader Video*]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
|}&lt;br /&gt;
{| width=100%&lt;br /&gt;
|-&lt;br /&gt;
| width=49% |&lt;br /&gt;
| width=50% |&lt;br /&gt;
|-&lt;br /&gt;
| {{Box|title=End of Year Promotion|theme=3|height=400px}}&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[File:Promotion 2.jpg|620px|link=https://currentmakers.com/products/streamline/]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=Latest video|theme=10|height=400px}}&lt;br /&gt;
{{#ask: [[Category:STM32 Tutorial Video||STM32 Bare Metal Video||STM32 Rant Video||STM32 Short Video||STM32 Basics Video||STM32 Miscellaneous Video||KiCAD Video||Streamline Video||Colibri Video||RP Pico Video||STM32 Remake Video||Electronics Video||STM32 Bootloader Video]]&lt;br /&gt;
 |?Video title&lt;br /&gt;
 |?Youtube id&lt;br /&gt;
 |format=plainlist&lt;br /&gt;
 |template=Video single front&lt;br /&gt;
 |limit=1&lt;br /&gt;
 |sort=Creation date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |searchlabel=&lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
|}&lt;br /&gt;
{| width=100%&lt;br /&gt;
|-&lt;br /&gt;
| width=33% |&lt;br /&gt;
| width=33% |&lt;br /&gt;
| width=33% |&lt;br /&gt;
|-&lt;br /&gt;
| {{Box|title=[[Streamline]]|theme=11|height=300px}}&lt;br /&gt;
{{#ask: [[Category:Streamline]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[Jolt]]|theme=6|height=300px}}&lt;br /&gt;
{{#ask: [[Category:Jolt]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[Colibri]]|theme=2|height=300px}}&lt;br /&gt;
{{#ask: [[Category:Colibri]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Box|title=[[:Category:STM32 Documentation|STM32 Documentation]]|theme=3|height=300px}}&lt;br /&gt;
{{#ask: [[Category:STM32 Documentation]] OR [[Category:STM32 HOWTO]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[:Category:STM32 Development|STM32 Development]]|theme=5|height=300px}}&lt;br /&gt;
{{#ask: [[Category:STM32 Development]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[STM32 Tutorial Videos]]|theme=2|height=300px}}&lt;br /&gt;
* [[STM32 Tutorial Videos]]&lt;br /&gt;
* [[STM32 Bare Metal Videos]]&lt;br /&gt;
* [[STM32 Basics Videos]]&lt;br /&gt;
* [[STM32 Short Videos]]&lt;br /&gt;
* [[STM32 Rant Videos]]&lt;br /&gt;
* [[STM32 Miscellaneous Videos]]&lt;br /&gt;
* [[KiCAD Videos]]&lt;br /&gt;
* [[Streamline Videos]]&lt;br /&gt;
* [[Colibri Videos]]&lt;br /&gt;
* [[RP Pico Videos]]&lt;br /&gt;
* [[Electronics Videos]]&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| {{Box|title=[[:Category:STM32 Hardware|STM32 Hardware]]|theme=4|height=300px}}&lt;br /&gt;
{{#ask: [[Category:STM32 Hardware]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[:Category:STM32 HAL|STM32 HAL]]|theme=10|height=300px}}&lt;br /&gt;
{{#ask: [[Category:STM32 HAL]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[:Category:STM32 Projects|STM32 Projects]]|theme=7|height=300px}}&lt;br /&gt;
{{#ask: [[Category:STM32 Projects]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Box|title=[[:Category:MCU|MCUs]]|theme=9|height=300px}}&lt;br /&gt;
{{#ask: [[Category:MCU]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[:Category:Components and Modules|Components and Modules]]|theme=6|height=300px}}&lt;br /&gt;
{{#ask: [[Category:Components and Modules]] OR [[Category:Components]] OR [[Category:Modules]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[:Category:Development Board|Development Boards]]|theme=1|height=300px}}&lt;br /&gt;
{{#ask: [[Category:Development Board]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Box|title=[[:Category:RISC-V|RISC-V]]|theme=2|height=300px}}&lt;br /&gt;
{{#ask: [[Category:RISC-V]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[Raspberry Pi Pico]]|theme=1|height=300px}}&lt;br /&gt;
{{#ask: [[Category:Raspberry Pi Pico]][[!Raspberry Pi Pico]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[ESP32]]|theme=2|height=300px}}&lt;br /&gt;
{{#ask: [[Category:ESP32]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Box|title=[[:Category:C|C Programming]]|theme=12|height=300px}}&lt;br /&gt;
{{#ask: [[Category:C]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[:Category:Electronics|Electronics]]|theme=13|height=300px}}&lt;br /&gt;
{{#ask: [[Category:Electronics]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[:Category:KiCAD|KiCAD]]|theme=14|height=300px}}&lt;br /&gt;
{{#ask: [[Category:KiCAD]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Box|title=[[:Category:CH32|CH32]]|theme=7|height=300px}}&lt;br /&gt;
{{#ask: [[Category:CH32]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[:Category:FPGA|FPGA]]|theme=3|height=300px}}&lt;br /&gt;
{{#ask: [[Category:FPGA]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
| {{Box|title=[[Awesome Audio Apparatus]]|theme=2|height=300px}}&lt;br /&gt;
{{#ask: [[Category:Awesome Audio Apparatus]]&lt;br /&gt;
 |format=ul&lt;br /&gt;
 |limit=10&lt;br /&gt;
 |offset=0&lt;br /&gt;
 |link=all&lt;br /&gt;
 |sort=Modification date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |searchlabel=... further results&lt;br /&gt;
 |propsep=, &lt;br /&gt;
 |valuesep=, &lt;br /&gt;
}}&lt;br /&gt;
{{Box/End}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=STM32_Tutorial_Videos&amp;diff=8772</id>
		<title>STM32 Tutorial Videos</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=STM32_Tutorial_Videos&amp;diff=8772"/>
		<updated>2026-10-29T06:50:29Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:C]][[Category:STM32 Development]][[Category:STM32CubeMX]][[Category:STM32CubeIde]][[Category:STM32 HAL]][[Category:Embedded]][[Category:STM32]] {{metadesc|Learning STM32 Tutorial Videos - Beginner - Getting started}}&lt;br /&gt;
This site have quite a lot of visitors and it appears quite popular, but these days more people are watching Youtube videos for learning rather than reading actual documentation.  For this reason, we have decided to create some getting started tutorial videos which will teach you how to learn stm32 and move beyond Arduino.&lt;br /&gt;
&lt;br /&gt;
[[STM32]] is a family of [[MCU]]s and there will never be a &amp;quot;one fit all&amp;quot;.  For this reason, these videos will use different [[MCU]]s, probably mostly [[STM32World]] and [[Black Pill]] but should be fairly development board agnostic.&lt;br /&gt;
&lt;br /&gt;
The videos will all be posted here: [https://www.youtube.com/@stm32world/videos https://www.youtube.com/@stm32world/videos]&lt;br /&gt;
&lt;br /&gt;
And in the following playlist: [https://www.youtube.com/playlist?list=PLVfOnriB1RjWT_fBzzqsrNaZRPnDgboNI https://www.youtube.com/playlist?list=PLVfOnriB1RjWT_fBzzqsrNaZRPnDgboNI]&lt;br /&gt;
&lt;br /&gt;
The source code of all the examples will be put in this github repository: [https://github.com/STM32World/stm32fun https://github.com/STM32World/stm32fun]&lt;br /&gt;
&lt;br /&gt;
{{#ask: [[Category:STM32 Tutorial Video]] OR [[Category:STM32 Remake Video]] OR [[Category:STM32 Bootloader Video]]&lt;br /&gt;
 |?Video series&lt;br /&gt;
 |?Video number&lt;br /&gt;
 |?Video title&lt;br /&gt;
 |?Video description&lt;br /&gt;
 |?Youtube id&lt;br /&gt;
 |format=plainlist&lt;br /&gt;
 |template=Video detail&lt;br /&gt;
 |sort=Creation date&lt;br /&gt;
 |order=desc&lt;br /&gt;
 |limit=20&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8771</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8771"/>
		<updated>2026-10-28T00:27:32Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
This page will document how to implement a secure firmware update.&lt;br /&gt;
&lt;br /&gt;
NOTICE! Do '''not''' rely on the code on this page or in the repository for production.  This is meant to document the principles.&lt;br /&gt;
&lt;br /&gt;
This page expands on an earlier [[DFU]] bootloader, documented here: [[Custom DFU Bootloader]]&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
In principle, two approaches are viable.  Either the bootloader will occupy the first part of the flash, or it will occupy the end of the flash.&lt;br /&gt;
&lt;br /&gt;
If locating the bootloader in the beginning of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader beginning.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address       Memory Region / Sector                               Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0801 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0800 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if placing the bootloader towards the end of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader end.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address        Memory Region / Sector                             Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |  Bootloader Code                                  |    ^&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0807 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0806 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0800 0000       |  (Application Vector Table &amp;amp; Entry Point)         |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Signing firmware ==&lt;br /&gt;
&lt;br /&gt;
The signature will be stored in a 128 byte block which will be merged with the actual firmware binary.  The format of that structure is like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
    uint32_t magic;          // 4 bytes: Magic identifier (e.g. 0x4150504B / &amp;quot;KAPP&amp;quot;)&lt;br /&gt;
    uint32_t payload_len;    // 4 bytes: Size of binary firmware in bytes&lt;br /&gt;
    uint8_t signature[64];  // 64 bytes: ECDSA raw signature (32-byte R + 32-byte S)&lt;br /&gt;
    uint8_t reserved[56];   // 56 bytes: Zero padding to align header to 128 bytes&lt;br /&gt;
} Header128_t;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First step will be to generate a private key:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl ecparam -name prime256v1 -genkey -noout -out private_key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This key '''must''' be kept private.  Anyone gaining access to it will be able to sign their own firmware.&lt;br /&gt;
&lt;br /&gt;
After generating a private key, a public key can be derived:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl ec -in private_key.pem -pubout -out public_key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This key is public and the actual contents of the public_key.pem is included in the code.&lt;br /&gt;
&lt;br /&gt;
Signing a binary takes multiple steps and for ease of use we've created a shell script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env bash&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
# Configurable paths&lt;br /&gt;
FIRMWARE_BIN=&amp;quot;${1:-app.bin}&amp;quot;&lt;br /&gt;
PRIVATE_KEY=&amp;quot;${2:-private_key.pem}&amp;quot;&lt;br /&gt;
OUTPUT_BIN=&amp;quot;${3:-app_signed.bin}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Check required files&lt;br /&gt;
if [[ ! -f &amp;quot;$FIRMWARE_BIN&amp;quot; ]] || [[ ! -f &amp;quot;$PRIVATE_KEY&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;Usage: $0 &amp;lt;firmware.bin&amp;gt; &amp;lt;private_key.pem&amp;gt; [output.bin]&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
TEMP_DIR=$(mktemp -d)&lt;br /&gt;
trap 'rm -rf &amp;quot;$TEMP_DIR&amp;quot;' EXIT&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[1/4] Calculating SHA-256 hash and ECDSA signature...&amp;quot;&lt;br /&gt;
# 1. Output DER signature from OpenSSL&lt;br /&gt;
openssl dgst -sha256 -sign &amp;quot;$PRIVATE_KEY&amp;quot; -out &amp;quot;$TEMP_DIR/sig.der&amp;quot; &amp;quot;$FIRMWARE_BIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 2. Extract raw R and S components from DER signature into raw 64-byte binary&lt;br /&gt;
openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER &amp;gt; &amp;quot;$TEMP_DIR/sig.asn1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Extract hex for integer R and S&lt;br /&gt;
R_HEX=$(openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER | awk -F':' '/INTEGER/ {print $4}' | sed -n '1p')&lt;br /&gt;
S_HEX=$(openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER | awk -F':' '/INTEGER/ {print $4}' | sed -n '2p')&lt;br /&gt;
&lt;br /&gt;
# Pad or strip lead zeroes so each is exactly 32 bytes (64 hex characters)&lt;br /&gt;
R_HEX=$(printf &amp;quot;%064s&amp;quot; &amp;quot;${R_HEX#00}&amp;quot; | tr ' ' '0' | tail -c 64)&lt;br /&gt;
S_HEX=$(printf &amp;quot;%064s&amp;quot; &amp;quot;${S_HEX#00}&amp;quot; | tr ' ' '0' | tail -c 64)&lt;br /&gt;
&lt;br /&gt;
# Convert R + S hex to raw binary (64 bytes)&lt;br /&gt;
echo -n &amp;quot;${R_HEX}${S_HEX}&amp;quot; | xxd -r -p &amp;gt; &amp;quot;$TEMP_DIR/sig_raw.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[2/4] Building 128-byte Header...&amp;quot;&lt;br /&gt;
# Magic Bytes: &amp;quot;KAPP&amp;quot; (0x4150504B in Little-Endian)&lt;br /&gt;
printf '\x4B\x50\x50\x41' &amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Payload Length: 4-byte Little-Endian uint32&lt;br /&gt;
PAYLOAD_SIZE=$(stat -c%s &amp;quot;$FIRMWARE_BIN&amp;quot; 2&amp;gt;/dev/null || stat -f%z &amp;quot;$FIRMWARE_BIN&amp;quot;)&lt;br /&gt;
python3 -c &amp;quot;import struct, sys; sys.stdout.buffer.write(struct.pack('&amp;lt;I', $PAYLOAD_SIZE))&amp;quot; &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Append 64-byte Raw Signature&lt;br /&gt;
cat &amp;quot;$TEMP_DIR/sig_raw.bin&amp;quot; &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Append 56-byte zero padding to complete the 128-byte header&lt;br /&gt;
dd if=/dev/zero bs=1 count=56 2&amp;gt;/dev/null &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[3/4] Concatenating Header and Firmware Payload...&amp;quot;&lt;br /&gt;
cat &amp;quot;$TEMP_DIR/header.bin&amp;quot; &amp;quot;$FIRMWARE_BIN&amp;quot; &amp;gt; &amp;quot;$OUTPUT_BIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[4/4] Done!&amp;quot;&lt;br /&gt;
echo &amp;quot;Generated Signed Firmware : $OUTPUT_BIN&amp;quot;&lt;br /&gt;
echo &amp;quot;Original Payload Size     : $PAYLOAD_SIZE bytes&amp;quot;&lt;br /&gt;
echo &amp;quot;Final Image Size          : $(stat -c%s &amp;quot;$OUTPUT_BIN&amp;quot; 2&amp;gt;/dev/null || stat -f%z &amp;quot;$OUTPUT_BIN&amp;quot;) bytes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This script can be used to sign the output binary:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/src/stm32fun/examples/sl_mcu_stm32f407_bootloader_signed_app$ ./package_firmware.sh Debug/sl_mcu_stm32f407_bootloader_signed_app.bin &lt;br /&gt;
[1/4] Calculating SHA-256 hash and ECDSA signature...&lt;br /&gt;
[2/4] Building 128-byte Header...&lt;br /&gt;
[3/4] Concatenating Header and Firmware Payload...&lt;br /&gt;
[4/4] Done!&lt;br /&gt;
Generated Signed Firmware : app_signed.bin&lt;br /&gt;
Original Payload Size     : 61900 bytes&lt;br /&gt;
Final Image Size          : 62028 bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== STM32CubeMX Pinout ==&lt;br /&gt;
&lt;br /&gt;
The pinout of the STM32F407 has been configured like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:STM32F407 CubeMX Pinout.png|800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TinyUSB DFU ==&lt;br /&gt;
[[File:TinyUSB src added to project.png|thumb|300px]]&lt;br /&gt;
The earlier approach was using HAL USB DFU, but as [[ST]] in their ''wisdom'' have decided that they couldn't be bothered to support all their [[MCU]]s any longer, I am going to use [[TinyUSB]] for this example.  The src/ directory needs to be copied or linked in the project directory (as seen on the right).&lt;br /&gt;
&lt;br /&gt;
This folder will have to be added both as &amp;quot;include&amp;quot; and as &amp;quot;source&amp;quot; in the project properties.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
== MbedTLS Signature Checking ==&lt;br /&gt;
&lt;br /&gt;
To be added&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous links ==&lt;br /&gt;
&lt;br /&gt;
* [[Custom DFU Bootloader]]&lt;br /&gt;
* [https://github.com/hathach/tinyusb TinyUSB Github repository]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=File:STM32F407_CubeMX_Pinout.png&amp;diff=8770</id>
		<title>File:STM32F407 CubeMX Pinout.png</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=File:STM32F407_CubeMX_Pinout.png&amp;diff=8770"/>
		<updated>2026-10-28T00:26:43Z</updated>

		<summary type="html">&lt;p&gt;Lth: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8769</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8769"/>
		<updated>2026-10-28T00:22:24Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
This page will document how to implement a secure firmware update.&lt;br /&gt;
&lt;br /&gt;
NOTICE! Do '''not''' rely on the code on this page or in the repository for production.  This is meant to document the principles.&lt;br /&gt;
&lt;br /&gt;
This page expands on an earlier [[DFU]] bootloader, documented here: [[Custom DFU Bootloader]]&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
In principle, two approaches are viable.  Either the bootloader will occupy the first part of the flash, or it will occupy the end of the flash.&lt;br /&gt;
&lt;br /&gt;
If locating the bootloader in the beginning of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader beginning.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address       Memory Region / Sector                               Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0801 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0800 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if placing the bootloader towards the end of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader end.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address        Memory Region / Sector                             Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |  Bootloader Code                                  |    ^&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0807 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0806 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0800 0000       |  (Application Vector Table &amp;amp; Entry Point)         |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Signing firmware ==&lt;br /&gt;
&lt;br /&gt;
The signature will be stored in a 128 byte block which will be merged with the actual firmware binary.  The format of that structure is like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
    uint32_t magic;          // 4 bytes: Magic identifier (e.g. 0x4150504B / &amp;quot;KAPP&amp;quot;)&lt;br /&gt;
    uint32_t payload_len;    // 4 bytes: Size of binary firmware in bytes&lt;br /&gt;
    uint8_t signature[64];  // 64 bytes: ECDSA raw signature (32-byte R + 32-byte S)&lt;br /&gt;
    uint8_t reserved[56];   // 56 bytes: Zero padding to align header to 128 bytes&lt;br /&gt;
} Header128_t;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First step will be to generate a private key:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl ecparam -name prime256v1 -genkey -noout -out private_key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This key '''must''' be kept private.  Anyone gaining access to it will be able to sign their own firmware.&lt;br /&gt;
&lt;br /&gt;
After generating a private key, a public key can be derived:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl ec -in private_key.pem -pubout -out public_key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This key is public and the actual contents of the public_key.pem is included in the code.&lt;br /&gt;
&lt;br /&gt;
Signing a binary takes multiple steps and for ease of use we've created a shell script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env bash&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
# Configurable paths&lt;br /&gt;
FIRMWARE_BIN=&amp;quot;${1:-app.bin}&amp;quot;&lt;br /&gt;
PRIVATE_KEY=&amp;quot;${2:-private_key.pem}&amp;quot;&lt;br /&gt;
OUTPUT_BIN=&amp;quot;${3:-app_signed.bin}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Check required files&lt;br /&gt;
if [[ ! -f &amp;quot;$FIRMWARE_BIN&amp;quot; ]] || [[ ! -f &amp;quot;$PRIVATE_KEY&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;Usage: $0 &amp;lt;firmware.bin&amp;gt; &amp;lt;private_key.pem&amp;gt; [output.bin]&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
TEMP_DIR=$(mktemp -d)&lt;br /&gt;
trap 'rm -rf &amp;quot;$TEMP_DIR&amp;quot;' EXIT&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[1/4] Calculating SHA-256 hash and ECDSA signature...&amp;quot;&lt;br /&gt;
# 1. Output DER signature from OpenSSL&lt;br /&gt;
openssl dgst -sha256 -sign &amp;quot;$PRIVATE_KEY&amp;quot; -out &amp;quot;$TEMP_DIR/sig.der&amp;quot; &amp;quot;$FIRMWARE_BIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 2. Extract raw R and S components from DER signature into raw 64-byte binary&lt;br /&gt;
openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER &amp;gt; &amp;quot;$TEMP_DIR/sig.asn1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Extract hex for integer R and S&lt;br /&gt;
R_HEX=$(openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER | awk -F':' '/INTEGER/ {print $4}' | sed -n '1p')&lt;br /&gt;
S_HEX=$(openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER | awk -F':' '/INTEGER/ {print $4}' | sed -n '2p')&lt;br /&gt;
&lt;br /&gt;
# Pad or strip lead zeroes so each is exactly 32 bytes (64 hex characters)&lt;br /&gt;
R_HEX=$(printf &amp;quot;%064s&amp;quot; &amp;quot;${R_HEX#00}&amp;quot; | tr ' ' '0' | tail -c 64)&lt;br /&gt;
S_HEX=$(printf &amp;quot;%064s&amp;quot; &amp;quot;${S_HEX#00}&amp;quot; | tr ' ' '0' | tail -c 64)&lt;br /&gt;
&lt;br /&gt;
# Convert R + S hex to raw binary (64 bytes)&lt;br /&gt;
echo -n &amp;quot;${R_HEX}${S_HEX}&amp;quot; | xxd -r -p &amp;gt; &amp;quot;$TEMP_DIR/sig_raw.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[2/4] Building 128-byte Header...&amp;quot;&lt;br /&gt;
# Magic Bytes: &amp;quot;KAPP&amp;quot; (0x4150504B in Little-Endian)&lt;br /&gt;
printf '\x4B\x50\x50\x41' &amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Payload Length: 4-byte Little-Endian uint32&lt;br /&gt;
PAYLOAD_SIZE=$(stat -c%s &amp;quot;$FIRMWARE_BIN&amp;quot; 2&amp;gt;/dev/null || stat -f%z &amp;quot;$FIRMWARE_BIN&amp;quot;)&lt;br /&gt;
python3 -c &amp;quot;import struct, sys; sys.stdout.buffer.write(struct.pack('&amp;lt;I', $PAYLOAD_SIZE))&amp;quot; &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Append 64-byte Raw Signature&lt;br /&gt;
cat &amp;quot;$TEMP_DIR/sig_raw.bin&amp;quot; &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Append 56-byte zero padding to complete the 128-byte header&lt;br /&gt;
dd if=/dev/zero bs=1 count=56 2&amp;gt;/dev/null &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[3/4] Concatenating Header and Firmware Payload...&amp;quot;&lt;br /&gt;
cat &amp;quot;$TEMP_DIR/header.bin&amp;quot; &amp;quot;$FIRMWARE_BIN&amp;quot; &amp;gt; &amp;quot;$OUTPUT_BIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[4/4] Done!&amp;quot;&lt;br /&gt;
echo &amp;quot;Generated Signed Firmware : $OUTPUT_BIN&amp;quot;&lt;br /&gt;
echo &amp;quot;Original Payload Size     : $PAYLOAD_SIZE bytes&amp;quot;&lt;br /&gt;
echo &amp;quot;Final Image Size          : $(stat -c%s &amp;quot;$OUTPUT_BIN&amp;quot; 2&amp;gt;/dev/null || stat -f%z &amp;quot;$OUTPUT_BIN&amp;quot;) bytes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This script can be used to sign the output binary:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/src/stm32fun/examples/sl_mcu_stm32f407_bootloader_signed_app$ ./package_firmware.sh Debug/sl_mcu_stm32f407_bootloader_signed_app.bin &lt;br /&gt;
[1/4] Calculating SHA-256 hash and ECDSA signature...&lt;br /&gt;
[2/4] Building 128-byte Header...&lt;br /&gt;
[3/4] Concatenating Header and Firmware Payload...&lt;br /&gt;
[4/4] Done!&lt;br /&gt;
Generated Signed Firmware : app_signed.bin&lt;br /&gt;
Original Payload Size     : 61900 bytes&lt;br /&gt;
Final Image Size          : 62028 bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TinyUSB DFU ==&lt;br /&gt;
[[File:TinyUSB src added to project.png|thumb|300px]]&lt;br /&gt;
The earlier approach was using HAL USB DFU, but as [[ST]] in their ''wisdom'' have decided that they couldn't be bothered to support all their [[MCU]]s any longer, I am going to use [[TinyUSB]] for this example.  The src/ directory needs to be copied or linked in the project directory.&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== MbedTLS Signature Checking ==&lt;br /&gt;
&lt;br /&gt;
To be added&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous links ==&lt;br /&gt;
&lt;br /&gt;
* [[Custom DFU Bootloader]]&lt;br /&gt;
* [https://github.com/hathach/tinyusb TinyUSB Github repository]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=File:TinyUSB_src_added_to_project.png&amp;diff=8768</id>
		<title>File:TinyUSB src added to project.png</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=File:TinyUSB_src_added_to_project.png&amp;diff=8768"/>
		<updated>2026-10-28T00:21:55Z</updated>

		<summary type="html">&lt;p&gt;Lth: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8767</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8767"/>
		<updated>2026-10-28T00:15:33Z</updated>

		<summary type="html">&lt;p&gt;Lth: /* TinyUSB DFU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
This page will document how to implement a secure firmware update.&lt;br /&gt;
&lt;br /&gt;
NOTICE! Do '''not''' rely on the code on this page or in the repository for production.  This is meant to document the principles.&lt;br /&gt;
&lt;br /&gt;
This page expands on an earlier [[DFU]] bootloader, documented here: [[Custom DFU Bootloader]]&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
In principle, two approaches are viable.  Either the bootloader will occupy the first part of the flash, or it will occupy the end of the flash.&lt;br /&gt;
&lt;br /&gt;
If locating the bootloader in the beginning of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader beginning.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address       Memory Region / Sector                               Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0801 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0800 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if placing the bootloader towards the end of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader end.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address        Memory Region / Sector                             Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |  Bootloader Code                                  |    ^&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0807 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0806 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0800 0000       |  (Application Vector Table &amp;amp; Entry Point)         |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Signing firmware ==&lt;br /&gt;
&lt;br /&gt;
The signature will be stored in a 128 byte block which will be merged with the actual firmware binary.  The format of that structure is like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
    uint32_t magic;          // 4 bytes: Magic identifier (e.g. 0x4150504B / &amp;quot;KAPP&amp;quot;)&lt;br /&gt;
    uint32_t payload_len;    // 4 bytes: Size of binary firmware in bytes&lt;br /&gt;
    uint8_t signature[64];  // 64 bytes: ECDSA raw signature (32-byte R + 32-byte S)&lt;br /&gt;
    uint8_t reserved[56];   // 56 bytes: Zero padding to align header to 128 bytes&lt;br /&gt;
} Header128_t;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First step will be to generate a private key:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl ecparam -name prime256v1 -genkey -noout -out private_key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This key '''must''' be kept private.  Anyone gaining access to it will be able to sign their own firmware.&lt;br /&gt;
&lt;br /&gt;
After generating a private key, a public key can be derived:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl ec -in private_key.pem -pubout -out public_key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This key is public and the actual contents of the public_key.pem is included in the code.&lt;br /&gt;
&lt;br /&gt;
Signing a binary takes multiple steps and for ease of use we've created a shell script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env bash&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
# Configurable paths&lt;br /&gt;
FIRMWARE_BIN=&amp;quot;${1:-app.bin}&amp;quot;&lt;br /&gt;
PRIVATE_KEY=&amp;quot;${2:-private_key.pem}&amp;quot;&lt;br /&gt;
OUTPUT_BIN=&amp;quot;${3:-app_signed.bin}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Check required files&lt;br /&gt;
if [[ ! -f &amp;quot;$FIRMWARE_BIN&amp;quot; ]] || [[ ! -f &amp;quot;$PRIVATE_KEY&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;Usage: $0 &amp;lt;firmware.bin&amp;gt; &amp;lt;private_key.pem&amp;gt; [output.bin]&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
TEMP_DIR=$(mktemp -d)&lt;br /&gt;
trap 'rm -rf &amp;quot;$TEMP_DIR&amp;quot;' EXIT&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[1/4] Calculating SHA-256 hash and ECDSA signature...&amp;quot;&lt;br /&gt;
# 1. Output DER signature from OpenSSL&lt;br /&gt;
openssl dgst -sha256 -sign &amp;quot;$PRIVATE_KEY&amp;quot; -out &amp;quot;$TEMP_DIR/sig.der&amp;quot; &amp;quot;$FIRMWARE_BIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 2. Extract raw R and S components from DER signature into raw 64-byte binary&lt;br /&gt;
openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER &amp;gt; &amp;quot;$TEMP_DIR/sig.asn1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Extract hex for integer R and S&lt;br /&gt;
R_HEX=$(openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER | awk -F':' '/INTEGER/ {print $4}' | sed -n '1p')&lt;br /&gt;
S_HEX=$(openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER | awk -F':' '/INTEGER/ {print $4}' | sed -n '2p')&lt;br /&gt;
&lt;br /&gt;
# Pad or strip lead zeroes so each is exactly 32 bytes (64 hex characters)&lt;br /&gt;
R_HEX=$(printf &amp;quot;%064s&amp;quot; &amp;quot;${R_HEX#00}&amp;quot; | tr ' ' '0' | tail -c 64)&lt;br /&gt;
S_HEX=$(printf &amp;quot;%064s&amp;quot; &amp;quot;${S_HEX#00}&amp;quot; | tr ' ' '0' | tail -c 64)&lt;br /&gt;
&lt;br /&gt;
# Convert R + S hex to raw binary (64 bytes)&lt;br /&gt;
echo -n &amp;quot;${R_HEX}${S_HEX}&amp;quot; | xxd -r -p &amp;gt; &amp;quot;$TEMP_DIR/sig_raw.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[2/4] Building 128-byte Header...&amp;quot;&lt;br /&gt;
# Magic Bytes: &amp;quot;KAPP&amp;quot; (0x4150504B in Little-Endian)&lt;br /&gt;
printf '\x4B\x50\x50\x41' &amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Payload Length: 4-byte Little-Endian uint32&lt;br /&gt;
PAYLOAD_SIZE=$(stat -c%s &amp;quot;$FIRMWARE_BIN&amp;quot; 2&amp;gt;/dev/null || stat -f%z &amp;quot;$FIRMWARE_BIN&amp;quot;)&lt;br /&gt;
python3 -c &amp;quot;import struct, sys; sys.stdout.buffer.write(struct.pack('&amp;lt;I', $PAYLOAD_SIZE))&amp;quot; &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Append 64-byte Raw Signature&lt;br /&gt;
cat &amp;quot;$TEMP_DIR/sig_raw.bin&amp;quot; &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Append 56-byte zero padding to complete the 128-byte header&lt;br /&gt;
dd if=/dev/zero bs=1 count=56 2&amp;gt;/dev/null &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[3/4] Concatenating Header and Firmware Payload...&amp;quot;&lt;br /&gt;
cat &amp;quot;$TEMP_DIR/header.bin&amp;quot; &amp;quot;$FIRMWARE_BIN&amp;quot; &amp;gt; &amp;quot;$OUTPUT_BIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[4/4] Done!&amp;quot;&lt;br /&gt;
echo &amp;quot;Generated Signed Firmware : $OUTPUT_BIN&amp;quot;&lt;br /&gt;
echo &amp;quot;Original Payload Size     : $PAYLOAD_SIZE bytes&amp;quot;&lt;br /&gt;
echo &amp;quot;Final Image Size          : $(stat -c%s &amp;quot;$OUTPUT_BIN&amp;quot; 2&amp;gt;/dev/null || stat -f%z &amp;quot;$OUTPUT_BIN&amp;quot;) bytes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This script can be used to sign the output binary:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/src/stm32fun/examples/sl_mcu_stm32f407_bootloader_signed_app$ ./package_firmware.sh Debug/sl_mcu_stm32f407_bootloader_signed_app.bin &lt;br /&gt;
[1/4] Calculating SHA-256 hash and ECDSA signature...&lt;br /&gt;
[2/4] Building 128-byte Header...&lt;br /&gt;
[3/4] Concatenating Header and Firmware Payload...&lt;br /&gt;
[4/4] Done!&lt;br /&gt;
Generated Signed Firmware : app_signed.bin&lt;br /&gt;
Original Payload Size     : 61900 bytes&lt;br /&gt;
Final Image Size          : 62028 bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TinyUSB DFU ==&lt;br /&gt;
&lt;br /&gt;
The earlier approach was using HAL USB DFU, but as [[ST]] in their ''wisdom'' have decided that they couldn't be bothered to support all their [[MCU]]s any longer, I am going to use [[TinyUSB]] for this example.&lt;br /&gt;
&lt;br /&gt;
== MbedTLS Signature Checking ==&lt;br /&gt;
&lt;br /&gt;
To be added&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous links ==&lt;br /&gt;
&lt;br /&gt;
* [[Custom DFU Bootloader]]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8766</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8766"/>
		<updated>2026-10-28T00:04:41Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
This page will document how to implement a secure firmware update.&lt;br /&gt;
&lt;br /&gt;
NOTICE! Do '''not''' rely on the code on this page or in the repository for production.  This is meant to document the principles.&lt;br /&gt;
&lt;br /&gt;
This page expands on an earlier [[DFU]] bootloader, documented here: [[Custom DFU Bootloader]]&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
In principle, two approaches are viable.  Either the bootloader will occupy the first part of the flash, or it will occupy the end of the flash.&lt;br /&gt;
&lt;br /&gt;
If locating the bootloader in the beginning of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader beginning.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address       Memory Region / Sector                               Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0801 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0800 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if placing the bootloader towards the end of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader end.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address        Memory Region / Sector                             Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |  Bootloader Code                                  |    ^&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0807 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0806 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0800 0000       |  (Application Vector Table &amp;amp; Entry Point)         |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Signing firmware ==&lt;br /&gt;
&lt;br /&gt;
The signature will be stored in a 128 byte block which will be merged with the actual firmware binary.  The format of that structure is like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
    uint32_t magic;          // 4 bytes: Magic identifier (e.g. 0x4150504B / &amp;quot;KAPP&amp;quot;)&lt;br /&gt;
    uint32_t payload_len;    // 4 bytes: Size of binary firmware in bytes&lt;br /&gt;
    uint8_t signature[64];  // 64 bytes: ECDSA raw signature (32-byte R + 32-byte S)&lt;br /&gt;
    uint8_t reserved[56];   // 56 bytes: Zero padding to align header to 128 bytes&lt;br /&gt;
} Header128_t;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First step will be to generate a private key:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl ecparam -name prime256v1 -genkey -noout -out private_key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This key '''must''' be kept private.  Anyone gaining access to it will be able to sign their own firmware.&lt;br /&gt;
&lt;br /&gt;
After generating a private key, a public key can be derived:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl ec -in private_key.pem -pubout -out public_key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This key is public and the actual contents of the public_key.pem is included in the code.&lt;br /&gt;
&lt;br /&gt;
Signing a binary takes multiple steps and for ease of use we've created a shell script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env bash&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
# Configurable paths&lt;br /&gt;
FIRMWARE_BIN=&amp;quot;${1:-app.bin}&amp;quot;&lt;br /&gt;
PRIVATE_KEY=&amp;quot;${2:-private_key.pem}&amp;quot;&lt;br /&gt;
OUTPUT_BIN=&amp;quot;${3:-app_signed.bin}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Check required files&lt;br /&gt;
if [[ ! -f &amp;quot;$FIRMWARE_BIN&amp;quot; ]] || [[ ! -f &amp;quot;$PRIVATE_KEY&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;Usage: $0 &amp;lt;firmware.bin&amp;gt; &amp;lt;private_key.pem&amp;gt; [output.bin]&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
TEMP_DIR=$(mktemp -d)&lt;br /&gt;
trap 'rm -rf &amp;quot;$TEMP_DIR&amp;quot;' EXIT&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[1/4] Calculating SHA-256 hash and ECDSA signature...&amp;quot;&lt;br /&gt;
# 1. Output DER signature from OpenSSL&lt;br /&gt;
openssl dgst -sha256 -sign &amp;quot;$PRIVATE_KEY&amp;quot; -out &amp;quot;$TEMP_DIR/sig.der&amp;quot; &amp;quot;$FIRMWARE_BIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 2. Extract raw R and S components from DER signature into raw 64-byte binary&lt;br /&gt;
openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER &amp;gt; &amp;quot;$TEMP_DIR/sig.asn1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Extract hex for integer R and S&lt;br /&gt;
R_HEX=$(openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER | awk -F':' '/INTEGER/ {print $4}' | sed -n '1p')&lt;br /&gt;
S_HEX=$(openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER | awk -F':' '/INTEGER/ {print $4}' | sed -n '2p')&lt;br /&gt;
&lt;br /&gt;
# Pad or strip lead zeroes so each is exactly 32 bytes (64 hex characters)&lt;br /&gt;
R_HEX=$(printf &amp;quot;%064s&amp;quot; &amp;quot;${R_HEX#00}&amp;quot; | tr ' ' '0' | tail -c 64)&lt;br /&gt;
S_HEX=$(printf &amp;quot;%064s&amp;quot; &amp;quot;${S_HEX#00}&amp;quot; | tr ' ' '0' | tail -c 64)&lt;br /&gt;
&lt;br /&gt;
# Convert R + S hex to raw binary (64 bytes)&lt;br /&gt;
echo -n &amp;quot;${R_HEX}${S_HEX}&amp;quot; | xxd -r -p &amp;gt; &amp;quot;$TEMP_DIR/sig_raw.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[2/4] Building 128-byte Header...&amp;quot;&lt;br /&gt;
# Magic Bytes: &amp;quot;KAPP&amp;quot; (0x4150504B in Little-Endian)&lt;br /&gt;
printf '\x4B\x50\x50\x41' &amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Payload Length: 4-byte Little-Endian uint32&lt;br /&gt;
PAYLOAD_SIZE=$(stat -c%s &amp;quot;$FIRMWARE_BIN&amp;quot; 2&amp;gt;/dev/null || stat -f%z &amp;quot;$FIRMWARE_BIN&amp;quot;)&lt;br /&gt;
python3 -c &amp;quot;import struct, sys; sys.stdout.buffer.write(struct.pack('&amp;lt;I', $PAYLOAD_SIZE))&amp;quot; &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Append 64-byte Raw Signature&lt;br /&gt;
cat &amp;quot;$TEMP_DIR/sig_raw.bin&amp;quot; &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Append 56-byte zero padding to complete the 128-byte header&lt;br /&gt;
dd if=/dev/zero bs=1 count=56 2&amp;gt;/dev/null &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[3/4] Concatenating Header and Firmware Payload...&amp;quot;&lt;br /&gt;
cat &amp;quot;$TEMP_DIR/header.bin&amp;quot; &amp;quot;$FIRMWARE_BIN&amp;quot; &amp;gt; &amp;quot;$OUTPUT_BIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[4/4] Done!&amp;quot;&lt;br /&gt;
echo &amp;quot;Generated Signed Firmware : $OUTPUT_BIN&amp;quot;&lt;br /&gt;
echo &amp;quot;Original Payload Size     : $PAYLOAD_SIZE bytes&amp;quot;&lt;br /&gt;
echo &amp;quot;Final Image Size          : $(stat -c%s &amp;quot;$OUTPUT_BIN&amp;quot; 2&amp;gt;/dev/null || stat -f%z &amp;quot;$OUTPUT_BIN&amp;quot;) bytes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This script can be used to sign the output binary:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/src/stm32fun/examples/sl_mcu_stm32f407_bootloader_signed_app$ ./package_firmware.sh Debug/sl_mcu_stm32f407_bootloader_signed_app.bin &lt;br /&gt;
[1/4] Calculating SHA-256 hash and ECDSA signature...&lt;br /&gt;
[2/4] Building 128-byte Header...&lt;br /&gt;
[3/4] Concatenating Header and Firmware Payload...&lt;br /&gt;
[4/4] Done!&lt;br /&gt;
Generated Signed Firmware : app_signed.bin&lt;br /&gt;
Original Payload Size     : 61900 bytes&lt;br /&gt;
Final Image Size          : 62028 bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TinyUSB DFU ==&lt;br /&gt;
&lt;br /&gt;
To be added&lt;br /&gt;
&lt;br /&gt;
== MbedTLS Signature Checking ==&lt;br /&gt;
&lt;br /&gt;
To be added&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous links ==&lt;br /&gt;
&lt;br /&gt;
* [[Custom DFU Bootloader]]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8765</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8765"/>
		<updated>2026-10-28T00:00:16Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
This page will document how to implement a secure firmware update.&lt;br /&gt;
&lt;br /&gt;
NOTICE! Do '''not''' rely on the code on this page or in the repository for production.  This is meant to document the principles.&lt;br /&gt;
&lt;br /&gt;
This page expands on an earlier [[DFU]] bootloader, documented here: [[Custom DFU Bootloader]]&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
In principle, two approaches are viable.  Either the bootloader will occupy the first part of the flash, or it will occupy the end of the flash.&lt;br /&gt;
&lt;br /&gt;
If locating the bootloader in the beginning of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader beginning.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address       Memory Region / Sector                               Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0801 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0800 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if placing the bootloader towards the end of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader end.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address        Memory Region / Sector                             Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |  Bootloader Code                                  |    ^&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0807 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0806 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0800 0000       |  (Application Vector Table &amp;amp; Entry Point)         |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Signing firmware ==&lt;br /&gt;
&lt;br /&gt;
The signature will be stored in a 128 byte block which will be merged with the actual firmware binary.  The format of that structure is like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
    uint32_t magic;          // 4 bytes: Magic identifier (e.g. 0x4150504B / &amp;quot;KAPP&amp;quot;)&lt;br /&gt;
    uint32_t payload_len;    // 4 bytes: Size of binary firmware in bytes&lt;br /&gt;
    uint8_t signature[64];  // 64 bytes: ECDSA raw signature (32-byte R + 32-byte S)&lt;br /&gt;
    uint8_t reserved[56];   // 56 bytes: Zero padding to align header to 128 bytes&lt;br /&gt;
} Header128_t;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First step will be to generate a private key:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl ecparam -name prime256v1 -genkey -noout -out private_key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This key '''must''' be kept private.  Anyone gaining access to it will be able to sign their own firmware.&lt;br /&gt;
&lt;br /&gt;
After generating a private key, a public key can be derived:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl ec -in private_key.pem -pubout -out public_key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This key is public and the actual contents of the public_key.pem is included in the code.&lt;br /&gt;
&lt;br /&gt;
Signing a binary takes multiple steps and for ease of use we've created a shell script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env bash&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
# Configurable paths&lt;br /&gt;
FIRMWARE_BIN=&amp;quot;${1:-app.bin}&amp;quot;&lt;br /&gt;
PRIVATE_KEY=&amp;quot;${2:-private_key.pem}&amp;quot;&lt;br /&gt;
OUTPUT_BIN=&amp;quot;${3:-app_signed.bin}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Check required files&lt;br /&gt;
if [[ ! -f &amp;quot;$FIRMWARE_BIN&amp;quot; ]] || [[ ! -f &amp;quot;$PRIVATE_KEY&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;Usage: $0 &amp;lt;firmware.bin&amp;gt; &amp;lt;private_key.pem&amp;gt; [output.bin]&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
TEMP_DIR=$(mktemp -d)&lt;br /&gt;
trap 'rm -rf &amp;quot;$TEMP_DIR&amp;quot;' EXIT&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[1/4] Calculating SHA-256 hash and ECDSA signature...&amp;quot;&lt;br /&gt;
# 1. Output DER signature from OpenSSL&lt;br /&gt;
openssl dgst -sha256 -sign &amp;quot;$PRIVATE_KEY&amp;quot; -out &amp;quot;$TEMP_DIR/sig.der&amp;quot; &amp;quot;$FIRMWARE_BIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 2. Extract raw R and S components from DER signature into raw 64-byte binary&lt;br /&gt;
openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER &amp;gt; &amp;quot;$TEMP_DIR/sig.asn1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Extract hex for integer R and S&lt;br /&gt;
R_HEX=$(openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER | awk -F':' '/INTEGER/ {print $4}' | sed -n '1p')&lt;br /&gt;
S_HEX=$(openssl asn1parse -in &amp;quot;$TEMP_DIR/sig.der&amp;quot; -inform DER | awk -F':' '/INTEGER/ {print $4}' | sed -n '2p')&lt;br /&gt;
&lt;br /&gt;
# Pad or strip lead zeroes so each is exactly 32 bytes (64 hex characters)&lt;br /&gt;
R_HEX=$(printf &amp;quot;%064s&amp;quot; &amp;quot;${R_HEX#00}&amp;quot; | tr ' ' '0' | tail -c 64)&lt;br /&gt;
S_HEX=$(printf &amp;quot;%064s&amp;quot; &amp;quot;${S_HEX#00}&amp;quot; | tr ' ' '0' | tail -c 64)&lt;br /&gt;
&lt;br /&gt;
# Convert R + S hex to raw binary (64 bytes)&lt;br /&gt;
echo -n &amp;quot;${R_HEX}${S_HEX}&amp;quot; | xxd -r -p &amp;gt; &amp;quot;$TEMP_DIR/sig_raw.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[2/4] Building 128-byte Header...&amp;quot;&lt;br /&gt;
# Magic Bytes: &amp;quot;KAPP&amp;quot; (0x4150504B in Little-Endian)&lt;br /&gt;
printf '\x4B\x50\x50\x41' &amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Payload Length: 4-byte Little-Endian uint32&lt;br /&gt;
PAYLOAD_SIZE=$(stat -c%s &amp;quot;$FIRMWARE_BIN&amp;quot; 2&amp;gt;/dev/null || stat -f%z &amp;quot;$FIRMWARE_BIN&amp;quot;)&lt;br /&gt;
python3 -c &amp;quot;import struct, sys; sys.stdout.buffer.write(struct.pack('&amp;lt;I', $PAYLOAD_SIZE))&amp;quot; &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Append 64-byte Raw Signature&lt;br /&gt;
cat &amp;quot;$TEMP_DIR/sig_raw.bin&amp;quot; &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Append 56-byte zero padding to complete the 128-byte header&lt;br /&gt;
dd if=/dev/zero bs=1 count=56 2&amp;gt;/dev/null &amp;gt;&amp;gt; &amp;quot;$TEMP_DIR/header.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[3/4] Concatenating Header and Firmware Payload...&amp;quot;&lt;br /&gt;
cat &amp;quot;$TEMP_DIR/header.bin&amp;quot; &amp;quot;$FIRMWARE_BIN&amp;quot; &amp;gt; &amp;quot;$OUTPUT_BIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;[4/4] Done!&amp;quot;&lt;br /&gt;
echo &amp;quot;Generated Signed Firmware : $OUTPUT_BIN&amp;quot;&lt;br /&gt;
echo &amp;quot;Original Payload Size     : $PAYLOAD_SIZE bytes&amp;quot;&lt;br /&gt;
echo &amp;quot;Final Image Size          : $(stat -c%s &amp;quot;$OUTPUT_BIN&amp;quot; 2&amp;gt;/dev/null || stat -f%z &amp;quot;$OUTPUT_BIN&amp;quot;) bytes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TinyUSB DFU ==&lt;br /&gt;
&lt;br /&gt;
To be added&lt;br /&gt;
&lt;br /&gt;
== MbedTLS Signature Checking ==&lt;br /&gt;
&lt;br /&gt;
To be added&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous links ==&lt;br /&gt;
&lt;br /&gt;
* [[Custom DFU Bootloader]]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8764</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8764"/>
		<updated>2026-10-27T23:46:38Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
This page will document how to implement a secure firmware update.&lt;br /&gt;
&lt;br /&gt;
NOTICE! Do '''not''' rely on the code on this page or in the repository for production.  This is meant to document the principles.&lt;br /&gt;
&lt;br /&gt;
This page expands on an earlier [[DFU]] bootloader, documented here: [[Custom DFU Bootloader]]&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
In principle, two approaches are viable.  Either the bootloader will occupy the first part of the flash, or it will occupy the end of the flash.&lt;br /&gt;
&lt;br /&gt;
If locating the bootloader in the beginning of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader beginning.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address       Memory Region / Sector                               Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0801 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0800 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if placing the bootloader towards the end of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader end.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address        Memory Region / Sector                             Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |  Bootloader Code                                  |    ^&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0807 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0806 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0800 0000       |  (Application Vector Table &amp;amp; Entry Point)         |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous links ==&lt;br /&gt;
&lt;br /&gt;
* [[Custom DFU Bootloader]]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade&amp;diff=8763</id>
		<title>Secure Firmware Upgrade</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade&amp;diff=8763"/>
		<updated>2026-10-27T02:30:51Z</updated>

		<summary type="html">&lt;p&gt;Lth: Lth moved page Secure Firmware Upgrade to Secure Firmware Upgrade Bootloader and Application&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Secure Firmware Upgrade Bootloader and Application]]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8762</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8762"/>
		<updated>2026-10-27T02:30:51Z</updated>

		<summary type="html">&lt;p&gt;Lth: Lth moved page Secure Firmware Upgrade to Secure Firmware Upgrade Bootloader and Application&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
In principle, two approaches are viable.  Either the bootloader will occupy the first part of the flash, or it will occupy the end of the flash.&lt;br /&gt;
&lt;br /&gt;
If locating the bootloader in the beginning of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader beginning.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address       Memory Region / Sector                               Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0801 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0800 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if placing the bootloader towards the end of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader end.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address        Memory Region / Sector                             Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |  Bootloader Code                                  |    ^&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0807 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0806 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0800 0000       |  (Application Vector Table &amp;amp; Entry Point)         |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8761</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8761"/>
		<updated>2026-10-27T01:43:49Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
In principle, two approaches are viable.  Either the bootloader will occupy the first part of the flash, or it will occupy the end of the flash.&lt;br /&gt;
&lt;br /&gt;
If locating the bootloader in the beginning of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader beginning.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address       Memory Region / Sector                               Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0801 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0800 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if placing the bootloader towards the end of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader end.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address        Memory Region / Sector                             Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |  Bootloader Code                                  |    ^&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0807 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0806 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0800 0000       |  (Application Vector Table &amp;amp; Entry Point)         |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8760</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8760"/>
		<updated>2026-10-27T01:40:34Z</updated>

		<summary type="html">&lt;p&gt;Lth: /* Flash Partitioning options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
In principle, two approaches are viable.  Either the bootloader will occupy the first part of the flash, or it will occupy the end of the flash.&lt;br /&gt;
&lt;br /&gt;
If locating the bootloader in the beginning of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader beginning.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address       Memory Region / Sector                               Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0801 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0800 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if placing the bootloader towards the end of the flash, the layout will look like this:&lt;br /&gt;
[[File:Bootloader end.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address        Memory Region / Sector                             Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |  Bootloader Code                                  |    ^&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0807 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0806 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0800 0000       |  (Application Vector Table &amp;amp; Entry Point)         |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Bootloader Maps.jpeg|800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8759</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8759"/>
		<updated>2026-10-27T01:36:44Z</updated>

		<summary type="html">&lt;p&gt;Lth: /* Flash Partitioning options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
In principle, two approaches are viable.  Either the bootloader will occupy the first part of the flash, or it will occupy the end of the flash.&lt;br /&gt;
[[File:Bootloader beginning.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address       Memory Region / Sector                               Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0801 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0800 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Bootloader end.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address        Memory Region / Sector                             Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |  Bootloader Code                                  |    ^&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0807 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0806 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0800 0000       |  (Application Vector Table &amp;amp; Entry Point)         |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Bootloader Maps.jpeg|800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8758</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8758"/>
		<updated>2026-10-27T01:33:51Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
[[File:Bootloader beginning.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address       Memory Region / Sector                               Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0801 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0800 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Bootloader end.jpeg|thumb|400px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address        Memory Region / Sector                             Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |  Bootloader Code                                  |    ^&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0807 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0806 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0800 0000       |  (Application Vector Table &amp;amp; Entry Point)         |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Bootloader Maps.jpeg|800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=File:Bootloader_end.jpeg&amp;diff=8757</id>
		<title>File:Bootloader end.jpeg</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=File:Bootloader_end.jpeg&amp;diff=8757"/>
		<updated>2026-10-27T01:32:05Z</updated>

		<summary type="html">&lt;p&gt;Lth: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=File:Bootloader_beginning.jpeg&amp;diff=8756</id>
		<title>File:Bootloader beginning.jpeg</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=File:Bootloader_beginning.jpeg&amp;diff=8756"/>
		<updated>2026-10-27T01:32:02Z</updated>

		<summary type="html">&lt;p&gt;Lth: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8755</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8755"/>
		<updated>2026-10-27T01:14:47Z</updated>

		<summary type="html">&lt;p&gt;Lth: /* Flash Partitioning options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Memory Address       Memory Region / Sector                               Size&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
|        :           |  User Application Area                            |    |&lt;br /&gt;
|        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
|        :           |                                                   |    |&lt;br /&gt;
|  0x0801 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
|  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
|        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
|  0x0800 0000       |                                                   |    v&lt;br /&gt;
+--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Bootloader Maps.jpeg|800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8754</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8754"/>
		<updated>2026-10-27T01:13:46Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Memory Address                 Memory Region / Sector            Size&lt;br /&gt;
   +--------------------+---------------------------------------------------+ --------&lt;br /&gt;
   |  0x0807 FFFF       |                                                   |    ^&lt;br /&gt;
   |        :           |  User Application Area                            |    |&lt;br /&gt;
   |        :           |  (Upper Flash Space)                              |  448 KB&lt;br /&gt;
   |        :           |                                                   |    |&lt;br /&gt;
   |  0x0801 0000       |                                                   |    v&lt;br /&gt;
   +--------------------+---------------------------------------------------+ --------&lt;br /&gt;
   |  0x0800 FFFF       |  Bootloader Code / Vector Table                   |    ^&lt;br /&gt;
   |        :           |  (Lower Flash Space)                              |   64 KB&lt;br /&gt;
   |  0x0800 0000       |                                                   |    v&lt;br /&gt;
   +--------------------+---------------------------------------------------+ --------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Bootloader Maps.jpeg|800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8753</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8753"/>
		<updated>2026-10-27T01:10:31Z</updated>

		<summary type="html">&lt;p&gt;Lth: /* Flash Partitioning options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Bootloader Maps.jpeg|800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8752</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8752"/>
		<updated>2026-10-27T01:10:16Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
&lt;br /&gt;
== Flash Partitioning options ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Bootloader Maps.jpeg|3400px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=File:Bootloader_Maps.jpeg&amp;diff=8751</id>
		<title>File:Bootloader Maps.jpeg</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=File:Bootloader_Maps.jpeg&amp;diff=8751"/>
		<updated>2026-10-27T01:09:38Z</updated>

		<summary type="html">&lt;p&gt;Lth: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8750</id>
		<title>Secure Firmware Upgrade Bootloader and Application</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Secure_Firmware_Upgrade_Bootloader_and_Application&amp;diff=8750"/>
		<updated>2026-10-27T01:02:41Z</updated>

		<summary type="html">&lt;p&gt;Lth: Created page with &amp;quot;Category:STM32Category:USBCategory:STM32 DevelopmentCategory:Work in progress{{metadesc|How to create a secure DFU bootloader and application}} To be added&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:USB]][[Category:STM32 Development]][[Category:Work in progress]]{{metadesc|How to create a secure DFU bootloader and application}}&lt;br /&gt;
To be added&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Timer_PWM_Input_Capture&amp;diff=8747</id>
		<title>Timer PWM Input Capture</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Timer_PWM_Input_Capture&amp;diff=8747"/>
		<updated>2026-10-26T06:27:09Z</updated>

		<summary type="html">&lt;p&gt;Lth: Created page with &amp;quot;{{Video |series=STM32 Remake Video |number=5 |title=Timer PWM Input Capture |youtube-id=PDhE7xIZaiI |description=This 2026 remake will cover STM32 Timer Input Capture on a STM...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Video&lt;br /&gt;
|series=STM32 Remake Video&lt;br /&gt;
|number=5&lt;br /&gt;
|title=Timer PWM Input Capture&lt;br /&gt;
|youtube-id=PDhE7xIZaiI&lt;br /&gt;
|description=This 2026 remake will cover STM32 Timer Input Capture on a STM32H723.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=STM32_Hidden_Flash&amp;diff=8746</id>
		<title>STM32 Hidden Flash</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=STM32_Hidden_Flash&amp;diff=8746"/>
		<updated>2026-10-25T00:22:56Z</updated>

		<summary type="html">&lt;p&gt;Lth: /* STM32F407 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Flash]][[Category:STM32 Hardware]][[Category:STM32 Documentation]][[Category:STM32 Development]]{{metadesc|STM32 Real Flash Size}}&lt;br /&gt;
Many [[STM32]] [[MCU]]s have more flash than they claim to have.&lt;br /&gt;
&lt;br /&gt;
This has been confirmed on [[STM32F103]], [[STM32L432]] and [[STM32F40x]].&lt;br /&gt;
&lt;br /&gt;
== Speculation ==&lt;br /&gt;
&lt;br /&gt;
While not confirmed it is quite possible that this is common in all [[STM32]] [[MCU]]s which share datasheets.  If we look at the STM32G474, the datasheet overview looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Example datasheet STM32G474xB STM32G474xC STM32G474xE.png|800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most likely, these MCU's all have 512 kB of flash even if some report having less.&lt;br /&gt;
&lt;br /&gt;
== Video == &lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|lMNvgP76n2E}}&lt;br /&gt;
&lt;br /&gt;
== STM32L432 ==&lt;br /&gt;
[[File:FidoKey rev. a - top view.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
The STM32L432Kx is available with two different flash sizes.  The STM32L432KB has got 128 kB while the STM32L432KC has got 256 kB.&lt;br /&gt;
I recently created a USB &amp;quot;key&amp;quot; using the STM32L432.  The reason for using this specific [[STM32]] [[MCU]] was twofold:&lt;br /&gt;
&lt;br /&gt;
# It is small&lt;br /&gt;
# It's got a built-in 48 MHz oscillator precise enough to use USB without an external crystal&lt;br /&gt;
&lt;br /&gt;
Unfortunately, while I wanted the 256 kB version, only the 128 kB version was available.&lt;br /&gt;
&lt;br /&gt;
[[File:STM32L432 Part Numbering.png|600px]]&lt;br /&gt;
&lt;br /&gt;
The [[STM32]] [[Blue Pill]] boards mostly use Chinese clone [[MCU]]s but there has been a lot of writing about the original ones having 128 kB of flash rather than the 64 kB specified by the datasheet.  There is even a [https://mecrisp-stellaris-folkdoc.sourceforge.io/bluepill-diagnostics-v1.6.html test tool] available which can test for the hidden flash.&lt;br /&gt;
&lt;br /&gt;
Inspired by this, I decided to test the STM32L432KB on my own board.  As per the datasheet this processor is supposed to have 128 kB of flash ranging from 0x8000000 to 0x801FFFF.&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
[[File:Flash Size Test Setup.jpg|thumb|300px|STM32L432 Test Setup]] &lt;br /&gt;
&lt;br /&gt;
=== Checking device ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-info --probe&lt;br /&gt;
Found 1 stlink programmers&lt;br /&gt;
  version:    V2J45S31&lt;br /&gt;
  serial:     066CFF3933584B3043184346&lt;br /&gt;
  flash:      131072 (pagesize: 2048)&lt;br /&gt;
  sram:       49152&lt;br /&gt;
  chipid:     0x435&lt;br /&gt;
  dev-type:   STM32L41x_L42x&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that the device reports 128 kB of flash - as is expected.&lt;br /&gt;
&lt;br /&gt;
=== Generating Test Data ===&lt;br /&gt;
&lt;br /&gt;
First step is to create a 256 kB file with random data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ dd if=/dev/urandom of=random.bin bs=1k count=256&lt;br /&gt;
256+0 records in&lt;br /&gt;
256+0 records out&lt;br /&gt;
262144 bytes (262 kB, 256 KiB) copied, 0.0012241 s, 214 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing data to MCU ===&lt;br /&gt;
&lt;br /&gt;
The random.bin file is of a size which should only be possible to flash on STM32L432KC.&lt;br /&gt;
&lt;br /&gt;
First step is to flash normal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-flash write random.bin 0x8000000&lt;br /&gt;
st-flash 1.8.0&lt;br /&gt;
2024-09-02T10:30:01 INFO common.c: STM32L41x_L42x: 48 KiB SRAM, 128 KiB flash in at least 2 KiB pages.&lt;br /&gt;
file random.bin md5 checksum: 5f7ebd5c822e7408e6279445eb1444a, stlink checksum: 0x01fe53dd&lt;br /&gt;
2024-09-02T10:30:01 INFO common_flash.c: Attempting to write 262144 (0x40000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
2024-09-02T10:30:01 ERROR common_flash.c: The size exceeds the size of the flash (0x00020000 bytes available)&lt;br /&gt;
stlink_fwrite_flash() == -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As expected this failed.  The [[MCU]] reports 128 kB of flash and we attempt to write 256 kB.  We can however instruct st-flash to ignore that and attempt to write the entire file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-flash --flash=256k write random.bin 0x8000000&lt;br /&gt;
st-flash 1.8.0&lt;br /&gt;
2024-09-02T10:30:26 INFO common.c: STM32L41x_L42x: 48 KiB SRAM, 128 KiB flash in at least 2 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00040000&lt;br /&gt;
file random.bin md5 checksum: 5f7ebd5c822e7408e6279445eb1444a, stlink checksum: 0x01fe53dd&lt;br /&gt;
2024-09-02T10:30:26 INFO common_flash.c: Attempting to write 262144 (0x40000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
EraseFlash - Page:0x10 Size:0x800 -&amp;gt; Flash page at 0x8008000 erased (size: 0x800EraseFlash - Page:0x11 Size:0x800 -&amp;gt; Flash page at 0x8008800 erased (size: 0x800EraseFlash - Page:0x12 Size:0x800 -&amp;gt; Flash page at 0x8009000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x13 Size:0x800 -&amp;gt; Flash page at 0x8009800 erased (size: 0x800EraseFlash - Page:0x14 Size:0x800 -&amp;gt; Flash page at 0x800a000 erased (size: 0x800EraseFlash - Page:0x15 Size:0x800 -&amp;gt; Flash page at 0x800a800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x16 Size:0x800 -&amp;gt; Flash page at 0x800b000 erased (size: 0x800EraseFlash - Page:0x17 Size:0x800 -&amp;gt; Flash page at 0x800b800 erased (size: 0x800EraseFlash - Page:0x18 Size:0x800 -&amp;gt; Flash page at 0x800c000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x19 Size:0x800 -&amp;gt; Flash page at 0x800c800 erased (size: 0x800EraseFlash - Page:0x1a Size:0x800 -&amp;gt; Flash page at 0x800d000 erased (size: 0x800EraseFlash - Page:0x1b Size:0x800 -&amp;gt; Flash page at 0x800d800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x1c Size:0x800 -&amp;gt; Flash page at 0x800e000 erased (size: 0x800EraseFlash - Page:0x1d Size:0x800 -&amp;gt; Flash page at 0x800e800 erased (size: 0x800EraseFlash - Page:0x1e Size:0x800 -&amp;gt; Flash page at 0x800f000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x1f Size:0x800 -&amp;gt; Flash page at 0x800f800 erased (size: 0x800EraseFlash - Page:0x20 Size:0x800 -&amp;gt; Flash page at 0x8010000 erased (size: 0x800EraseFlash - Page:0x21 Size:0x800 -&amp;gt; Flash page at 0x8010800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x22 Size:0x800 -&amp;gt; Flash page at 0x8011000 erased (size: 0x800EraseFlash - Page:0x23 Size:0x800 -&amp;gt; Flash page at 0x8011800 erased (size: 0x800EraseFlash - Page:0x24 Size:0x800 -&amp;gt; Flash page at 0x8012000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x25 Size:0x800 -&amp;gt; Flash page at 0x8012800 erased (size: 0x800EraseFlash - Page:0x26 Size:0x800 -&amp;gt; Flash page at 0x8013000 erased (size: 0x800EraseFlash - Page:0x27 Size:0x800 -&amp;gt; Flash page at 0x8013800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x28 Size:0x800 -&amp;gt; Flash page at 0x8014000 erased (size: 0x800EraseFlash - Page:0x29 Size:0x800 -&amp;gt; Flash page at 0x8014800 erased (size: 0x800EraseFlash - Page:0x2a Size:0x800 -&amp;gt; Flash page at 0x8015000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x2b Size:0x800 -&amp;gt; Flash page at 0x8015800 erased (size: 0x800EraseFlash - Page:0x2c Size:0x800 -&amp;gt; Flash page at 0x8016000 erased (size: 0x800EraseFlash - Page:0x2d Size:0x800 -&amp;gt; Flash page at 0x8016800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x2e Size:0x800 -&amp;gt; Flash page at 0x8017000 erased (size: 0x800EraseFlash - Page:0x2f Size:0x800 -&amp;gt; Flash page at 0x8017800 erased (size: 0x800EraseFlash - Page:0x30 Size:0x800 -&amp;gt; Flash page at 0x8018000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x31 Size:0x800 -&amp;gt; Flash page at 0x8018800 erased (size: 0x800EraseFlash - Page:0x32 Size:0x800 -&amp;gt; Flash page at 0x8019000 erased (size: 0x800EraseFlash - Page:0x33 Size:0x800 -&amp;gt; Flash page at 0x8019800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x34 Size:0x800 -&amp;gt; Flash page at 0x801a000 erased (size: 0x800EraseFlash - Page:0x35 Size:0x800 -&amp;gt; Flash page at 0x801a800 erased (size: 0x800EraseFlash - Page:0x36 Size:0x800 -&amp;gt; Flash page at 0x801b000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x37 Size:0x800 -&amp;gt; Flash page at 0x801b800 erased (size: 0x800EraseFlash - Page:0x38 Size:0x800 -&amp;gt; Flash page at 0x801c000 erased (size: 0x800EraseFlash - Page:0x39 Size:0x800 -&amp;gt; Flash page at 0x801c800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x3a Size:0x800 -&amp;gt; Flash page at 0x801d000 erased (size: 0x800EraseFlash - Page:0x3b Size:0x800 -&amp;gt; Flash page at 0x801d800 erased (size: 0x800EraseFlash - Page:0x3c Size:0x800 -&amp;gt; Flash page at 0x801e000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x3d Size:0x800 -&amp;gt; Flash page at 0x801e800 erased (size: 0x800EraseFlash - Page:0x3e Size:0x800 -&amp;gt; Flash page at 0x801f000 erased (size: 0x800EraseFlash - Page:0x3f Size:0x800 -&amp;gt; Flash page at 0x801f800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x40 Size:0x800 -&amp;gt; Flash page at 0x8020000 erased (size: 0x800EraseFlash - Page:0x41 Size:0x800 -&amp;gt; Flash page at 0x8020800 erased (size: 0x800EraseFlash - Page:0x42 Size:0x800 -&amp;gt; Flash page at 0x8021000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x43 Size:0x800 -&amp;gt; Flash page at 0x8021800 erased (size: 0x800EraseFlash - Page:0x44 Size:0x800 -&amp;gt; Flash page at 0x8022000 erased (size: 0x800EraseFlash - Page:0x45 Size:0x800 -&amp;gt; Flash page at 0x8022800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x46 Size:0x800 -&amp;gt; Flash page at 0x8023000 erased (size: 0x800EraseFlash - Page:0x47 Size:0x800 -&amp;gt; Flash page at 0x8023800 erased (size: 0x800EraseFlash - Page:0x48 Size:0x800 -&amp;gt; Flash page at 0x8024000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x49 Size:0x800 -&amp;gt; Flash page at 0x8024800 erased (size: 0x800EraseFlash - Page:0x4a Size:0x800 -&amp;gt; Flash page at 0x8025000 erased (size: 0x800EraseFlash - Page:0x4b Size:0x800 -&amp;gt; Flash page at 0x8025800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x4c Size:0x800 -&amp;gt; Flash page at 0x8026000 erased (size: 0x800EraseFlash - Page:0x4d Size:0x800 -&amp;gt; Flash page at 0x8026800 erased (size: 0x800EraseFlash - Page:0x4e Size:0x800 -&amp;gt; Flash page at 0x8027000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x4f Size:0x800 -&amp;gt; Flash page at 0x8027800 erased (size: 0x800EraseFlash - Page:0x50 Size:0x800 -&amp;gt; Flash page at 0x8028000 erased (size: 0x800EraseFlash - Page:0x51 Size:0x800 -&amp;gt; Flash page at 0x8028800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x52 Size:0x800 -&amp;gt; Flash page at 0x8029000 erased (size: 0x800EraseFlash - Page:0x53 Size:0x800 -&amp;gt; Flash page at 0x8029800 erased (size: 0x800EraseFlash - Page:0x54 Size:0x800 -&amp;gt; Flash page at 0x802a000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x55 Size:0x800 -&amp;gt; Flash page at 0x802a800 erased (size: 0x800EraseFlash - Page:0x56 Size:0x800 -&amp;gt; Flash page at 0x802b000 erased (size: 0x800EraseFlash - Page:0x57 Size:0x800 -&amp;gt; Flash page at 0x802b800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x58 Size:0x800 -&amp;gt; Flash page at 0x802c000 erased (size: 0x800EraseFlash - Page:0x59 Size:0x800 -&amp;gt; Flash page at 0x802c800 erased (size: 0x800EraseFlash - Page:0x5a Size:0x800 -&amp;gt; Flash page at 0x802d000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x5b Size:0x800 -&amp;gt; Flash page at 0x802d800 erased (size: 0x800EraseFlash - Page:0x5c Size:0x800 -&amp;gt; Flash page at 0x802e000 erased (size: 0x800EraseFlash - Page:0x5d Size:0x800 -&amp;gt; Flash page at 0x802e800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x5e Size:0x800 -&amp;gt; Flash page at 0x802f000 erased (size: 0x800EraseFlash - Page:0x5f Size:0x800 -&amp;gt; Flash page at 0x802f800 erased (size: 0x800EraseFlash - Page:0x60 Size:0x800 -&amp;gt; Flash page at 0x8030000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x61 Size:0x800 -&amp;gt; Flash page at 0x8030800 erased (size: 0x800EraseFlash - Page:0x62 Size:0x800 -&amp;gt; Flash page at 0x8031000 erased (size: 0x800EraseFlash - Page:0x63 Size:0x800 -&amp;gt; Flash page at 0x8031800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x64 Size:0x800 -&amp;gt; Flash page at 0x8032000 erased (size: 0x800EraseFlash - Page:0x65 Size:0x800 -&amp;gt; Flash page at 0x8032800 erased (size: 0x800EraseFlash - Page:0x66 Size:0x800 -&amp;gt; Flash page at 0x8033000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x67 Size:0x800 -&amp;gt; Flash page at 0x8033800 erased (size: 0x800EraseFlash - Page:0x68 Size:0x800 -&amp;gt; Flash page at 0x8034000 erased (size: 0x800EraseFlash - Page:0x69 Size:0x800 -&amp;gt; Flash page at 0x8034800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x6a Size:0x800 -&amp;gt; Flash page at 0x8035000 erased (size: 0x800EraseFlash - Page:0x6b Size:0x800 -&amp;gt; Flash page at 0x8035800 erased (size: 0x800EraseFlash - Page:0x6c Size:0x800 -&amp;gt; Flash page at 0x8036000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x6d Size:0x800 -&amp;gt; Flash page at 0x8036800 erased (size: 0x800EraseFlash - Page:0x6e Size:0x800 -&amp;gt; Flash page at 0x8037000 erased (size: 0x800EraseFlash - Page:0x6f Size:0x800 -&amp;gt; Flash page at 0x8037800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x70 Size:0x800 -&amp;gt; Flash page at 0x8038000 erased (size: 0x800EraseFlash - Page:0x71 Size:0x800 -&amp;gt; Flash page at 0x8038800 erased (size: 0x800EraseFlash - Page:0x72 Size:0x800 -&amp;gt; Flash page at 0x8039000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x73 Size:0x800 -&amp;gt; Flash page at 0x8039800 erased (size: 0x800EraseFlash - Page:0x74 Size:0x800 -&amp;gt; Flash page at 0x803a000 erased (size: 0x800EraseFlash - Page:0x75 Size:0x800 -&amp;gt; Flash page at 0x803a800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x76 Size:0x800 -&amp;gt; Flash page at 0x803b000 erased (size: 0x800EraseFlash - Page:0x77 Size:0x800 -&amp;gt; Flash page at 0x803b800 erased (size: 0x800EraseFlash - Page:0x78 Size:0x800 -&amp;gt; Flash page at 0x803c000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x79 Size:0x800 -&amp;gt; Flash page at 0x803c800 erased (size: 0x800EraseFlash - Page:0x7a Size:0x800 -&amp;gt; Flash page at 0x803d000 erased (size: 0x800EraseFlash - Page:0x7b Size:0x800 -&amp;gt; Flash page at 0x803d800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x7c Size:0x800 -&amp;gt; Flash page at 0x803e000 erased (size: 0x800EraseFlash - Page:0x7d Size:0x800 -&amp;gt; Flash page at 0x803e800 erased (size: 0x800EraseFlash - Page:0x7e Size:0x800 -&amp;gt; Flash page at 0x803f000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x7f Size:0x800 -&amp;gt; Flash page at 0x803f800 erased (size: 0x800)&lt;br /&gt;
2024-09-02T10:30:29 INFO flash_loader.c: Starting Flash write for F2/F4/F7/L4&lt;br /&gt;
2024-09-02T10:30:29 INFO flash_loader.c: Successfully loaded flash loader in sram&lt;br /&gt;
2024-09-02T10:30:29 INFO flash_loader.c: Clear DFSR&lt;br /&gt;
2024-09-02T10:30:35 INFO common_flash.c: Starting verification of write complete&lt;br /&gt;
2024-09-02T10:30:37 INFO common_flash.c: Flash written and verified! jolly good!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That went well - no errors reported.  Now let's try to read that flash into a file:&lt;br /&gt;
&lt;br /&gt;
=== Reading data from the MCU ===&lt;br /&gt;
&lt;br /&gt;
To be absolutely certain, read the data back into a new file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-flash --flash=256k read random2.bin 0x8000000 0x40000&lt;br /&gt;
st-flash 1.8.0&lt;br /&gt;
2024-09-02T10:31:51 INFO common.c: STM32L41x_L42x: 48 KiB SRAM, 128 KiB flash in at least 2 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00040000&lt;br /&gt;
2024-09-02T10:31:51 INFO common.c: read from address 0x08000000 size 262144&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No complaints!&lt;br /&gt;
&lt;br /&gt;
=== Compare data ===&lt;br /&gt;
&lt;br /&gt;
Finally we can verify that the data read from the MCU matches the data we wrote to the MCU:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ md5sum random*&lt;br /&gt;
5f7ebd5c822e07408e6279445eb1444a  random2.bin&lt;br /&gt;
5f7ebd5c822e07408e6279445eb1444a  random.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
They are identical, so it is absolutely confirmed that this particular STM32L432KB is in fact a STM32L432KC which identifies as a STM32L432KB.&lt;br /&gt;
&lt;br /&gt;
== STM32F407VE ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@nb7:~/tmp$ st-info --probe &amp;amp;&amp;amp; dd if=/dev/urandom of=random.bin bs=1k count=1024 &amp;amp;&amp;amp; st-flash --flash=1024k write random.bin 0x8000000 &amp;amp;&amp;amp; st-flash --flash=1024k read random2.bin 0x8000000 0x100000 &amp;amp;&amp;amp; md5sum random.bin random2.bin&lt;br /&gt;
Found 1 stlink programmers&lt;br /&gt;
  version:    V2J48S35&lt;br /&gt;
  serial:     066DFF495454657287165222&lt;br /&gt;
  flash:      524288 (pagesize: 16384)&lt;br /&gt;
  sram:       196608&lt;br /&gt;
  chipid:     0x413&lt;br /&gt;
  dev-type:   STM32F4x5_F4x7&lt;br /&gt;
1024+0 records in&lt;br /&gt;
1024+0 records out&lt;br /&gt;
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00555526 s, 189 MB/s&lt;br /&gt;
st-flash 1.8.0-121-g8c34a4e&lt;br /&gt;
2026-08-05T18:17:03 INFO common_legacy.c: STM32F4x5_F4x7: 192 KiB SRAM, 512 KiB flash in at least 16 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
file random.bin md5 checksum: dcd4cae158a72174cf828026717b6d4b, stlink checksum: 0x07f88bb5&lt;br /&gt;
2026-08-05T18:17:03 INFO common_flash.c: Attempting to write 1048576 (0x100000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
EraseFlash - Sector:0x0 Size:0x4000 -&amp;gt; Flash page at 0x8000000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x1 Size:0x4000 -&amp;gt; Flash page at 0x8004000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x2 Size:0x4000 -&amp;gt; Flash page at 0x8008000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x3 Size:0x4000 -&amp;gt; Flash page at 0x800c000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x4 Size:0x10000 -&amp;gt; Flash page at 0x8010000 erased (size: 0x10000)&lt;br /&gt;
EraseFlash - Sector:0x5 Size:0x20000 -&amp;gt; Flash page at 0x8020000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x6 Size:0x20000 -&amp;gt; Flash page at 0x8040000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x7 Size:0x20000 -&amp;gt; Flash page at 0x8060000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x8 Size:0x20000 -&amp;gt; Flash page at 0x8080000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x9 Size:0x20000 -&amp;gt; Flash page at 0x80a0000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0xa Size:0x20000 -&amp;gt; Flash page at 0x80c0000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0xb Size:0x20000 -&amp;gt; Flash page at 0x80e0000 erased (size: 0x20000)&lt;br /&gt;
&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: Starting Flash write for F2/F4/F7/L4&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: Successfully loaded flash loader in sram&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: Clear DFSR&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: enabling 32-bit flash writes&lt;br /&gt;
2026-08-05T18:17:36 INFO common_flash.c: Starting verification of write complete&lt;br /&gt;
2026-08-05T18:17:46 INFO common_flash.c: Flash written and verified! jolly good!&lt;br /&gt;
2026-08-05T18:17:46 INFO common_legacy.c: Go to Thumb mode&lt;br /&gt;
st-flash 1.8.0-121-g8c34a4e&lt;br /&gt;
2026-08-05T18:17:46 INFO common_legacy.c: STM32F4x5_F4x7: 192 KiB SRAM, 512 KiB flash in at least 16 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
2026-08-05T18:17:46 INFO common_legacy.c: read from address 0x08000000 size 1048576&lt;br /&gt;
dcd4cae158a72174cf828026717b6d4b  random.bin&lt;br /&gt;
dcd4cae158a72174cf828026717b6d4b  random2.bin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== STM32H723VE ==&lt;br /&gt;
&lt;br /&gt;
And we got another winner in the STM32H723VE.  Sold with 512 kB but have 1 MB in actuality.  Worth noticing that the H7 '''only''' have 128 kB pages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ (st-info --probe &amp;amp;&amp;amp; dd if=/dev/urandom of=random.bin bs=1k count=1024 &amp;amp;&amp;amp; st-flash --flash=1024k write random.bin 0x8000000 &amp;amp;&amp;amp; st-flash --flash=1024k read random2.bin 0x8000000 0x100000 &amp;amp;&amp;amp; md5sum random.bin random2.bin) 2&amp;gt;&amp;amp;1 | tee /tmp/flash.log&lt;br /&gt;
Found 1 stlink programmers&lt;br /&gt;
  version:    V2J48S35&lt;br /&gt;
  serial:     066DFF495454657287165222&lt;br /&gt;
  flash:      524288 (pagesize: 131072)&lt;br /&gt;
  sram:       131072&lt;br /&gt;
  chipid:     0x483&lt;br /&gt;
  dev-type:   STM32H72x_H73x&lt;br /&gt;
  voltage:    3237 mV&lt;br /&gt;
1024+0 records in&lt;br /&gt;
1024+0 records out&lt;br /&gt;
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00473775 s, 221 MB/s&lt;br /&gt;
st-flash 1.8.0-217-g5ec9d51&lt;br /&gt;
2026-10-25T08:06:58 INFO common_legacy.c: STM32H72x_H73x: 128 KiB SRAM, 512 KiB flash in at least 128 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
file random.bin md5 checksum: 7b5fa446a281b4e3641a50f1a33376ac, stlink checksum: 0x07f758e4&lt;br /&gt;
2026-10-25T08:06:58 INFO common_flash.c: Attempting to write 1048576 (0x100000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8000000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8020000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8040000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8060000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8080000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x80a0000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x80c0000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x80e0000 erased (size: 0x20000)&lt;br /&gt;
&lt;br /&gt;
2026-10-25T08:07:05 INFO flash_loader.c: Starting Flash write for H7&lt;br /&gt;
64/1048576 bytes written&lt;br /&gt;
128/1048576 bytes written&lt;br /&gt;
192/1048576 bytes written&lt;br /&gt;
256/1048576 bytes written&lt;br /&gt;
320/1048576 bytes written&lt;br /&gt;
384/1048576 bytes written&lt;br /&gt;
448/1048576 bytes written&lt;br /&gt;
512/1048576 bytes written&lt;br /&gt;
576/1048576 bytes written&lt;br /&gt;
640/1048576 bytes written&lt;br /&gt;
704/1048576 bytes written&lt;br /&gt;
768/1048576 bytes written&lt;br /&gt;
832/1048576 bytes written&lt;br /&gt;
896/1048576 bytes written&lt;br /&gt;
960/1048576 bytes written&lt;br /&gt;
1024/1048576 bytes written&lt;br /&gt;
...&lt;br /&gt;
1047808/1048576 bytes written&lt;br /&gt;
1047872/1048576 bytes written&lt;br /&gt;
1047936/1048576 bytes written&lt;br /&gt;
1048000/1048576 bytes written&lt;br /&gt;
1048064/1048576 bytes written&lt;br /&gt;
1048128/1048576 bytes written&lt;br /&gt;
1048192/1048576 bytes written&lt;br /&gt;
1048256/1048576 bytes written&lt;br /&gt;
1048320/1048576 bytes written&lt;br /&gt;
1048384/1048576 bytes written&lt;br /&gt;
1048448/1048576 bytes written&lt;br /&gt;
1048512/1048576 bytes written&lt;br /&gt;
1048576/1048576 bytes written&lt;br /&gt;
&lt;br /&gt;
2026-10-25T08:07:23 INFO common_flash.c: Starting verification of write complete&lt;br /&gt;
2026-10-25T08:07:32 INFO common_flash.c: Flash written and verified! jolly good!&lt;br /&gt;
2026-10-25T08:07:32 INFO common_legacy.c: Go to Thumb mode&lt;br /&gt;
st-flash 1.8.0-217-g5ec9d51&lt;br /&gt;
2026-10-25T08:07:32 INFO common_legacy.c: STM32H72x_H73x: 128 KiB SRAM, 512 KiB flash in at least 128 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
2026-10-25T08:07:32 INFO common_legacy.c: read from address 0x08000000 size 1048576&lt;br /&gt;
7b5fa446a281b4e3641a50f1a33376ac  random.bin&lt;br /&gt;
7b5fa446a281b4e3641a50f1a33376ac  random2.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://ipfs-pin.com/ipfs/QmcYpvigogWESmwTEFM5GYZc6st2SJRAoqwKWJ8ZDtgiXb/stm32l432kb.pdf STM32L432 Datasheet]&lt;br /&gt;
* [https://mecrisp-stellaris-folkdoc.sourceforge.io/bluepill-diagnostics-v1.6.html Bluepill Diagnostics Tool]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=STM32_Hidden_Flash&amp;diff=8745</id>
		<title>STM32 Hidden Flash</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=STM32_Hidden_Flash&amp;diff=8745"/>
		<updated>2026-10-25T00:15:14Z</updated>

		<summary type="html">&lt;p&gt;Lth: /* STM32H723VE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Flash]][[Category:STM32 Hardware]][[Category:STM32 Documentation]][[Category:STM32 Development]]{{metadesc|STM32 Real Flash Size}}&lt;br /&gt;
Many [[STM32]] [[MCU]]s have more flash than they claim to have.&lt;br /&gt;
&lt;br /&gt;
This has been confirmed on [[STM32F103]], [[STM32L432]] and [[STM32F40x]].&lt;br /&gt;
&lt;br /&gt;
== Speculation ==&lt;br /&gt;
&lt;br /&gt;
While not confirmed it is quite possible that this is common in all [[STM32]] [[MCU]]s which share datasheets.  If we look at the STM32G474, the datasheet overview looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Example datasheet STM32G474xB STM32G474xC STM32G474xE.png|800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most likely, these MCU's all have 512 kB of flash even if some report having less.&lt;br /&gt;
&lt;br /&gt;
== Video == &lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|lMNvgP76n2E}}&lt;br /&gt;
&lt;br /&gt;
== STM32L432 ==&lt;br /&gt;
[[File:FidoKey rev. a - top view.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
The STM32L432Kx is available with two different flash sizes.  The STM32L432KB has got 128 kB while the STM32L432KC has got 256 kB.&lt;br /&gt;
I recently created a USB &amp;quot;key&amp;quot; using the STM32L432.  The reason for using this specific [[STM32]] [[MCU]] was twofold:&lt;br /&gt;
&lt;br /&gt;
# It is small&lt;br /&gt;
# It's got a built-in 48 MHz oscillator precise enough to use USB without an external crystal&lt;br /&gt;
&lt;br /&gt;
Unfortunately, while I wanted the 256 kB version, only the 128 kB version was available.&lt;br /&gt;
&lt;br /&gt;
[[File:STM32L432 Part Numbering.png|600px]]&lt;br /&gt;
&lt;br /&gt;
The [[STM32]] [[Blue Pill]] boards mostly use Chinese clone [[MCU]]s but there has been a lot of writing about the original ones having 128 kB of flash rather than the 64 kB specified by the datasheet.  There is even a [https://mecrisp-stellaris-folkdoc.sourceforge.io/bluepill-diagnostics-v1.6.html test tool] available which can test for the hidden flash.&lt;br /&gt;
&lt;br /&gt;
Inspired by this, I decided to test the STM32L432KB on my own board.  As per the datasheet this processor is supposed to have 128 kB of flash ranging from 0x8000000 to 0x801FFFF.&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
[[File:Flash Size Test Setup.jpg|thumb|300px|STM32L432 Test Setup]] &lt;br /&gt;
&lt;br /&gt;
=== Checking device ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-info --probe&lt;br /&gt;
Found 1 stlink programmers&lt;br /&gt;
  version:    V2J45S31&lt;br /&gt;
  serial:     066CFF3933584B3043184346&lt;br /&gt;
  flash:      131072 (pagesize: 2048)&lt;br /&gt;
  sram:       49152&lt;br /&gt;
  chipid:     0x435&lt;br /&gt;
  dev-type:   STM32L41x_L42x&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that the device reports 128 kB of flash - as is expected.&lt;br /&gt;
&lt;br /&gt;
=== Generating Test Data ===&lt;br /&gt;
&lt;br /&gt;
First step is to create a 256 kB file with random data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ dd if=/dev/urandom of=random.bin bs=1k count=256&lt;br /&gt;
256+0 records in&lt;br /&gt;
256+0 records out&lt;br /&gt;
262144 bytes (262 kB, 256 KiB) copied, 0.0012241 s, 214 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing data to MCU ===&lt;br /&gt;
&lt;br /&gt;
The random.bin file is of a size which should only be possible to flash on STM32L432KC.&lt;br /&gt;
&lt;br /&gt;
First step is to flash normal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-flash write random.bin 0x8000000&lt;br /&gt;
st-flash 1.8.0&lt;br /&gt;
2024-09-02T10:30:01 INFO common.c: STM32L41x_L42x: 48 KiB SRAM, 128 KiB flash in at least 2 KiB pages.&lt;br /&gt;
file random.bin md5 checksum: 5f7ebd5c822e7408e6279445eb1444a, stlink checksum: 0x01fe53dd&lt;br /&gt;
2024-09-02T10:30:01 INFO common_flash.c: Attempting to write 262144 (0x40000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
2024-09-02T10:30:01 ERROR common_flash.c: The size exceeds the size of the flash (0x00020000 bytes available)&lt;br /&gt;
stlink_fwrite_flash() == -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As expected this failed.  The [[MCU]] reports 128 kB of flash and we attempt to write 256 kB.  We can however instruct st-flash to ignore that and attempt to write the entire file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-flash --flash=256k write random.bin 0x8000000&lt;br /&gt;
st-flash 1.8.0&lt;br /&gt;
2024-09-02T10:30:26 INFO common.c: STM32L41x_L42x: 48 KiB SRAM, 128 KiB flash in at least 2 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00040000&lt;br /&gt;
file random.bin md5 checksum: 5f7ebd5c822e7408e6279445eb1444a, stlink checksum: 0x01fe53dd&lt;br /&gt;
2024-09-02T10:30:26 INFO common_flash.c: Attempting to write 262144 (0x40000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
EraseFlash - Page:0x10 Size:0x800 -&amp;gt; Flash page at 0x8008000 erased (size: 0x800EraseFlash - Page:0x11 Size:0x800 -&amp;gt; Flash page at 0x8008800 erased (size: 0x800EraseFlash - Page:0x12 Size:0x800 -&amp;gt; Flash page at 0x8009000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x13 Size:0x800 -&amp;gt; Flash page at 0x8009800 erased (size: 0x800EraseFlash - Page:0x14 Size:0x800 -&amp;gt; Flash page at 0x800a000 erased (size: 0x800EraseFlash - Page:0x15 Size:0x800 -&amp;gt; Flash page at 0x800a800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x16 Size:0x800 -&amp;gt; Flash page at 0x800b000 erased (size: 0x800EraseFlash - Page:0x17 Size:0x800 -&amp;gt; Flash page at 0x800b800 erased (size: 0x800EraseFlash - Page:0x18 Size:0x800 -&amp;gt; Flash page at 0x800c000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x19 Size:0x800 -&amp;gt; Flash page at 0x800c800 erased (size: 0x800EraseFlash - Page:0x1a Size:0x800 -&amp;gt; Flash page at 0x800d000 erased (size: 0x800EraseFlash - Page:0x1b Size:0x800 -&amp;gt; Flash page at 0x800d800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x1c Size:0x800 -&amp;gt; Flash page at 0x800e000 erased (size: 0x800EraseFlash - Page:0x1d Size:0x800 -&amp;gt; Flash page at 0x800e800 erased (size: 0x800EraseFlash - Page:0x1e Size:0x800 -&amp;gt; Flash page at 0x800f000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x1f Size:0x800 -&amp;gt; Flash page at 0x800f800 erased (size: 0x800EraseFlash - Page:0x20 Size:0x800 -&amp;gt; Flash page at 0x8010000 erased (size: 0x800EraseFlash - Page:0x21 Size:0x800 -&amp;gt; Flash page at 0x8010800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x22 Size:0x800 -&amp;gt; Flash page at 0x8011000 erased (size: 0x800EraseFlash - Page:0x23 Size:0x800 -&amp;gt; Flash page at 0x8011800 erased (size: 0x800EraseFlash - Page:0x24 Size:0x800 -&amp;gt; Flash page at 0x8012000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x25 Size:0x800 -&amp;gt; Flash page at 0x8012800 erased (size: 0x800EraseFlash - Page:0x26 Size:0x800 -&amp;gt; Flash page at 0x8013000 erased (size: 0x800EraseFlash - Page:0x27 Size:0x800 -&amp;gt; Flash page at 0x8013800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x28 Size:0x800 -&amp;gt; Flash page at 0x8014000 erased (size: 0x800EraseFlash - Page:0x29 Size:0x800 -&amp;gt; Flash page at 0x8014800 erased (size: 0x800EraseFlash - Page:0x2a Size:0x800 -&amp;gt; Flash page at 0x8015000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x2b Size:0x800 -&amp;gt; Flash page at 0x8015800 erased (size: 0x800EraseFlash - Page:0x2c Size:0x800 -&amp;gt; Flash page at 0x8016000 erased (size: 0x800EraseFlash - Page:0x2d Size:0x800 -&amp;gt; Flash page at 0x8016800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x2e Size:0x800 -&amp;gt; Flash page at 0x8017000 erased (size: 0x800EraseFlash - Page:0x2f Size:0x800 -&amp;gt; Flash page at 0x8017800 erased (size: 0x800EraseFlash - Page:0x30 Size:0x800 -&amp;gt; Flash page at 0x8018000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x31 Size:0x800 -&amp;gt; Flash page at 0x8018800 erased (size: 0x800EraseFlash - Page:0x32 Size:0x800 -&amp;gt; Flash page at 0x8019000 erased (size: 0x800EraseFlash - Page:0x33 Size:0x800 -&amp;gt; Flash page at 0x8019800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x34 Size:0x800 -&amp;gt; Flash page at 0x801a000 erased (size: 0x800EraseFlash - Page:0x35 Size:0x800 -&amp;gt; Flash page at 0x801a800 erased (size: 0x800EraseFlash - Page:0x36 Size:0x800 -&amp;gt; Flash page at 0x801b000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x37 Size:0x800 -&amp;gt; Flash page at 0x801b800 erased (size: 0x800EraseFlash - Page:0x38 Size:0x800 -&amp;gt; Flash page at 0x801c000 erased (size: 0x800EraseFlash - Page:0x39 Size:0x800 -&amp;gt; Flash page at 0x801c800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x3a Size:0x800 -&amp;gt; Flash page at 0x801d000 erased (size: 0x800EraseFlash - Page:0x3b Size:0x800 -&amp;gt; Flash page at 0x801d800 erased (size: 0x800EraseFlash - Page:0x3c Size:0x800 -&amp;gt; Flash page at 0x801e000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x3d Size:0x800 -&amp;gt; Flash page at 0x801e800 erased (size: 0x800EraseFlash - Page:0x3e Size:0x800 -&amp;gt; Flash page at 0x801f000 erased (size: 0x800EraseFlash - Page:0x3f Size:0x800 -&amp;gt; Flash page at 0x801f800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x40 Size:0x800 -&amp;gt; Flash page at 0x8020000 erased (size: 0x800EraseFlash - Page:0x41 Size:0x800 -&amp;gt; Flash page at 0x8020800 erased (size: 0x800EraseFlash - Page:0x42 Size:0x800 -&amp;gt; Flash page at 0x8021000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x43 Size:0x800 -&amp;gt; Flash page at 0x8021800 erased (size: 0x800EraseFlash - Page:0x44 Size:0x800 -&amp;gt; Flash page at 0x8022000 erased (size: 0x800EraseFlash - Page:0x45 Size:0x800 -&amp;gt; Flash page at 0x8022800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x46 Size:0x800 -&amp;gt; Flash page at 0x8023000 erased (size: 0x800EraseFlash - Page:0x47 Size:0x800 -&amp;gt; Flash page at 0x8023800 erased (size: 0x800EraseFlash - Page:0x48 Size:0x800 -&amp;gt; Flash page at 0x8024000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x49 Size:0x800 -&amp;gt; Flash page at 0x8024800 erased (size: 0x800EraseFlash - Page:0x4a Size:0x800 -&amp;gt; Flash page at 0x8025000 erased (size: 0x800EraseFlash - Page:0x4b Size:0x800 -&amp;gt; Flash page at 0x8025800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x4c Size:0x800 -&amp;gt; Flash page at 0x8026000 erased (size: 0x800EraseFlash - Page:0x4d Size:0x800 -&amp;gt; Flash page at 0x8026800 erased (size: 0x800EraseFlash - Page:0x4e Size:0x800 -&amp;gt; Flash page at 0x8027000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x4f Size:0x800 -&amp;gt; Flash page at 0x8027800 erased (size: 0x800EraseFlash - Page:0x50 Size:0x800 -&amp;gt; Flash page at 0x8028000 erased (size: 0x800EraseFlash - Page:0x51 Size:0x800 -&amp;gt; Flash page at 0x8028800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x52 Size:0x800 -&amp;gt; Flash page at 0x8029000 erased (size: 0x800EraseFlash - Page:0x53 Size:0x800 -&amp;gt; Flash page at 0x8029800 erased (size: 0x800EraseFlash - Page:0x54 Size:0x800 -&amp;gt; Flash page at 0x802a000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x55 Size:0x800 -&amp;gt; Flash page at 0x802a800 erased (size: 0x800EraseFlash - Page:0x56 Size:0x800 -&amp;gt; Flash page at 0x802b000 erased (size: 0x800EraseFlash - Page:0x57 Size:0x800 -&amp;gt; Flash page at 0x802b800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x58 Size:0x800 -&amp;gt; Flash page at 0x802c000 erased (size: 0x800EraseFlash - Page:0x59 Size:0x800 -&amp;gt; Flash page at 0x802c800 erased (size: 0x800EraseFlash - Page:0x5a Size:0x800 -&amp;gt; Flash page at 0x802d000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x5b Size:0x800 -&amp;gt; Flash page at 0x802d800 erased (size: 0x800EraseFlash - Page:0x5c Size:0x800 -&amp;gt; Flash page at 0x802e000 erased (size: 0x800EraseFlash - Page:0x5d Size:0x800 -&amp;gt; Flash page at 0x802e800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x5e Size:0x800 -&amp;gt; Flash page at 0x802f000 erased (size: 0x800EraseFlash - Page:0x5f Size:0x800 -&amp;gt; Flash page at 0x802f800 erased (size: 0x800EraseFlash - Page:0x60 Size:0x800 -&amp;gt; Flash page at 0x8030000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x61 Size:0x800 -&amp;gt; Flash page at 0x8030800 erased (size: 0x800EraseFlash - Page:0x62 Size:0x800 -&amp;gt; Flash page at 0x8031000 erased (size: 0x800EraseFlash - Page:0x63 Size:0x800 -&amp;gt; Flash page at 0x8031800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x64 Size:0x800 -&amp;gt; Flash page at 0x8032000 erased (size: 0x800EraseFlash - Page:0x65 Size:0x800 -&amp;gt; Flash page at 0x8032800 erased (size: 0x800EraseFlash - Page:0x66 Size:0x800 -&amp;gt; Flash page at 0x8033000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x67 Size:0x800 -&amp;gt; Flash page at 0x8033800 erased (size: 0x800EraseFlash - Page:0x68 Size:0x800 -&amp;gt; Flash page at 0x8034000 erased (size: 0x800EraseFlash - Page:0x69 Size:0x800 -&amp;gt; Flash page at 0x8034800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x6a Size:0x800 -&amp;gt; Flash page at 0x8035000 erased (size: 0x800EraseFlash - Page:0x6b Size:0x800 -&amp;gt; Flash page at 0x8035800 erased (size: 0x800EraseFlash - Page:0x6c Size:0x800 -&amp;gt; Flash page at 0x8036000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x6d Size:0x800 -&amp;gt; Flash page at 0x8036800 erased (size: 0x800EraseFlash - Page:0x6e Size:0x800 -&amp;gt; Flash page at 0x8037000 erased (size: 0x800EraseFlash - Page:0x6f Size:0x800 -&amp;gt; Flash page at 0x8037800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x70 Size:0x800 -&amp;gt; Flash page at 0x8038000 erased (size: 0x800EraseFlash - Page:0x71 Size:0x800 -&amp;gt; Flash page at 0x8038800 erased (size: 0x800EraseFlash - Page:0x72 Size:0x800 -&amp;gt; Flash page at 0x8039000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x73 Size:0x800 -&amp;gt; Flash page at 0x8039800 erased (size: 0x800EraseFlash - Page:0x74 Size:0x800 -&amp;gt; Flash page at 0x803a000 erased (size: 0x800EraseFlash - Page:0x75 Size:0x800 -&amp;gt; Flash page at 0x803a800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x76 Size:0x800 -&amp;gt; Flash page at 0x803b000 erased (size: 0x800EraseFlash - Page:0x77 Size:0x800 -&amp;gt; Flash page at 0x803b800 erased (size: 0x800EraseFlash - Page:0x78 Size:0x800 -&amp;gt; Flash page at 0x803c000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x79 Size:0x800 -&amp;gt; Flash page at 0x803c800 erased (size: 0x800EraseFlash - Page:0x7a Size:0x800 -&amp;gt; Flash page at 0x803d000 erased (size: 0x800EraseFlash - Page:0x7b Size:0x800 -&amp;gt; Flash page at 0x803d800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x7c Size:0x800 -&amp;gt; Flash page at 0x803e000 erased (size: 0x800EraseFlash - Page:0x7d Size:0x800 -&amp;gt; Flash page at 0x803e800 erased (size: 0x800EraseFlash - Page:0x7e Size:0x800 -&amp;gt; Flash page at 0x803f000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x7f Size:0x800 -&amp;gt; Flash page at 0x803f800 erased (size: 0x800)&lt;br /&gt;
2024-09-02T10:30:29 INFO flash_loader.c: Starting Flash write for F2/F4/F7/L4&lt;br /&gt;
2024-09-02T10:30:29 INFO flash_loader.c: Successfully loaded flash loader in sram&lt;br /&gt;
2024-09-02T10:30:29 INFO flash_loader.c: Clear DFSR&lt;br /&gt;
2024-09-02T10:30:35 INFO common_flash.c: Starting verification of write complete&lt;br /&gt;
2024-09-02T10:30:37 INFO common_flash.c: Flash written and verified! jolly good!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That went well - no errors reported.  Now let's try to read that flash into a file:&lt;br /&gt;
&lt;br /&gt;
=== Reading data from the MCU ===&lt;br /&gt;
&lt;br /&gt;
To be absolutely certain, read the data back into a new file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-flash --flash=256k read random2.bin 0x8000000 0x40000&lt;br /&gt;
st-flash 1.8.0&lt;br /&gt;
2024-09-02T10:31:51 INFO common.c: STM32L41x_L42x: 48 KiB SRAM, 128 KiB flash in at least 2 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00040000&lt;br /&gt;
2024-09-02T10:31:51 INFO common.c: read from address 0x08000000 size 262144&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No complaints!&lt;br /&gt;
&lt;br /&gt;
=== Compare data ===&lt;br /&gt;
&lt;br /&gt;
Finally we can verify that the data read from the MCU matches the data we wrote to the MCU:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ md5sum random*&lt;br /&gt;
5f7ebd5c822e07408e6279445eb1444a  random2.bin&lt;br /&gt;
5f7ebd5c822e07408e6279445eb1444a  random.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
They are identical, so it is absolutely confirmed that this particular STM32L432KB is in fact a STM32L432KC which identifies as a STM32L432KB.&lt;br /&gt;
&lt;br /&gt;
== STM32F407 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@nb7:~/tmp$ st-info --probe &amp;amp;&amp;amp; dd if=/dev/urandom of=random.bin bs=1k count=1024 &amp;amp;&amp;amp; st-flash --flash=1024k write random.bin 0x8000000 &amp;amp;&amp;amp; st-flash --flash=1024k read random2.bin 0x8000000 0x100000 &amp;amp;&amp;amp; md5sum random.bin random2.bin&lt;br /&gt;
Found 1 stlink programmers&lt;br /&gt;
  version:    V2J48S35&lt;br /&gt;
  serial:     066DFF495454657287165222&lt;br /&gt;
  flash:      524288 (pagesize: 16384)&lt;br /&gt;
  sram:       196608&lt;br /&gt;
  chipid:     0x413&lt;br /&gt;
  dev-type:   STM32F4x5_F4x7&lt;br /&gt;
1024+0 records in&lt;br /&gt;
1024+0 records out&lt;br /&gt;
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00555526 s, 189 MB/s&lt;br /&gt;
st-flash 1.8.0-121-g8c34a4e&lt;br /&gt;
2026-08-05T18:17:03 INFO common_legacy.c: STM32F4x5_F4x7: 192 KiB SRAM, 512 KiB flash in at least 16 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
file random.bin md5 checksum: dcd4cae158a72174cf828026717b6d4b, stlink checksum: 0x07f88bb5&lt;br /&gt;
2026-08-05T18:17:03 INFO common_flash.c: Attempting to write 1048576 (0x100000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
EraseFlash - Sector:0x0 Size:0x4000 -&amp;gt; Flash page at 0x8000000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x1 Size:0x4000 -&amp;gt; Flash page at 0x8004000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x2 Size:0x4000 -&amp;gt; Flash page at 0x8008000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x3 Size:0x4000 -&amp;gt; Flash page at 0x800c000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x4 Size:0x10000 -&amp;gt; Flash page at 0x8010000 erased (size: 0x10000)&lt;br /&gt;
EraseFlash - Sector:0x5 Size:0x20000 -&amp;gt; Flash page at 0x8020000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x6 Size:0x20000 -&amp;gt; Flash page at 0x8040000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x7 Size:0x20000 -&amp;gt; Flash page at 0x8060000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x8 Size:0x20000 -&amp;gt; Flash page at 0x8080000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x9 Size:0x20000 -&amp;gt; Flash page at 0x80a0000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0xa Size:0x20000 -&amp;gt; Flash page at 0x80c0000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0xb Size:0x20000 -&amp;gt; Flash page at 0x80e0000 erased (size: 0x20000)&lt;br /&gt;
&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: Starting Flash write for F2/F4/F7/L4&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: Successfully loaded flash loader in sram&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: Clear DFSR&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: enabling 32-bit flash writes&lt;br /&gt;
2026-08-05T18:17:36 INFO common_flash.c: Starting verification of write complete&lt;br /&gt;
2026-08-05T18:17:46 INFO common_flash.c: Flash written and verified! jolly good!&lt;br /&gt;
2026-08-05T18:17:46 INFO common_legacy.c: Go to Thumb mode&lt;br /&gt;
st-flash 1.8.0-121-g8c34a4e&lt;br /&gt;
2026-08-05T18:17:46 INFO common_legacy.c: STM32F4x5_F4x7: 192 KiB SRAM, 512 KiB flash in at least 16 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
2026-08-05T18:17:46 INFO common_legacy.c: read from address 0x08000000 size 1048576&lt;br /&gt;
dcd4cae158a72174cf828026717b6d4b  random.bin&lt;br /&gt;
dcd4cae158a72174cf828026717b6d4b  random2.bin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== STM32H723VE ==&lt;br /&gt;
&lt;br /&gt;
And we got another winner in the STM32H723VE.  Sold with 512 kB but have 1 MB in actuality.  Worth noticing that the H7 '''only''' have 128 kB pages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ (st-info --probe &amp;amp;&amp;amp; dd if=/dev/urandom of=random.bin bs=1k count=1024 &amp;amp;&amp;amp; st-flash --flash=1024k write random.bin 0x8000000 &amp;amp;&amp;amp; st-flash --flash=1024k read random2.bin 0x8000000 0x100000 &amp;amp;&amp;amp; md5sum random.bin random2.bin) 2&amp;gt;&amp;amp;1 | tee /tmp/flash.log&lt;br /&gt;
Found 1 stlink programmers&lt;br /&gt;
  version:    V2J48S35&lt;br /&gt;
  serial:     066DFF495454657287165222&lt;br /&gt;
  flash:      524288 (pagesize: 131072)&lt;br /&gt;
  sram:       131072&lt;br /&gt;
  chipid:     0x483&lt;br /&gt;
  dev-type:   STM32H72x_H73x&lt;br /&gt;
  voltage:    3237 mV&lt;br /&gt;
1024+0 records in&lt;br /&gt;
1024+0 records out&lt;br /&gt;
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00473775 s, 221 MB/s&lt;br /&gt;
st-flash 1.8.0-217-g5ec9d51&lt;br /&gt;
2026-10-25T08:06:58 INFO common_legacy.c: STM32H72x_H73x: 128 KiB SRAM, 512 KiB flash in at least 128 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
file random.bin md5 checksum: 7b5fa446a281b4e3641a50f1a33376ac, stlink checksum: 0x07f758e4&lt;br /&gt;
2026-10-25T08:06:58 INFO common_flash.c: Attempting to write 1048576 (0x100000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8000000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8020000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8040000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8060000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8080000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x80a0000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x80c0000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x80e0000 erased (size: 0x20000)&lt;br /&gt;
&lt;br /&gt;
2026-10-25T08:07:05 INFO flash_loader.c: Starting Flash write for H7&lt;br /&gt;
64/1048576 bytes written&lt;br /&gt;
128/1048576 bytes written&lt;br /&gt;
192/1048576 bytes written&lt;br /&gt;
256/1048576 bytes written&lt;br /&gt;
320/1048576 bytes written&lt;br /&gt;
384/1048576 bytes written&lt;br /&gt;
448/1048576 bytes written&lt;br /&gt;
512/1048576 bytes written&lt;br /&gt;
576/1048576 bytes written&lt;br /&gt;
640/1048576 bytes written&lt;br /&gt;
704/1048576 bytes written&lt;br /&gt;
768/1048576 bytes written&lt;br /&gt;
832/1048576 bytes written&lt;br /&gt;
896/1048576 bytes written&lt;br /&gt;
960/1048576 bytes written&lt;br /&gt;
1024/1048576 bytes written&lt;br /&gt;
...&lt;br /&gt;
1047808/1048576 bytes written&lt;br /&gt;
1047872/1048576 bytes written&lt;br /&gt;
1047936/1048576 bytes written&lt;br /&gt;
1048000/1048576 bytes written&lt;br /&gt;
1048064/1048576 bytes written&lt;br /&gt;
1048128/1048576 bytes written&lt;br /&gt;
1048192/1048576 bytes written&lt;br /&gt;
1048256/1048576 bytes written&lt;br /&gt;
1048320/1048576 bytes written&lt;br /&gt;
1048384/1048576 bytes written&lt;br /&gt;
1048448/1048576 bytes written&lt;br /&gt;
1048512/1048576 bytes written&lt;br /&gt;
1048576/1048576 bytes written&lt;br /&gt;
&lt;br /&gt;
2026-10-25T08:07:23 INFO common_flash.c: Starting verification of write complete&lt;br /&gt;
2026-10-25T08:07:32 INFO common_flash.c: Flash written and verified! jolly good!&lt;br /&gt;
2026-10-25T08:07:32 INFO common_legacy.c: Go to Thumb mode&lt;br /&gt;
st-flash 1.8.0-217-g5ec9d51&lt;br /&gt;
2026-10-25T08:07:32 INFO common_legacy.c: STM32H72x_H73x: 128 KiB SRAM, 512 KiB flash in at least 128 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
2026-10-25T08:07:32 INFO common_legacy.c: read from address 0x08000000 size 1048576&lt;br /&gt;
7b5fa446a281b4e3641a50f1a33376ac  random.bin&lt;br /&gt;
7b5fa446a281b4e3641a50f1a33376ac  random2.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://ipfs-pin.com/ipfs/QmcYpvigogWESmwTEFM5GYZc6st2SJRAoqwKWJ8ZDtgiXb/stm32l432kb.pdf STM32L432 Datasheet]&lt;br /&gt;
* [https://mecrisp-stellaris-folkdoc.sourceforge.io/bluepill-diagnostics-v1.6.html Bluepill Diagnostics Tool]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=STM32_Hidden_Flash&amp;diff=8744</id>
		<title>STM32 Hidden Flash</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=STM32_Hidden_Flash&amp;diff=8744"/>
		<updated>2026-10-25T00:12:47Z</updated>

		<summary type="html">&lt;p&gt;Lth: /* STM32H723 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Flash]][[Category:STM32 Hardware]][[Category:STM32 Documentation]][[Category:STM32 Development]]{{metadesc|STM32 Real Flash Size}}&lt;br /&gt;
Many [[STM32]] [[MCU]]s have more flash than they claim to have.&lt;br /&gt;
&lt;br /&gt;
This has been confirmed on [[STM32F103]], [[STM32L432]] and [[STM32F40x]].&lt;br /&gt;
&lt;br /&gt;
== Speculation ==&lt;br /&gt;
&lt;br /&gt;
While not confirmed it is quite possible that this is common in all [[STM32]] [[MCU]]s which share datasheets.  If we look at the STM32G474, the datasheet overview looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Example datasheet STM32G474xB STM32G474xC STM32G474xE.png|800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most likely, these MCU's all have 512 kB of flash even if some report having less.&lt;br /&gt;
&lt;br /&gt;
== Video == &lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|lMNvgP76n2E}}&lt;br /&gt;
&lt;br /&gt;
== STM32L432 ==&lt;br /&gt;
[[File:FidoKey rev. a - top view.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
The STM32L432Kx is available with two different flash sizes.  The STM32L432KB has got 128 kB while the STM32L432KC has got 256 kB.&lt;br /&gt;
I recently created a USB &amp;quot;key&amp;quot; using the STM32L432.  The reason for using this specific [[STM32]] [[MCU]] was twofold:&lt;br /&gt;
&lt;br /&gt;
# It is small&lt;br /&gt;
# It's got a built-in 48 MHz oscillator precise enough to use USB without an external crystal&lt;br /&gt;
&lt;br /&gt;
Unfortunately, while I wanted the 256 kB version, only the 128 kB version was available.&lt;br /&gt;
&lt;br /&gt;
[[File:STM32L432 Part Numbering.png|600px]]&lt;br /&gt;
&lt;br /&gt;
The [[STM32]] [[Blue Pill]] boards mostly use Chinese clone [[MCU]]s but there has been a lot of writing about the original ones having 128 kB of flash rather than the 64 kB specified by the datasheet.  There is even a [https://mecrisp-stellaris-folkdoc.sourceforge.io/bluepill-diagnostics-v1.6.html test tool] available which can test for the hidden flash.&lt;br /&gt;
&lt;br /&gt;
Inspired by this, I decided to test the STM32L432KB on my own board.  As per the datasheet this processor is supposed to have 128 kB of flash ranging from 0x8000000 to 0x801FFFF.&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
[[File:Flash Size Test Setup.jpg|thumb|300px|STM32L432 Test Setup]] &lt;br /&gt;
&lt;br /&gt;
=== Checking device ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-info --probe&lt;br /&gt;
Found 1 stlink programmers&lt;br /&gt;
  version:    V2J45S31&lt;br /&gt;
  serial:     066CFF3933584B3043184346&lt;br /&gt;
  flash:      131072 (pagesize: 2048)&lt;br /&gt;
  sram:       49152&lt;br /&gt;
  chipid:     0x435&lt;br /&gt;
  dev-type:   STM32L41x_L42x&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that the device reports 128 kB of flash - as is expected.&lt;br /&gt;
&lt;br /&gt;
=== Generating Test Data ===&lt;br /&gt;
&lt;br /&gt;
First step is to create a 256 kB file with random data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ dd if=/dev/urandom of=random.bin bs=1k count=256&lt;br /&gt;
256+0 records in&lt;br /&gt;
256+0 records out&lt;br /&gt;
262144 bytes (262 kB, 256 KiB) copied, 0.0012241 s, 214 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing data to MCU ===&lt;br /&gt;
&lt;br /&gt;
The random.bin file is of a size which should only be possible to flash on STM32L432KC.&lt;br /&gt;
&lt;br /&gt;
First step is to flash normal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-flash write random.bin 0x8000000&lt;br /&gt;
st-flash 1.8.0&lt;br /&gt;
2024-09-02T10:30:01 INFO common.c: STM32L41x_L42x: 48 KiB SRAM, 128 KiB flash in at least 2 KiB pages.&lt;br /&gt;
file random.bin md5 checksum: 5f7ebd5c822e7408e6279445eb1444a, stlink checksum: 0x01fe53dd&lt;br /&gt;
2024-09-02T10:30:01 INFO common_flash.c: Attempting to write 262144 (0x40000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
2024-09-02T10:30:01 ERROR common_flash.c: The size exceeds the size of the flash (0x00020000 bytes available)&lt;br /&gt;
stlink_fwrite_flash() == -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As expected this failed.  The [[MCU]] reports 128 kB of flash and we attempt to write 256 kB.  We can however instruct st-flash to ignore that and attempt to write the entire file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-flash --flash=256k write random.bin 0x8000000&lt;br /&gt;
st-flash 1.8.0&lt;br /&gt;
2024-09-02T10:30:26 INFO common.c: STM32L41x_L42x: 48 KiB SRAM, 128 KiB flash in at least 2 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00040000&lt;br /&gt;
file random.bin md5 checksum: 5f7ebd5c822e7408e6279445eb1444a, stlink checksum: 0x01fe53dd&lt;br /&gt;
2024-09-02T10:30:26 INFO common_flash.c: Attempting to write 262144 (0x40000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
EraseFlash - Page:0x10 Size:0x800 -&amp;gt; Flash page at 0x8008000 erased (size: 0x800EraseFlash - Page:0x11 Size:0x800 -&amp;gt; Flash page at 0x8008800 erased (size: 0x800EraseFlash - Page:0x12 Size:0x800 -&amp;gt; Flash page at 0x8009000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x13 Size:0x800 -&amp;gt; Flash page at 0x8009800 erased (size: 0x800EraseFlash - Page:0x14 Size:0x800 -&amp;gt; Flash page at 0x800a000 erased (size: 0x800EraseFlash - Page:0x15 Size:0x800 -&amp;gt; Flash page at 0x800a800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x16 Size:0x800 -&amp;gt; Flash page at 0x800b000 erased (size: 0x800EraseFlash - Page:0x17 Size:0x800 -&amp;gt; Flash page at 0x800b800 erased (size: 0x800EraseFlash - Page:0x18 Size:0x800 -&amp;gt; Flash page at 0x800c000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x19 Size:0x800 -&amp;gt; Flash page at 0x800c800 erased (size: 0x800EraseFlash - Page:0x1a Size:0x800 -&amp;gt; Flash page at 0x800d000 erased (size: 0x800EraseFlash - Page:0x1b Size:0x800 -&amp;gt; Flash page at 0x800d800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x1c Size:0x800 -&amp;gt; Flash page at 0x800e000 erased (size: 0x800EraseFlash - Page:0x1d Size:0x800 -&amp;gt; Flash page at 0x800e800 erased (size: 0x800EraseFlash - Page:0x1e Size:0x800 -&amp;gt; Flash page at 0x800f000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x1f Size:0x800 -&amp;gt; Flash page at 0x800f800 erased (size: 0x800EraseFlash - Page:0x20 Size:0x800 -&amp;gt; Flash page at 0x8010000 erased (size: 0x800EraseFlash - Page:0x21 Size:0x800 -&amp;gt; Flash page at 0x8010800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x22 Size:0x800 -&amp;gt; Flash page at 0x8011000 erased (size: 0x800EraseFlash - Page:0x23 Size:0x800 -&amp;gt; Flash page at 0x8011800 erased (size: 0x800EraseFlash - Page:0x24 Size:0x800 -&amp;gt; Flash page at 0x8012000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x25 Size:0x800 -&amp;gt; Flash page at 0x8012800 erased (size: 0x800EraseFlash - Page:0x26 Size:0x800 -&amp;gt; Flash page at 0x8013000 erased (size: 0x800EraseFlash - Page:0x27 Size:0x800 -&amp;gt; Flash page at 0x8013800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x28 Size:0x800 -&amp;gt; Flash page at 0x8014000 erased (size: 0x800EraseFlash - Page:0x29 Size:0x800 -&amp;gt; Flash page at 0x8014800 erased (size: 0x800EraseFlash - Page:0x2a Size:0x800 -&amp;gt; Flash page at 0x8015000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x2b Size:0x800 -&amp;gt; Flash page at 0x8015800 erased (size: 0x800EraseFlash - Page:0x2c Size:0x800 -&amp;gt; Flash page at 0x8016000 erased (size: 0x800EraseFlash - Page:0x2d Size:0x800 -&amp;gt; Flash page at 0x8016800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x2e Size:0x800 -&amp;gt; Flash page at 0x8017000 erased (size: 0x800EraseFlash - Page:0x2f Size:0x800 -&amp;gt; Flash page at 0x8017800 erased (size: 0x800EraseFlash - Page:0x30 Size:0x800 -&amp;gt; Flash page at 0x8018000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x31 Size:0x800 -&amp;gt; Flash page at 0x8018800 erased (size: 0x800EraseFlash - Page:0x32 Size:0x800 -&amp;gt; Flash page at 0x8019000 erased (size: 0x800EraseFlash - Page:0x33 Size:0x800 -&amp;gt; Flash page at 0x8019800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x34 Size:0x800 -&amp;gt; Flash page at 0x801a000 erased (size: 0x800EraseFlash - Page:0x35 Size:0x800 -&amp;gt; Flash page at 0x801a800 erased (size: 0x800EraseFlash - Page:0x36 Size:0x800 -&amp;gt; Flash page at 0x801b000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x37 Size:0x800 -&amp;gt; Flash page at 0x801b800 erased (size: 0x800EraseFlash - Page:0x38 Size:0x800 -&amp;gt; Flash page at 0x801c000 erased (size: 0x800EraseFlash - Page:0x39 Size:0x800 -&amp;gt; Flash page at 0x801c800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x3a Size:0x800 -&amp;gt; Flash page at 0x801d000 erased (size: 0x800EraseFlash - Page:0x3b Size:0x800 -&amp;gt; Flash page at 0x801d800 erased (size: 0x800EraseFlash - Page:0x3c Size:0x800 -&amp;gt; Flash page at 0x801e000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x3d Size:0x800 -&amp;gt; Flash page at 0x801e800 erased (size: 0x800EraseFlash - Page:0x3e Size:0x800 -&amp;gt; Flash page at 0x801f000 erased (size: 0x800EraseFlash - Page:0x3f Size:0x800 -&amp;gt; Flash page at 0x801f800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x40 Size:0x800 -&amp;gt; Flash page at 0x8020000 erased (size: 0x800EraseFlash - Page:0x41 Size:0x800 -&amp;gt; Flash page at 0x8020800 erased (size: 0x800EraseFlash - Page:0x42 Size:0x800 -&amp;gt; Flash page at 0x8021000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x43 Size:0x800 -&amp;gt; Flash page at 0x8021800 erased (size: 0x800EraseFlash - Page:0x44 Size:0x800 -&amp;gt; Flash page at 0x8022000 erased (size: 0x800EraseFlash - Page:0x45 Size:0x800 -&amp;gt; Flash page at 0x8022800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x46 Size:0x800 -&amp;gt; Flash page at 0x8023000 erased (size: 0x800EraseFlash - Page:0x47 Size:0x800 -&amp;gt; Flash page at 0x8023800 erased (size: 0x800EraseFlash - Page:0x48 Size:0x800 -&amp;gt; Flash page at 0x8024000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x49 Size:0x800 -&amp;gt; Flash page at 0x8024800 erased (size: 0x800EraseFlash - Page:0x4a Size:0x800 -&amp;gt; Flash page at 0x8025000 erased (size: 0x800EraseFlash - Page:0x4b Size:0x800 -&amp;gt; Flash page at 0x8025800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x4c Size:0x800 -&amp;gt; Flash page at 0x8026000 erased (size: 0x800EraseFlash - Page:0x4d Size:0x800 -&amp;gt; Flash page at 0x8026800 erased (size: 0x800EraseFlash - Page:0x4e Size:0x800 -&amp;gt; Flash page at 0x8027000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x4f Size:0x800 -&amp;gt; Flash page at 0x8027800 erased (size: 0x800EraseFlash - Page:0x50 Size:0x800 -&amp;gt; Flash page at 0x8028000 erased (size: 0x800EraseFlash - Page:0x51 Size:0x800 -&amp;gt; Flash page at 0x8028800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x52 Size:0x800 -&amp;gt; Flash page at 0x8029000 erased (size: 0x800EraseFlash - Page:0x53 Size:0x800 -&amp;gt; Flash page at 0x8029800 erased (size: 0x800EraseFlash - Page:0x54 Size:0x800 -&amp;gt; Flash page at 0x802a000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x55 Size:0x800 -&amp;gt; Flash page at 0x802a800 erased (size: 0x800EraseFlash - Page:0x56 Size:0x800 -&amp;gt; Flash page at 0x802b000 erased (size: 0x800EraseFlash - Page:0x57 Size:0x800 -&amp;gt; Flash page at 0x802b800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x58 Size:0x800 -&amp;gt; Flash page at 0x802c000 erased (size: 0x800EraseFlash - Page:0x59 Size:0x800 -&amp;gt; Flash page at 0x802c800 erased (size: 0x800EraseFlash - Page:0x5a Size:0x800 -&amp;gt; Flash page at 0x802d000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x5b Size:0x800 -&amp;gt; Flash page at 0x802d800 erased (size: 0x800EraseFlash - Page:0x5c Size:0x800 -&amp;gt; Flash page at 0x802e000 erased (size: 0x800EraseFlash - Page:0x5d Size:0x800 -&amp;gt; Flash page at 0x802e800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x5e Size:0x800 -&amp;gt; Flash page at 0x802f000 erased (size: 0x800EraseFlash - Page:0x5f Size:0x800 -&amp;gt; Flash page at 0x802f800 erased (size: 0x800EraseFlash - Page:0x60 Size:0x800 -&amp;gt; Flash page at 0x8030000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x61 Size:0x800 -&amp;gt; Flash page at 0x8030800 erased (size: 0x800EraseFlash - Page:0x62 Size:0x800 -&amp;gt; Flash page at 0x8031000 erased (size: 0x800EraseFlash - Page:0x63 Size:0x800 -&amp;gt; Flash page at 0x8031800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x64 Size:0x800 -&amp;gt; Flash page at 0x8032000 erased (size: 0x800EraseFlash - Page:0x65 Size:0x800 -&amp;gt; Flash page at 0x8032800 erased (size: 0x800EraseFlash - Page:0x66 Size:0x800 -&amp;gt; Flash page at 0x8033000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x67 Size:0x800 -&amp;gt; Flash page at 0x8033800 erased (size: 0x800EraseFlash - Page:0x68 Size:0x800 -&amp;gt; Flash page at 0x8034000 erased (size: 0x800EraseFlash - Page:0x69 Size:0x800 -&amp;gt; Flash page at 0x8034800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x6a Size:0x800 -&amp;gt; Flash page at 0x8035000 erased (size: 0x800EraseFlash - Page:0x6b Size:0x800 -&amp;gt; Flash page at 0x8035800 erased (size: 0x800EraseFlash - Page:0x6c Size:0x800 -&amp;gt; Flash page at 0x8036000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x6d Size:0x800 -&amp;gt; Flash page at 0x8036800 erased (size: 0x800EraseFlash - Page:0x6e Size:0x800 -&amp;gt; Flash page at 0x8037000 erased (size: 0x800EraseFlash - Page:0x6f Size:0x800 -&amp;gt; Flash page at 0x8037800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x70 Size:0x800 -&amp;gt; Flash page at 0x8038000 erased (size: 0x800EraseFlash - Page:0x71 Size:0x800 -&amp;gt; Flash page at 0x8038800 erased (size: 0x800EraseFlash - Page:0x72 Size:0x800 -&amp;gt; Flash page at 0x8039000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x73 Size:0x800 -&amp;gt; Flash page at 0x8039800 erased (size: 0x800EraseFlash - Page:0x74 Size:0x800 -&amp;gt; Flash page at 0x803a000 erased (size: 0x800EraseFlash - Page:0x75 Size:0x800 -&amp;gt; Flash page at 0x803a800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x76 Size:0x800 -&amp;gt; Flash page at 0x803b000 erased (size: 0x800EraseFlash - Page:0x77 Size:0x800 -&amp;gt; Flash page at 0x803b800 erased (size: 0x800EraseFlash - Page:0x78 Size:0x800 -&amp;gt; Flash page at 0x803c000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x79 Size:0x800 -&amp;gt; Flash page at 0x803c800 erased (size: 0x800EraseFlash - Page:0x7a Size:0x800 -&amp;gt; Flash page at 0x803d000 erased (size: 0x800EraseFlash - Page:0x7b Size:0x800 -&amp;gt; Flash page at 0x803d800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x7c Size:0x800 -&amp;gt; Flash page at 0x803e000 erased (size: 0x800EraseFlash - Page:0x7d Size:0x800 -&amp;gt; Flash page at 0x803e800 erased (size: 0x800EraseFlash - Page:0x7e Size:0x800 -&amp;gt; Flash page at 0x803f000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x7f Size:0x800 -&amp;gt; Flash page at 0x803f800 erased (size: 0x800)&lt;br /&gt;
2024-09-02T10:30:29 INFO flash_loader.c: Starting Flash write for F2/F4/F7/L4&lt;br /&gt;
2024-09-02T10:30:29 INFO flash_loader.c: Successfully loaded flash loader in sram&lt;br /&gt;
2024-09-02T10:30:29 INFO flash_loader.c: Clear DFSR&lt;br /&gt;
2024-09-02T10:30:35 INFO common_flash.c: Starting verification of write complete&lt;br /&gt;
2024-09-02T10:30:37 INFO common_flash.c: Flash written and verified! jolly good!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That went well - no errors reported.  Now let's try to read that flash into a file:&lt;br /&gt;
&lt;br /&gt;
=== Reading data from the MCU ===&lt;br /&gt;
&lt;br /&gt;
To be absolutely certain, read the data back into a new file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-flash --flash=256k read random2.bin 0x8000000 0x40000&lt;br /&gt;
st-flash 1.8.0&lt;br /&gt;
2024-09-02T10:31:51 INFO common.c: STM32L41x_L42x: 48 KiB SRAM, 128 KiB flash in at least 2 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00040000&lt;br /&gt;
2024-09-02T10:31:51 INFO common.c: read from address 0x08000000 size 262144&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No complaints!&lt;br /&gt;
&lt;br /&gt;
=== Compare data ===&lt;br /&gt;
&lt;br /&gt;
Finally we can verify that the data read from the MCU matches the data we wrote to the MCU:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ md5sum random*&lt;br /&gt;
5f7ebd5c822e07408e6279445eb1444a  random2.bin&lt;br /&gt;
5f7ebd5c822e07408e6279445eb1444a  random.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
They are identical, so it is absolutely confirmed that this particular STM32L432KB is in fact a STM32L432KC which identifies as a STM32L432KB.&lt;br /&gt;
&lt;br /&gt;
== STM32F407 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@nb7:~/tmp$ st-info --probe &amp;amp;&amp;amp; dd if=/dev/urandom of=random.bin bs=1k count=1024 &amp;amp;&amp;amp; st-flash --flash=1024k write random.bin 0x8000000 &amp;amp;&amp;amp; st-flash --flash=1024k read random2.bin 0x8000000 0x100000 &amp;amp;&amp;amp; md5sum random.bin random2.bin&lt;br /&gt;
Found 1 stlink programmers&lt;br /&gt;
  version:    V2J48S35&lt;br /&gt;
  serial:     066DFF495454657287165222&lt;br /&gt;
  flash:      524288 (pagesize: 16384)&lt;br /&gt;
  sram:       196608&lt;br /&gt;
  chipid:     0x413&lt;br /&gt;
  dev-type:   STM32F4x5_F4x7&lt;br /&gt;
1024+0 records in&lt;br /&gt;
1024+0 records out&lt;br /&gt;
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00555526 s, 189 MB/s&lt;br /&gt;
st-flash 1.8.0-121-g8c34a4e&lt;br /&gt;
2026-08-05T18:17:03 INFO common_legacy.c: STM32F4x5_F4x7: 192 KiB SRAM, 512 KiB flash in at least 16 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
file random.bin md5 checksum: dcd4cae158a72174cf828026717b6d4b, stlink checksum: 0x07f88bb5&lt;br /&gt;
2026-08-05T18:17:03 INFO common_flash.c: Attempting to write 1048576 (0x100000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
EraseFlash - Sector:0x0 Size:0x4000 -&amp;gt; Flash page at 0x8000000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x1 Size:0x4000 -&amp;gt; Flash page at 0x8004000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x2 Size:0x4000 -&amp;gt; Flash page at 0x8008000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x3 Size:0x4000 -&amp;gt; Flash page at 0x800c000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x4 Size:0x10000 -&amp;gt; Flash page at 0x8010000 erased (size: 0x10000)&lt;br /&gt;
EraseFlash - Sector:0x5 Size:0x20000 -&amp;gt; Flash page at 0x8020000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x6 Size:0x20000 -&amp;gt; Flash page at 0x8040000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x7 Size:0x20000 -&amp;gt; Flash page at 0x8060000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x8 Size:0x20000 -&amp;gt; Flash page at 0x8080000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x9 Size:0x20000 -&amp;gt; Flash page at 0x80a0000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0xa Size:0x20000 -&amp;gt; Flash page at 0x80c0000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0xb Size:0x20000 -&amp;gt; Flash page at 0x80e0000 erased (size: 0x20000)&lt;br /&gt;
&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: Starting Flash write for F2/F4/F7/L4&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: Successfully loaded flash loader in sram&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: Clear DFSR&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: enabling 32-bit flash writes&lt;br /&gt;
2026-08-05T18:17:36 INFO common_flash.c: Starting verification of write complete&lt;br /&gt;
2026-08-05T18:17:46 INFO common_flash.c: Flash written and verified! jolly good!&lt;br /&gt;
2026-08-05T18:17:46 INFO common_legacy.c: Go to Thumb mode&lt;br /&gt;
st-flash 1.8.0-121-g8c34a4e&lt;br /&gt;
2026-08-05T18:17:46 INFO common_legacy.c: STM32F4x5_F4x7: 192 KiB SRAM, 512 KiB flash in at least 16 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
2026-08-05T18:17:46 INFO common_legacy.c: read from address 0x08000000 size 1048576&lt;br /&gt;
dcd4cae158a72174cf828026717b6d4b  random.bin&lt;br /&gt;
dcd4cae158a72174cf828026717b6d4b  random2.bin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== STM32H723VE ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ (st-info --probe &amp;amp;&amp;amp; dd if=/dev/urandom of=random.bin bs=1k count=1024 &amp;amp;&amp;amp; st-flash --flash=1024k write random.bin 0x8000000 &amp;amp;&amp;amp; st-flash --flash=1024k read random2.bin 0x8000000 0x100000 &amp;amp;&amp;amp; md5sum random.bin random2.bin) 2&amp;gt;&amp;amp;1 | tee /tmp/flash.log&lt;br /&gt;
Found 1 stlink programmers&lt;br /&gt;
  version:    V2J48S35&lt;br /&gt;
  serial:     066DFF495454657287165222&lt;br /&gt;
  flash:      524288 (pagesize: 131072)&lt;br /&gt;
  sram:       131072&lt;br /&gt;
  chipid:     0x483&lt;br /&gt;
  dev-type:   STM32H72x_H73x&lt;br /&gt;
  voltage:    3237 mV&lt;br /&gt;
1024+0 records in&lt;br /&gt;
1024+0 records out&lt;br /&gt;
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00473775 s, 221 MB/s&lt;br /&gt;
st-flash 1.8.0-217-g5ec9d51&lt;br /&gt;
2026-10-25T08:06:58 INFO common_legacy.c: STM32H72x_H73x: 128 KiB SRAM, 512 KiB flash in at least 128 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
file random.bin md5 checksum: 7b5fa446a281b4e3641a50f1a33376ac, stlink checksum: 0x07f758e4&lt;br /&gt;
2026-10-25T08:06:58 INFO common_flash.c: Attempting to write 1048576 (0x100000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8000000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8020000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8040000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8060000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8080000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x80a0000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x80c0000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x80e0000 erased (size: 0x20000)&lt;br /&gt;
&lt;br /&gt;
2026-10-25T08:07:05 INFO flash_loader.c: Starting Flash write for H7&lt;br /&gt;
64/1048576 bytes written&lt;br /&gt;
128/1048576 bytes written&lt;br /&gt;
192/1048576 bytes written&lt;br /&gt;
256/1048576 bytes written&lt;br /&gt;
320/1048576 bytes written&lt;br /&gt;
384/1048576 bytes written&lt;br /&gt;
448/1048576 bytes written&lt;br /&gt;
512/1048576 bytes written&lt;br /&gt;
576/1048576 bytes written&lt;br /&gt;
640/1048576 bytes written&lt;br /&gt;
704/1048576 bytes written&lt;br /&gt;
768/1048576 bytes written&lt;br /&gt;
832/1048576 bytes written&lt;br /&gt;
896/1048576 bytes written&lt;br /&gt;
960/1048576 bytes written&lt;br /&gt;
1024/1048576 bytes written&lt;br /&gt;
...&lt;br /&gt;
1047808/1048576 bytes written&lt;br /&gt;
1047872/1048576 bytes written&lt;br /&gt;
1047936/1048576 bytes written&lt;br /&gt;
1048000/1048576 bytes written&lt;br /&gt;
1048064/1048576 bytes written&lt;br /&gt;
1048128/1048576 bytes written&lt;br /&gt;
1048192/1048576 bytes written&lt;br /&gt;
1048256/1048576 bytes written&lt;br /&gt;
1048320/1048576 bytes written&lt;br /&gt;
1048384/1048576 bytes written&lt;br /&gt;
1048448/1048576 bytes written&lt;br /&gt;
1048512/1048576 bytes written&lt;br /&gt;
1048576/1048576 bytes written&lt;br /&gt;
&lt;br /&gt;
2026-10-25T08:07:23 INFO common_flash.c: Starting verification of write complete&lt;br /&gt;
2026-10-25T08:07:32 INFO common_flash.c: Flash written and verified! jolly good!&lt;br /&gt;
2026-10-25T08:07:32 INFO common_legacy.c: Go to Thumb mode&lt;br /&gt;
st-flash 1.8.0-217-g5ec9d51&lt;br /&gt;
2026-10-25T08:07:32 INFO common_legacy.c: STM32H72x_H73x: 128 KiB SRAM, 512 KiB flash in at least 128 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
2026-10-25T08:07:32 INFO common_legacy.c: read from address 0x08000000 size 1048576&lt;br /&gt;
7b5fa446a281b4e3641a50f1a33376ac  random.bin&lt;br /&gt;
7b5fa446a281b4e3641a50f1a33376ac  random2.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://ipfs-pin.com/ipfs/QmcYpvigogWESmwTEFM5GYZc6st2SJRAoqwKWJ8ZDtgiXb/stm32l432kb.pdf STM32L432 Datasheet]&lt;br /&gt;
* [https://mecrisp-stellaris-folkdoc.sourceforge.io/bluepill-diagnostics-v1.6.html Bluepill Diagnostics Tool]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=STM32_Hidden_Flash&amp;diff=8743</id>
		<title>STM32 Hidden Flash</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=STM32_Hidden_Flash&amp;diff=8743"/>
		<updated>2026-10-25T00:10:21Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Flash]][[Category:STM32 Hardware]][[Category:STM32 Documentation]][[Category:STM32 Development]]{{metadesc|STM32 Real Flash Size}}&lt;br /&gt;
Many [[STM32]] [[MCU]]s have more flash than they claim to have.&lt;br /&gt;
&lt;br /&gt;
This has been confirmed on [[STM32F103]], [[STM32L432]] and [[STM32F40x]].&lt;br /&gt;
&lt;br /&gt;
== Speculation ==&lt;br /&gt;
&lt;br /&gt;
While not confirmed it is quite possible that this is common in all [[STM32]] [[MCU]]s which share datasheets.  If we look at the STM32G474, the datasheet overview looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Example datasheet STM32G474xB STM32G474xC STM32G474xE.png|800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most likely, these MCU's all have 512 kB of flash even if some report having less.&lt;br /&gt;
&lt;br /&gt;
== Video == &lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|lMNvgP76n2E}}&lt;br /&gt;
&lt;br /&gt;
== STM32L432 ==&lt;br /&gt;
[[File:FidoKey rev. a - top view.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
The STM32L432Kx is available with two different flash sizes.  The STM32L432KB has got 128 kB while the STM32L432KC has got 256 kB.&lt;br /&gt;
I recently created a USB &amp;quot;key&amp;quot; using the STM32L432.  The reason for using this specific [[STM32]] [[MCU]] was twofold:&lt;br /&gt;
&lt;br /&gt;
# It is small&lt;br /&gt;
# It's got a built-in 48 MHz oscillator precise enough to use USB without an external crystal&lt;br /&gt;
&lt;br /&gt;
Unfortunately, while I wanted the 256 kB version, only the 128 kB version was available.&lt;br /&gt;
&lt;br /&gt;
[[File:STM32L432 Part Numbering.png|600px]]&lt;br /&gt;
&lt;br /&gt;
The [[STM32]] [[Blue Pill]] boards mostly use Chinese clone [[MCU]]s but there has been a lot of writing about the original ones having 128 kB of flash rather than the 64 kB specified by the datasheet.  There is even a [https://mecrisp-stellaris-folkdoc.sourceforge.io/bluepill-diagnostics-v1.6.html test tool] available which can test for the hidden flash.&lt;br /&gt;
&lt;br /&gt;
Inspired by this, I decided to test the STM32L432KB on my own board.  As per the datasheet this processor is supposed to have 128 kB of flash ranging from 0x8000000 to 0x801FFFF.&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
[[File:Flash Size Test Setup.jpg|thumb|300px|STM32L432 Test Setup]] &lt;br /&gt;
&lt;br /&gt;
=== Checking device ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-info --probe&lt;br /&gt;
Found 1 stlink programmers&lt;br /&gt;
  version:    V2J45S31&lt;br /&gt;
  serial:     066CFF3933584B3043184346&lt;br /&gt;
  flash:      131072 (pagesize: 2048)&lt;br /&gt;
  sram:       49152&lt;br /&gt;
  chipid:     0x435&lt;br /&gt;
  dev-type:   STM32L41x_L42x&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that the device reports 128 kB of flash - as is expected.&lt;br /&gt;
&lt;br /&gt;
=== Generating Test Data ===&lt;br /&gt;
&lt;br /&gt;
First step is to create a 256 kB file with random data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ dd if=/dev/urandom of=random.bin bs=1k count=256&lt;br /&gt;
256+0 records in&lt;br /&gt;
256+0 records out&lt;br /&gt;
262144 bytes (262 kB, 256 KiB) copied, 0.0012241 s, 214 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing data to MCU ===&lt;br /&gt;
&lt;br /&gt;
The random.bin file is of a size which should only be possible to flash on STM32L432KC.&lt;br /&gt;
&lt;br /&gt;
First step is to flash normal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-flash write random.bin 0x8000000&lt;br /&gt;
st-flash 1.8.0&lt;br /&gt;
2024-09-02T10:30:01 INFO common.c: STM32L41x_L42x: 48 KiB SRAM, 128 KiB flash in at least 2 KiB pages.&lt;br /&gt;
file random.bin md5 checksum: 5f7ebd5c822e7408e6279445eb1444a, stlink checksum: 0x01fe53dd&lt;br /&gt;
2024-09-02T10:30:01 INFO common_flash.c: Attempting to write 262144 (0x40000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
2024-09-02T10:30:01 ERROR common_flash.c: The size exceeds the size of the flash (0x00020000 bytes available)&lt;br /&gt;
stlink_fwrite_flash() == -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As expected this failed.  The [[MCU]] reports 128 kB of flash and we attempt to write 256 kB.  We can however instruct st-flash to ignore that and attempt to write the entire file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-flash --flash=256k write random.bin 0x8000000&lt;br /&gt;
st-flash 1.8.0&lt;br /&gt;
2024-09-02T10:30:26 INFO common.c: STM32L41x_L42x: 48 KiB SRAM, 128 KiB flash in at least 2 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00040000&lt;br /&gt;
file random.bin md5 checksum: 5f7ebd5c822e7408e6279445eb1444a, stlink checksum: 0x01fe53dd&lt;br /&gt;
2024-09-02T10:30:26 INFO common_flash.c: Attempting to write 262144 (0x40000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
EraseFlash - Page:0x10 Size:0x800 -&amp;gt; Flash page at 0x8008000 erased (size: 0x800EraseFlash - Page:0x11 Size:0x800 -&amp;gt; Flash page at 0x8008800 erased (size: 0x800EraseFlash - Page:0x12 Size:0x800 -&amp;gt; Flash page at 0x8009000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x13 Size:0x800 -&amp;gt; Flash page at 0x8009800 erased (size: 0x800EraseFlash - Page:0x14 Size:0x800 -&amp;gt; Flash page at 0x800a000 erased (size: 0x800EraseFlash - Page:0x15 Size:0x800 -&amp;gt; Flash page at 0x800a800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x16 Size:0x800 -&amp;gt; Flash page at 0x800b000 erased (size: 0x800EraseFlash - Page:0x17 Size:0x800 -&amp;gt; Flash page at 0x800b800 erased (size: 0x800EraseFlash - Page:0x18 Size:0x800 -&amp;gt; Flash page at 0x800c000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x19 Size:0x800 -&amp;gt; Flash page at 0x800c800 erased (size: 0x800EraseFlash - Page:0x1a Size:0x800 -&amp;gt; Flash page at 0x800d000 erased (size: 0x800EraseFlash - Page:0x1b Size:0x800 -&amp;gt; Flash page at 0x800d800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x1c Size:0x800 -&amp;gt; Flash page at 0x800e000 erased (size: 0x800EraseFlash - Page:0x1d Size:0x800 -&amp;gt; Flash page at 0x800e800 erased (size: 0x800EraseFlash - Page:0x1e Size:0x800 -&amp;gt; Flash page at 0x800f000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x1f Size:0x800 -&amp;gt; Flash page at 0x800f800 erased (size: 0x800EraseFlash - Page:0x20 Size:0x800 -&amp;gt; Flash page at 0x8010000 erased (size: 0x800EraseFlash - Page:0x21 Size:0x800 -&amp;gt; Flash page at 0x8010800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x22 Size:0x800 -&amp;gt; Flash page at 0x8011000 erased (size: 0x800EraseFlash - Page:0x23 Size:0x800 -&amp;gt; Flash page at 0x8011800 erased (size: 0x800EraseFlash - Page:0x24 Size:0x800 -&amp;gt; Flash page at 0x8012000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x25 Size:0x800 -&amp;gt; Flash page at 0x8012800 erased (size: 0x800EraseFlash - Page:0x26 Size:0x800 -&amp;gt; Flash page at 0x8013000 erased (size: 0x800EraseFlash - Page:0x27 Size:0x800 -&amp;gt; Flash page at 0x8013800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x28 Size:0x800 -&amp;gt; Flash page at 0x8014000 erased (size: 0x800EraseFlash - Page:0x29 Size:0x800 -&amp;gt; Flash page at 0x8014800 erased (size: 0x800EraseFlash - Page:0x2a Size:0x800 -&amp;gt; Flash page at 0x8015000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x2b Size:0x800 -&amp;gt; Flash page at 0x8015800 erased (size: 0x800EraseFlash - Page:0x2c Size:0x800 -&amp;gt; Flash page at 0x8016000 erased (size: 0x800EraseFlash - Page:0x2d Size:0x800 -&amp;gt; Flash page at 0x8016800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x2e Size:0x800 -&amp;gt; Flash page at 0x8017000 erased (size: 0x800EraseFlash - Page:0x2f Size:0x800 -&amp;gt; Flash page at 0x8017800 erased (size: 0x800EraseFlash - Page:0x30 Size:0x800 -&amp;gt; Flash page at 0x8018000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x31 Size:0x800 -&amp;gt; Flash page at 0x8018800 erased (size: 0x800EraseFlash - Page:0x32 Size:0x800 -&amp;gt; Flash page at 0x8019000 erased (size: 0x800EraseFlash - Page:0x33 Size:0x800 -&amp;gt; Flash page at 0x8019800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x34 Size:0x800 -&amp;gt; Flash page at 0x801a000 erased (size: 0x800EraseFlash - Page:0x35 Size:0x800 -&amp;gt; Flash page at 0x801a800 erased (size: 0x800EraseFlash - Page:0x36 Size:0x800 -&amp;gt; Flash page at 0x801b000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x37 Size:0x800 -&amp;gt; Flash page at 0x801b800 erased (size: 0x800EraseFlash - Page:0x38 Size:0x800 -&amp;gt; Flash page at 0x801c000 erased (size: 0x800EraseFlash - Page:0x39 Size:0x800 -&amp;gt; Flash page at 0x801c800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x3a Size:0x800 -&amp;gt; Flash page at 0x801d000 erased (size: 0x800EraseFlash - Page:0x3b Size:0x800 -&amp;gt; Flash page at 0x801d800 erased (size: 0x800EraseFlash - Page:0x3c Size:0x800 -&amp;gt; Flash page at 0x801e000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x3d Size:0x800 -&amp;gt; Flash page at 0x801e800 erased (size: 0x800EraseFlash - Page:0x3e Size:0x800 -&amp;gt; Flash page at 0x801f000 erased (size: 0x800EraseFlash - Page:0x3f Size:0x800 -&amp;gt; Flash page at 0x801f800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x40 Size:0x800 -&amp;gt; Flash page at 0x8020000 erased (size: 0x800EraseFlash - Page:0x41 Size:0x800 -&amp;gt; Flash page at 0x8020800 erased (size: 0x800EraseFlash - Page:0x42 Size:0x800 -&amp;gt; Flash page at 0x8021000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x43 Size:0x800 -&amp;gt; Flash page at 0x8021800 erased (size: 0x800EraseFlash - Page:0x44 Size:0x800 -&amp;gt; Flash page at 0x8022000 erased (size: 0x800EraseFlash - Page:0x45 Size:0x800 -&amp;gt; Flash page at 0x8022800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x46 Size:0x800 -&amp;gt; Flash page at 0x8023000 erased (size: 0x800EraseFlash - Page:0x47 Size:0x800 -&amp;gt; Flash page at 0x8023800 erased (size: 0x800EraseFlash - Page:0x48 Size:0x800 -&amp;gt; Flash page at 0x8024000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x49 Size:0x800 -&amp;gt; Flash page at 0x8024800 erased (size: 0x800EraseFlash - Page:0x4a Size:0x800 -&amp;gt; Flash page at 0x8025000 erased (size: 0x800EraseFlash - Page:0x4b Size:0x800 -&amp;gt; Flash page at 0x8025800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x4c Size:0x800 -&amp;gt; Flash page at 0x8026000 erased (size: 0x800EraseFlash - Page:0x4d Size:0x800 -&amp;gt; Flash page at 0x8026800 erased (size: 0x800EraseFlash - Page:0x4e Size:0x800 -&amp;gt; Flash page at 0x8027000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x4f Size:0x800 -&amp;gt; Flash page at 0x8027800 erased (size: 0x800EraseFlash - Page:0x50 Size:0x800 -&amp;gt; Flash page at 0x8028000 erased (size: 0x800EraseFlash - Page:0x51 Size:0x800 -&amp;gt; Flash page at 0x8028800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x52 Size:0x800 -&amp;gt; Flash page at 0x8029000 erased (size: 0x800EraseFlash - Page:0x53 Size:0x800 -&amp;gt; Flash page at 0x8029800 erased (size: 0x800EraseFlash - Page:0x54 Size:0x800 -&amp;gt; Flash page at 0x802a000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x55 Size:0x800 -&amp;gt; Flash page at 0x802a800 erased (size: 0x800EraseFlash - Page:0x56 Size:0x800 -&amp;gt; Flash page at 0x802b000 erased (size: 0x800EraseFlash - Page:0x57 Size:0x800 -&amp;gt; Flash page at 0x802b800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x58 Size:0x800 -&amp;gt; Flash page at 0x802c000 erased (size: 0x800EraseFlash - Page:0x59 Size:0x800 -&amp;gt; Flash page at 0x802c800 erased (size: 0x800EraseFlash - Page:0x5a Size:0x800 -&amp;gt; Flash page at 0x802d000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x5b Size:0x800 -&amp;gt; Flash page at 0x802d800 erased (size: 0x800EraseFlash - Page:0x5c Size:0x800 -&amp;gt; Flash page at 0x802e000 erased (size: 0x800EraseFlash - Page:0x5d Size:0x800 -&amp;gt; Flash page at 0x802e800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x5e Size:0x800 -&amp;gt; Flash page at 0x802f000 erased (size: 0x800EraseFlash - Page:0x5f Size:0x800 -&amp;gt; Flash page at 0x802f800 erased (size: 0x800EraseFlash - Page:0x60 Size:0x800 -&amp;gt; Flash page at 0x8030000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x61 Size:0x800 -&amp;gt; Flash page at 0x8030800 erased (size: 0x800EraseFlash - Page:0x62 Size:0x800 -&amp;gt; Flash page at 0x8031000 erased (size: 0x800EraseFlash - Page:0x63 Size:0x800 -&amp;gt; Flash page at 0x8031800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x64 Size:0x800 -&amp;gt; Flash page at 0x8032000 erased (size: 0x800EraseFlash - Page:0x65 Size:0x800 -&amp;gt; Flash page at 0x8032800 erased (size: 0x800EraseFlash - Page:0x66 Size:0x800 -&amp;gt; Flash page at 0x8033000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x67 Size:0x800 -&amp;gt; Flash page at 0x8033800 erased (size: 0x800EraseFlash - Page:0x68 Size:0x800 -&amp;gt; Flash page at 0x8034000 erased (size: 0x800EraseFlash - Page:0x69 Size:0x800 -&amp;gt; Flash page at 0x8034800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x6a Size:0x800 -&amp;gt; Flash page at 0x8035000 erased (size: 0x800EraseFlash - Page:0x6b Size:0x800 -&amp;gt; Flash page at 0x8035800 erased (size: 0x800EraseFlash - Page:0x6c Size:0x800 -&amp;gt; Flash page at 0x8036000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x6d Size:0x800 -&amp;gt; Flash page at 0x8036800 erased (size: 0x800EraseFlash - Page:0x6e Size:0x800 -&amp;gt; Flash page at 0x8037000 erased (size: 0x800EraseFlash - Page:0x6f Size:0x800 -&amp;gt; Flash page at 0x8037800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x70 Size:0x800 -&amp;gt; Flash page at 0x8038000 erased (size: 0x800EraseFlash - Page:0x71 Size:0x800 -&amp;gt; Flash page at 0x8038800 erased (size: 0x800EraseFlash - Page:0x72 Size:0x800 -&amp;gt; Flash page at 0x8039000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x73 Size:0x800 -&amp;gt; Flash page at 0x8039800 erased (size: 0x800EraseFlash - Page:0x74 Size:0x800 -&amp;gt; Flash page at 0x803a000 erased (size: 0x800EraseFlash - Page:0x75 Size:0x800 -&amp;gt; Flash page at 0x803a800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x76 Size:0x800 -&amp;gt; Flash page at 0x803b000 erased (size: 0x800EraseFlash - Page:0x77 Size:0x800 -&amp;gt; Flash page at 0x803b800 erased (size: 0x800EraseFlash - Page:0x78 Size:0x800 -&amp;gt; Flash page at 0x803c000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x79 Size:0x800 -&amp;gt; Flash page at 0x803c800 erased (size: 0x800EraseFlash - Page:0x7a Size:0x800 -&amp;gt; Flash page at 0x803d000 erased (size: 0x800EraseFlash - Page:0x7b Size:0x800 -&amp;gt; Flash page at 0x803d800 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x7c Size:0x800 -&amp;gt; Flash page at 0x803e000 erased (size: 0x800EraseFlash - Page:0x7d Size:0x800 -&amp;gt; Flash page at 0x803e800 erased (size: 0x800EraseFlash - Page:0x7e Size:0x800 -&amp;gt; Flash page at 0x803f000 erased (size: 0x800&lt;br /&gt;
EraseFlash - Page:0x7f Size:0x800 -&amp;gt; Flash page at 0x803f800 erased (size: 0x800)&lt;br /&gt;
2024-09-02T10:30:29 INFO flash_loader.c: Starting Flash write for F2/F4/F7/L4&lt;br /&gt;
2024-09-02T10:30:29 INFO flash_loader.c: Successfully loaded flash loader in sram&lt;br /&gt;
2024-09-02T10:30:29 INFO flash_loader.c: Clear DFSR&lt;br /&gt;
2024-09-02T10:30:35 INFO common_flash.c: Starting verification of write complete&lt;br /&gt;
2024-09-02T10:30:37 INFO common_flash.c: Flash written and verified! jolly good!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That went well - no errors reported.  Now let's try to read that flash into a file:&lt;br /&gt;
&lt;br /&gt;
=== Reading data from the MCU ===&lt;br /&gt;
&lt;br /&gt;
To be absolutely certain, read the data back into a new file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ st-flash --flash=256k read random2.bin 0x8000000 0x40000&lt;br /&gt;
st-flash 1.8.0&lt;br /&gt;
2024-09-02T10:31:51 INFO common.c: STM32L41x_L42x: 48 KiB SRAM, 128 KiB flash in at least 2 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00040000&lt;br /&gt;
2024-09-02T10:31:51 INFO common.c: read from address 0x08000000 size 262144&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No complaints!&lt;br /&gt;
&lt;br /&gt;
=== Compare data ===&lt;br /&gt;
&lt;br /&gt;
Finally we can verify that the data read from the MCU matches the data we wrote to the MCU:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ md5sum random*&lt;br /&gt;
5f7ebd5c822e07408e6279445eb1444a  random2.bin&lt;br /&gt;
5f7ebd5c822e07408e6279445eb1444a  random.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
They are identical, so it is absolutely confirmed that this particular STM32L432KB is in fact a STM32L432KC which identifies as a STM32L432KB.&lt;br /&gt;
&lt;br /&gt;
== STM32F407 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@nb7:~/tmp$ st-info --probe &amp;amp;&amp;amp; dd if=/dev/urandom of=random.bin bs=1k count=1024 &amp;amp;&amp;amp; st-flash --flash=1024k write random.bin 0x8000000 &amp;amp;&amp;amp; st-flash --flash=1024k read random2.bin 0x8000000 0x100000 &amp;amp;&amp;amp; md5sum random.bin random2.bin&lt;br /&gt;
Found 1 stlink programmers&lt;br /&gt;
  version:    V2J48S35&lt;br /&gt;
  serial:     066DFF495454657287165222&lt;br /&gt;
  flash:      524288 (pagesize: 16384)&lt;br /&gt;
  sram:       196608&lt;br /&gt;
  chipid:     0x413&lt;br /&gt;
  dev-type:   STM32F4x5_F4x7&lt;br /&gt;
1024+0 records in&lt;br /&gt;
1024+0 records out&lt;br /&gt;
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00555526 s, 189 MB/s&lt;br /&gt;
st-flash 1.8.0-121-g8c34a4e&lt;br /&gt;
2026-08-05T18:17:03 INFO common_legacy.c: STM32F4x5_F4x7: 192 KiB SRAM, 512 KiB flash in at least 16 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
file random.bin md5 checksum: dcd4cae158a72174cf828026717b6d4b, stlink checksum: 0x07f88bb5&lt;br /&gt;
2026-08-05T18:17:03 INFO common_flash.c: Attempting to write 1048576 (0x100000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
EraseFlash - Sector:0x0 Size:0x4000 -&amp;gt; Flash page at 0x8000000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x1 Size:0x4000 -&amp;gt; Flash page at 0x8004000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x2 Size:0x4000 -&amp;gt; Flash page at 0x8008000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x3 Size:0x4000 -&amp;gt; Flash page at 0x800c000 erased (size: 0x4000)&lt;br /&gt;
EraseFlash - Sector:0x4 Size:0x10000 -&amp;gt; Flash page at 0x8010000 erased (size: 0x10000)&lt;br /&gt;
EraseFlash - Sector:0x5 Size:0x20000 -&amp;gt; Flash page at 0x8020000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x6 Size:0x20000 -&amp;gt; Flash page at 0x8040000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x7 Size:0x20000 -&amp;gt; Flash page at 0x8060000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x8 Size:0x20000 -&amp;gt; Flash page at 0x8080000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0x9 Size:0x20000 -&amp;gt; Flash page at 0x80a0000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0xa Size:0x20000 -&amp;gt; Flash page at 0x80c0000 erased (size: 0x20000)&lt;br /&gt;
EraseFlash - Sector:0xb Size:0x20000 -&amp;gt; Flash page at 0x80e0000 erased (size: 0x20000)&lt;br /&gt;
&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: Starting Flash write for F2/F4/F7/L4&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: Successfully loaded flash loader in sram&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: Clear DFSR&lt;br /&gt;
2026-08-05T18:17:21 INFO flash_loader.c: enabling 32-bit flash writes&lt;br /&gt;
2026-08-05T18:17:36 INFO common_flash.c: Starting verification of write complete&lt;br /&gt;
2026-08-05T18:17:46 INFO common_flash.c: Flash written and verified! jolly good!&lt;br /&gt;
2026-08-05T18:17:46 INFO common_legacy.c: Go to Thumb mode&lt;br /&gt;
st-flash 1.8.0-121-g8c34a4e&lt;br /&gt;
2026-08-05T18:17:46 INFO common_legacy.c: STM32F4x5_F4x7: 192 KiB SRAM, 512 KiB flash in at least 16 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
2026-08-05T18:17:46 INFO common_legacy.c: read from address 0x08000000 size 1048576&lt;br /&gt;
dcd4cae158a72174cf828026717b6d4b  random.bin&lt;br /&gt;
dcd4cae158a72174cf828026717b6d4b  random2.bin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== STM32H723 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lth@ncpws04:~/tmp$ (st-info --probe &amp;amp;&amp;amp; dd if=/dev/urandom of=random.bin bs=1k count=1024 &amp;amp;&amp;amp; st-flash --flash=1024k write random.bin 0x8000000 &amp;amp;&amp;amp; st-flash --flash=1024k read random2.bin 0x8000000 0x100000 &amp;amp;&amp;amp; md5sum random.bin random2.bin) 2&amp;gt;&amp;amp;1 | tee /tmp/flash.log&lt;br /&gt;
Found 1 stlink programmers&lt;br /&gt;
  version:    V2J48S35&lt;br /&gt;
  serial:     066DFF495454657287165222&lt;br /&gt;
  flash:      524288 (pagesize: 131072)&lt;br /&gt;
  sram:       131072&lt;br /&gt;
  chipid:     0x483&lt;br /&gt;
  dev-type:   STM32H72x_H73x&lt;br /&gt;
  voltage:    3237 mV&lt;br /&gt;
1024+0 records in&lt;br /&gt;
1024+0 records out&lt;br /&gt;
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00473775 s, 221 MB/s&lt;br /&gt;
st-flash 1.8.0-217-g5ec9d51&lt;br /&gt;
2026-10-25T08:06:58 INFO common_legacy.c: STM32H72x_H73x: 128 KiB SRAM, 512 KiB flash in at least 128 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
file random.bin md5 checksum: 7b5fa446a281b4e3641a50f1a33376ac, stlink checksum: 0x07f758e4&lt;br /&gt;
2026-10-25T08:06:58 INFO common_flash.c: Attempting to write 1048576 (0x100000) bytes to stm32 address: 134217728 (0x8000000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8000000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8020000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8040000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8060000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x8080000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x80a0000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x80c0000 erased (size: 0x20000)&lt;br /&gt;
-&amp;gt; Flash page at 0x80e0000 erased (size: 0x20000)&lt;br /&gt;
&lt;br /&gt;
2026-10-25T08:07:05 INFO flash_loader.c: Starting Flash write for H7&lt;br /&gt;
64/1048576 bytes written&lt;br /&gt;
128/1048576 bytes written&lt;br /&gt;
192/1048576 bytes written&lt;br /&gt;
256/1048576 bytes written&lt;br /&gt;
320/1048576 bytes written&lt;br /&gt;
384/1048576 bytes written&lt;br /&gt;
448/1048576 bytes written&lt;br /&gt;
512/1048576 bytes written&lt;br /&gt;
576/1048576 bytes written&lt;br /&gt;
640/1048576 bytes written&lt;br /&gt;
704/1048576 bytes written&lt;br /&gt;
768/1048576 bytes written&lt;br /&gt;
832/1048576 bytes written&lt;br /&gt;
896/1048576 bytes written&lt;br /&gt;
960/1048576 bytes written&lt;br /&gt;
1024/1048576 bytes written&lt;br /&gt;
...&lt;br /&gt;
1047808/1048576 bytes written&lt;br /&gt;
1047872/1048576 bytes written&lt;br /&gt;
1047936/1048576 bytes written&lt;br /&gt;
1048000/1048576 bytes written&lt;br /&gt;
1048064/1048576 bytes written&lt;br /&gt;
1048128/1048576 bytes written&lt;br /&gt;
1048192/1048576 bytes written&lt;br /&gt;
1048256/1048576 bytes written&lt;br /&gt;
1048320/1048576 bytes written&lt;br /&gt;
1048384/1048576 bytes written&lt;br /&gt;
1048448/1048576 bytes written&lt;br /&gt;
1048512/1048576 bytes written&lt;br /&gt;
1048576/1048576 bytes written&lt;br /&gt;
&lt;br /&gt;
2026-10-25T08:07:23 INFO common_flash.c: Starting verification of write complete&lt;br /&gt;
2026-10-25T08:07:32 INFO common_flash.c: Flash written and verified! jolly good!&lt;br /&gt;
2026-10-25T08:07:32 INFO common_legacy.c: Go to Thumb mode&lt;br /&gt;
st-flash 1.8.0-217-g5ec9d51&lt;br /&gt;
2026-10-25T08:07:32 INFO common_legacy.c: STM32H72x_H73x: 128 KiB SRAM, 512 KiB flash in at least 128 KiB pages.&lt;br /&gt;
Forcing flash size: --flash=0x00100000&lt;br /&gt;
2026-10-25T08:07:32 INFO common_legacy.c: read from address 0x08000000 size 1048576&lt;br /&gt;
7b5fa446a281b4e3641a50f1a33376ac  random.bin&lt;br /&gt;
7b5fa446a281b4e3641a50f1a33376ac  random2.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://ipfs-pin.com/ipfs/QmcYpvigogWESmwTEFM5GYZc6st2SJRAoqwKWJ8ZDtgiXb/stm32l432kb.pdf STM32L432 Datasheet]&lt;br /&gt;
* [https://mecrisp-stellaris-folkdoc.sourceforge.io/bluepill-diagnostics-v1.6.html Bluepill Diagnostics Tool]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=I2C_EEPROM_(M24M01)_Neopixel_(WS2812)_and_FreeRTOS&amp;diff=8742</id>
		<title>I2C EEPROM (M24M01) Neopixel (WS2812) and FreeRTOS</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=I2C_EEPROM_(M24M01)_Neopixel_(WS2812)_and_FreeRTOS&amp;diff=8742"/>
		<updated>2026-10-24T09:46:08Z</updated>

		<summary type="html">&lt;p&gt;Lth: Created page with &amp;quot;{{Video |series=RP Pico Video |number=22 |title=I2C EEPROM (M24M01) Neopixel (WS2812) and FreeRTOS |youtube-id=6YDdE4Dwnx0 |description=Running the M24M01 demo under FreeRTOS...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Video&lt;br /&gt;
|series=RP Pico Video&lt;br /&gt;
|number=22&lt;br /&gt;
|title=I2C EEPROM (M24M01) Neopixel (WS2812) and FreeRTOS&lt;br /&gt;
|youtube-id=6YDdE4Dwnx0&lt;br /&gt;
|description=Running the M24M01 demo under FreeRTOS with a 8x8 Neopixel matrix for progress indication.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_MCU_STM32H723&amp;diff=8741</id>
		<title>Streamline MCU STM32H723</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_MCU_STM32H723&amp;diff=8741"/>
		<updated>2026-10-24T08:42:41Z</updated>

		<summary type="html">&lt;p&gt;Lth: /* Miscellaneous Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Blade]]{{metadesc|STM32H723 Streamline MCU board documentation}}&lt;br /&gt;
[[File:sl_mcu_stm32h723-rev_A_top_right_render.png|350px|thumb|Streamline MCU STM32H723]]&lt;br /&gt;
The [[Streamline MCU STM32H723]] is a higher performant [[Streamline]] [[STM32]] [[MCU]] board build around a [[STM32H723]].&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
|'''MCU'''&lt;br /&gt;
|STM32H723VE&lt;br /&gt;
|-&lt;br /&gt;
|'''Flash'''&lt;br /&gt;
|512kB&lt;br /&gt;
|-&lt;br /&gt;
|'''RAM'''&lt;br /&gt;
|564kB&lt;br /&gt;
|-&lt;br /&gt;
|'''Crystal'''&lt;br /&gt;
|16MHz&lt;br /&gt;
|-&lt;br /&gt;
|'''LED'''&lt;br /&gt;
|PC13 (open drain)&lt;br /&gt;
|-&lt;br /&gt;
|'''Button'''&lt;br /&gt;
|Boot0/PA14 (pulled down)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Schematics ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Sl mcu stm32h723.svg|2400px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Errata ==&lt;br /&gt;
&lt;br /&gt;
=== Rev. A ===&lt;br /&gt;
&lt;br /&gt;
On rev. A, the Boot0 button as well as being routed correctly to boot0 was routed to PA14.  This will interfere with the proper operation of SWD and it will not function as a button input.  This will be fixed in Rev. B, but for rev. A, the trace will be cut.  Boot0 will function as planned as a Boot0 selector, but it will not be able to function as a user button.&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_top_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_top_right_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_top_left_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_bot_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_bot_right_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_bot_left_render.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.st.com/resource/en/datasheet/stm32h723ve.pdf STM32H723 Datasheet]&lt;br /&gt;
* [https://www.st.com/resource/en/reference_manual/rm0468-stm32h723733-stm32h725735-and-stm32h730-value-line-advanced-armbased-32bit-mcus-stmicroelectronics.pdf STM32H723/725/730/733/735 Reference Manual]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_MCU_STM32H723&amp;diff=8740</id>
		<title>Streamline MCU STM32H723</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_MCU_STM32H723&amp;diff=8740"/>
		<updated>2026-10-24T08:40:48Z</updated>

		<summary type="html">&lt;p&gt;Lth: /* Rev. A */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Blade]]{{metadesc|STM32H723 Streamline MCU board documentation}}&lt;br /&gt;
[[File:sl_mcu_stm32h723-rev_A_top_right_render.png|350px|thumb|Streamline MCU STM32H723]]&lt;br /&gt;
The [[Streamline MCU STM32H723]] is a higher performant [[Streamline]] [[STM32]] [[MCU]] board build around a [[STM32H723]].&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
|'''MCU'''&lt;br /&gt;
|STM32H723VE&lt;br /&gt;
|-&lt;br /&gt;
|'''Flash'''&lt;br /&gt;
|512kB&lt;br /&gt;
|-&lt;br /&gt;
|'''RAM'''&lt;br /&gt;
|564kB&lt;br /&gt;
|-&lt;br /&gt;
|'''Crystal'''&lt;br /&gt;
|16MHz&lt;br /&gt;
|-&lt;br /&gt;
|'''LED'''&lt;br /&gt;
|PC13 (open drain)&lt;br /&gt;
|-&lt;br /&gt;
|'''Button'''&lt;br /&gt;
|Boot0/PA14 (pulled down)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Schematics ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Sl mcu stm32h723.svg|2400px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Errata ==&lt;br /&gt;
&lt;br /&gt;
=== Rev. A ===&lt;br /&gt;
&lt;br /&gt;
On rev. A, the Boot0 button as well as being routed correctly to boot0 was routed to PA14.  This will interfere with the proper operation of SWD and it will not function as a button input.  This will be fixed in Rev. B, but for rev. A, the trace will be cut.  Boot0 will function as planned as a Boot0 selector, but it will not be able to function as a user button.&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_top_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_top_right_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_top_left_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_bot_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_bot_right_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_bot_left_render.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.st.com/resource/en/datasheet/stm32h723ve.pdf Datasheet]&lt;br /&gt;
* [https://www.st.com/resource/en/reference_manual/rm0468-stm32h723733-stm32h725735-and-stm32h730-value-line-advanced-armbased-32bit-mcus-stmicroelectronics.pdf STM32H723/725/730/733/735 Reference Manual]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_MCU_STM32H723&amp;diff=8739</id>
		<title>Streamline MCU STM32H723</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_MCU_STM32H723&amp;diff=8739"/>
		<updated>2026-10-24T08:38:47Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Blade]]{{metadesc|STM32H723 Streamline MCU board documentation}}&lt;br /&gt;
[[File:sl_mcu_stm32h723-rev_A_top_right_render.png|350px|thumb|Streamline MCU STM32H723]]&lt;br /&gt;
The [[Streamline MCU STM32H723]] is a higher performant [[Streamline]] [[STM32]] [[MCU]] board build around a [[STM32H723]].&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
|'''MCU'''&lt;br /&gt;
|STM32H723VE&lt;br /&gt;
|-&lt;br /&gt;
|'''Flash'''&lt;br /&gt;
|512kB&lt;br /&gt;
|-&lt;br /&gt;
|'''RAM'''&lt;br /&gt;
|564kB&lt;br /&gt;
|-&lt;br /&gt;
|'''Crystal'''&lt;br /&gt;
|16MHz&lt;br /&gt;
|-&lt;br /&gt;
|'''LED'''&lt;br /&gt;
|PC13 (open drain)&lt;br /&gt;
|-&lt;br /&gt;
|'''Button'''&lt;br /&gt;
|Boot0/PA14 (pulled down)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Schematics ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Sl mcu stm32h723.svg|2400px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Errata ==&lt;br /&gt;
&lt;br /&gt;
=== Rev. A ===&lt;br /&gt;
&lt;br /&gt;
On rev. A, the Boot0 button as well as being routed correctly to boot0 was routed to &lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_top_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_top_right_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_top_left_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_bot_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_bot_right_render.png&lt;br /&gt;
File:sl_mcu_stm32h723-rev_A_bot_left_render.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.st.com/resource/en/datasheet/stm32h723ve.pdf Datasheet]&lt;br /&gt;
* [https://www.st.com/resource/en/reference_manual/rm0468-stm32h723733-stm32h725735-and-stm32h730-value-line-advanced-armbased-32bit-mcus-stmicroelectronics.pdf STM32H723/725/730/733/735 Reference Manual]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_SPI-Ethernet&amp;diff=8738</id>
		<title>Streamline SPI-Ethernet</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_SPI-Ethernet&amp;diff=8738"/>
		<updated>2026-10-24T00:16:31Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Streamline]][[Category:CurrentMakers]][[Category:Streamline Blade]][[Category:Work in progress]]{{metadesc|Streamline SPI-Ethernet Blade}}&lt;br /&gt;
[[File:Streamline_ethernet_top_left_render.png|400px|thumb|Streamline Ethernet port]]&lt;br /&gt;
[[Streamline Ethernet]] is an Ethernet port using [[W5500]] SPI-to-Ethernet chip from Wiznet.&lt;br /&gt;
{{clear}}&lt;br /&gt;
== Schematics ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Streamline_seth.svg|1800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Streamline Connections == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:W5500 Connections.png|700px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Streamline_seth_top_left_render.png&lt;br /&gt;
File:Streamline_seth_top_render.png&lt;br /&gt;
File:Streamline_seth_top_right_render.png&lt;br /&gt;
File:Streamline_seth_bot_render.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous links ==&lt;br /&gt;
* [[:File:W5500_ds_v110e.pdf|W5500 Datasheet]]&lt;br /&gt;
* [https://docs.wiznet.io/Product/Chip/Ethernet/W5500 W5500 Product page]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=File:W5500_Connections.png&amp;diff=8737</id>
		<title>File:W5500 Connections.png</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=File:W5500_Connections.png&amp;diff=8737"/>
		<updated>2026-10-24T00:16:09Z</updated>

		<summary type="html">&lt;p&gt;Lth: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=I2C_Fast_Mode_PLUS&amp;diff=8736</id>
		<title>I2C Fast Mode PLUS</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=I2C_Fast_Mode_PLUS&amp;diff=8736"/>
		<updated>2026-10-23T02:31:20Z</updated>

		<summary type="html">&lt;p&gt;Lth: Created page with &amp;quot;{{Video |series=STM32 Short Video |number=16 |title=I2C Fast Mode PLUS |youtube-id=oPXSaPWdWnA |description=In this video we are going to use a STM32H723 to run I2C in Fast Mo...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Video&lt;br /&gt;
|series=STM32 Short Video&lt;br /&gt;
|number=16&lt;br /&gt;
|title=I2C Fast Mode PLUS&lt;br /&gt;
|youtube-id=oPXSaPWdWnA&lt;br /&gt;
|description=In this video we are going to use a STM32H723 to run I2C in Fast Mode Plus (1 Mbps).&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=External_and_Timer_Interrupts&amp;diff=8718</id>
		<title>External and Timer Interrupts</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=External_and_Timer_Interrupts&amp;diff=8718"/>
		<updated>2026-10-20T06:51:15Z</updated>

		<summary type="html">&lt;p&gt;Lth: Created page with &amp;quot;{{Video |series=STM32 Remake Video |number=4 |title=External and Timer Interrupts |youtube-id=g_MSOaPuJvM |description=2026 Remake of STM32 Tutorial #6 covering STM32 Interrup...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Video&lt;br /&gt;
|series=STM32 Remake Video&lt;br /&gt;
|number=4&lt;br /&gt;
|title=External and Timer Interrupts&lt;br /&gt;
|youtube-id=g_MSOaPuJvM&lt;br /&gt;
|description=2026 Remake of STM32 Tutorial #6 covering STM32 Interrupts.  We will cover both external interrupts (EXTI) and TImer Interrupts.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Raspberry_Pi_Pico&amp;diff=8717</id>
		<title>Raspberry Pi Pico</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Raspberry_Pi_Pico&amp;diff=8717"/>
		<updated>2026-10-16T01:47:23Z</updated>

		<summary type="html">&lt;p&gt;Lth: /* Miscellaneous Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Raspberry Pi Pico]][[File:Third party RP2350 Board w. USB-C.jpg|thumb|300px|Third party RP2350 board w. USB-C]]&lt;br /&gt;
The [[Raspberry Pi Pico]] is a [[Category:Development Board|Development Board]] based upon either the [[RP2040]] or the [[RP2350]] [[MCU]].&lt;br /&gt;
&lt;br /&gt;
== Video ==&lt;br /&gt;
&lt;br /&gt;
We created a separate channel for [[RP2350]] related video: [https://youtube.com/@RPPicoWorld https://youtube.com/@RPPicoWorld]&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|7JMziWYkwSg}}&lt;br /&gt;
&lt;br /&gt;
== MCU Variants ==&lt;br /&gt;
&lt;br /&gt;
=== RP2040 ===&lt;br /&gt;
&lt;br /&gt;
To be added&lt;br /&gt;
&lt;br /&gt;
=== RP2350 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Raspberry-Pi-RP2350-Block-Diagram.jpg|1200px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:RP2350 Block Diagram.jpg|1000px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK ==&lt;br /&gt;
&lt;br /&gt;
The SDK is available at [https://github.com/raspberrypi/pico-sdk Github].  To use, the easiest approach is to clone this repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --recursive git@github.com:raspberrypi/pico-sdk.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== USB Flashing ==&lt;br /&gt;
&lt;br /&gt;
The [[Raspberry Pi Pico]] is equipped with a [[Micro-USB]] connector and it can be flashed with simple drag and drop.&lt;br /&gt;
&lt;br /&gt;
== Picoprobe == &lt;br /&gt;
&lt;br /&gt;
The [[Raspberry Pi Pico]]&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/STM32World/stm32fun_pico STM32World RP2350 Examples]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/RP2040 Wikipedia article on R{2040]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/RP2350 Wikipedia article on RP2350]&lt;br /&gt;
* [https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf RP2040 Datasheet]&lt;br /&gt;
* [https://stm32world.com/images/3/3c/RP-008373-DS-2-rp2350-datasheet.pdf RP2350 Datasheet]&lt;br /&gt;
* [https://stm32world.com/images/c/c2/RP-008280-DS-2-hardware-design-with-rp2350.pdf Hardware Design with RP2350]&lt;br /&gt;
* [https://datasheets.raspberrypi.com/pico/pico-datasheet.pdf Raspberry Pi Pico Datasheet]&lt;br /&gt;
* [https://datasheets.raspberrypi.com/rp2040/hardware-design-with-rp2040.pdf Hardware Design with RP2040]&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=File:RP-008280-DS-2-hardware-design-with-rp2350.pdf&amp;diff=8716</id>
		<title>File:RP-008280-DS-2-hardware-design-with-rp2350.pdf</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=File:RP-008280-DS-2-hardware-design-with-rp2350.pdf&amp;diff=8716"/>
		<updated>2026-10-16T01:46:23Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_MCU_RP2354&amp;diff=8715</id>
		<title>Streamline MCU RP2354</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_MCU_RP2354&amp;diff=8715"/>
		<updated>2026-10-15T00:21:30Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:RP2350]][[Category:Streamline]][[Category:Streamline Blade]]{{metadesc|RP2354 Streamline MCU board documentation}}&lt;br /&gt;
[[File:Streamline RP2350 setup - top left.jpg|350px|thumb|Streamline backplane with Connect and MCU RP2354]]&lt;br /&gt;
The [[Streamline MCU RP2354]] is a basic [[Streamline]] [[RP2354]] [[MCU]] board build around a [[RP2354]].&lt;br /&gt;
&lt;br /&gt;
The [[Streamline]] backplane pin mapping was originally build around 100-pin [[STM32]] [[MCU]]s, so fitting that to [[RP2350]] took some juggling.  See:&lt;br /&gt;
&lt;br /&gt;
* [[Streamline Header Mapping]]&lt;br /&gt;
* [[Streamline Peripheral Pin Mapping]]&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== Videos == &lt;br /&gt;
&lt;br /&gt;
In order not to &amp;quot;pollute&amp;quot; the STM32World channel, we made another channel for RP2350 stuff.  You can access this channel here: [https://www.youtube.com/@RPPicoWorld/videos https://www.youtube.com/@RPPicoWorld].&lt;br /&gt;
&lt;br /&gt;
One of the first videos using the [[Streamline MCU RP2354]]: &lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|z-0-4W92aTU}}&lt;br /&gt;
&lt;br /&gt;
== Schematics ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:sl_mcu_rp2354.svg|2000px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Errata ==&lt;br /&gt;
&lt;br /&gt;
The [[Streamline MCU RP2354]] has gone through a number of revisions.  The current version is rev. D.&lt;br /&gt;
&lt;br /&gt;
=== Rev. D ===&lt;br /&gt;
&lt;br /&gt;
One mistake was made with the onboard LED.  It is connected to the PC13 pin on the header but it is '''not''' connected to the MCU.  This is easily fixed with a jumper on the header - like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Rev D Fix 3.jpg|600px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Rev D Fix 1.jpg&lt;br /&gt;
File:Rev D Fix 2.jpg&lt;br /&gt;
File:Rev D Fix 3.jpg&lt;br /&gt;
File:Rev D Fix 4.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:sl_mcu_rp2354_top_right_render.png&lt;br /&gt;
File:sl_mcu_rp2354_top_render.png&lt;br /&gt;
File:sl_mcu_rp2354_top_left_render.png&lt;br /&gt;
File:sl_mcu_rp2354_bot_render.png&lt;br /&gt;
File:Streamline RP2350 setup - top left.jpg&lt;br /&gt;
File:Streamline RP2350 setup - top right.jpg&lt;br /&gt;
File:Streamline RP2350 setup - top right 2.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=STM32World_Legacy&amp;diff=8713</id>
		<title>STM32World Legacy</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=STM32World_Legacy&amp;diff=8713"/>
		<updated>2026-10-12T13:50:16Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:STM32World]][[Category:Work in progress]]{{metadesc|STM32World Development Boards Home}}&lt;br /&gt;
[[File:mcu board 3d.png|thumb|200px]]&lt;br /&gt;
Notice, [[STM32World]] is no longer under active development.  Check [[Streamline]] instead.&lt;br /&gt;
&lt;br /&gt;
[[STM32World]] is a series of development boards designed for rapid development and prototyping.&lt;br /&gt;
&lt;br /&gt;
The idea is to have MCU boards available with multiple MCU's (possibly including non [[ST]] ones such as the ones from [[GigaDevice]]).&lt;br /&gt;
&lt;br /&gt;
The boards will be stackable but rather than trying to cram every single imaginable peripheral device into every board, these will be deliberately kept simple.  A CAN transceiver board will include a CAN transceiver and nothing else.&lt;br /&gt;
&lt;br /&gt;
As much as possible, peripheral board will be designed in such a way that they will not conflict with each other, even though this might not be possible to achieve 100 %.&lt;br /&gt;
&lt;br /&gt;
All files for hardware and software is available at [https://github.com/STM32World STM32World Github Repository]&lt;br /&gt;
&lt;br /&gt;
== Why? ==&lt;br /&gt;
&lt;br /&gt;
There are a gazillion [[STM32]] development boards available on the market.  A very reasonable question would be: &amp;quot;Why create another one?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In general development boards fall into two different categories:&lt;br /&gt;
&lt;br /&gt;
# Simple boards such as the common [[Blue Pill]] and [[Black Pill]] boards&lt;br /&gt;
# Complex boards such as most of [[ST]]'s Nucleo and Discovery boards&lt;br /&gt;
&lt;br /&gt;
The problem with the simple boards is that you have a very limited selection of [[MCU]]s and you end up with a ratnest of jumper wires.&lt;br /&gt;
&lt;br /&gt;
The problem with the complex boards is that they are too opinionated.  I have a [[STM32F405]] based discovery board and that one includes a complex audio part, which I have never needed nor used.&lt;br /&gt;
&lt;br /&gt;
== [[STM32World Form Factor|Form Factor]] ==&lt;br /&gt;
&lt;br /&gt;
[[STM32World]] boards are meant to be stackable.&lt;br /&gt;
&lt;br /&gt;
All boards are 3&amp;quot; x 2&amp;quot;.  In many cases this is much bigger than needed but PCB's are cheap and having the boards at that size makes layout much easier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:STM32World Board Dimensions.png|800px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The choice of imperial size of the PCB's themselves were mainly made due to the header being 100 mil spaced pins.&lt;br /&gt;
&lt;br /&gt;
== Planned Boards ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! Name&lt;br /&gt;
! Type&lt;br /&gt;
! Description &lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| [[File:MCUSTM32F405 3D Top View.png|200px]]&lt;br /&gt;
| [[MCUSTM32F405]] &lt;br /&gt;
| MCU&lt;br /&gt;
| MCU Board using the [[STM32F405]] [[MCU]]&lt;br /&gt;
| Prototype&lt;br /&gt;
|-&lt;br /&gt;
| [[File:MCUSTM32F405 3D Top View.png|200px]]&lt;br /&gt;
| [[MCUSTM32F402]] &lt;br /&gt;
| MCU&lt;br /&gt;
| MCU Board using the [[STM32F402]] [[MCU]]&lt;br /&gt;
| Under development&lt;br /&gt;
|-&lt;br /&gt;
| [[File:PRGSTL 3D Top View.png|200px]]&lt;br /&gt;
| [[PRGSTL]]&lt;br /&gt;
| Programmer&lt;br /&gt;
| Board designed like a [[ST-Link|ST-Link/V2.1]] or a [[Black Magic Probe]] device&lt;br /&gt;
| Prototype&lt;br /&gt;
|-&lt;br /&gt;
| [[File:MEMW25Q128 3D Top View rendering.png|200px]]&lt;br /&gt;
| [[MEMW25Q128]]&lt;br /&gt;
| Storage&lt;br /&gt;
| [[W25Qxx|W25Q128]] SPI Serial Flash&lt;br /&gt;
| Prototype&lt;br /&gt;
|-&lt;br /&gt;
| [[File:MEM24CXX Rendering Top.png|200px]]&lt;br /&gt;
| [[MEM24CXX]]&lt;br /&gt;
| Storage&lt;br /&gt;
| [[24Cxx I²C EEPROM]]&lt;br /&gt;
| Prototype&lt;br /&gt;
|-&lt;br /&gt;
| [[File:proto_top_rendering.png|200px]]&lt;br /&gt;
| [[PROTO]]&lt;br /&gt;
| Prototyping&lt;br /&gt;
| Prototyping board&lt;br /&gt;
| Prototype&lt;br /&gt;
|-&lt;br /&gt;
| [[File:CAN Rendering - top view.png|200px]]&lt;br /&gt;
| [[CANTRANS]]&lt;br /&gt;
| Tranceiver&lt;br /&gt;
| Dual CAN Transceiver&lt;br /&gt;
| Prototype&lt;br /&gt;
|-&lt;br /&gt;
| [[File:STWSD Top Rendering.png|200px]]&lt;br /&gt;
| [[STWSD]]&lt;br /&gt;
| SD Card&lt;br /&gt;
| SD Card breakout&lt;br /&gt;
| Under development&lt;br /&gt;
|-&lt;br /&gt;
| [[File:DWS2812 Top Rendering.png|200px]]&lt;br /&gt;
| [[DWS2812]]&lt;br /&gt;
| Display&lt;br /&gt;
| [[WS2812B]] RGB LED Array&lt;br /&gt;
| Under development&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Board Ideas ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! Name&lt;br /&gt;
! Type&lt;br /&gt;
! Description &lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| [[File:MCUSTM32F411 3D Top View.png|200px]]&lt;br /&gt;
| [[MCUSTM32F411]] &lt;br /&gt;
| MCU&lt;br /&gt;
| MCU Board using the [[STM32F411]] [[MCU]]&lt;br /&gt;
| Under development&lt;br /&gt;
|-&lt;br /&gt;
| [[File:MCUSTM32F446 3D rendering - top view.png|200px]]&lt;br /&gt;
| [[MCUSTM32F446]] &lt;br /&gt;
| MCU&lt;br /&gt;
| MCU Board using the [[STM32F446]] [[MCU]]&lt;br /&gt;
| Ready for prototype&lt;br /&gt;
|-&lt;br /&gt;
| [[File:MCUSTM32F103 3D Top View.png|200px]]&lt;br /&gt;
| [[MCUSTM32F103]] &lt;br /&gt;
| MCU&lt;br /&gt;
| MCU Board using the [[STM32F103]] [[MCU]]&lt;br /&gt;
| Under development&lt;br /&gt;
|-&lt;br /&gt;
| [[File:MCUSTM32F405 3D Top View.png|200px]]&lt;br /&gt;
| [[MCUGD32F405]]&lt;br /&gt;
| MCU&lt;br /&gt;
| MCU Board using the [[GD32F405]] [[MCU]]&lt;br /&gt;
| Under development&lt;br /&gt;
|-&lt;br /&gt;
|[[File:IOAW9523 3D Top View rendering.png|200px]]&lt;br /&gt;
| [[IOAW9523]]&lt;br /&gt;
| I/O&lt;br /&gt;
| [[I²C]] [[AW9523B GPIO Expander|AW9523]] based GPIO Expander and LED driver&lt;br /&gt;
| Under development&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[HID01]]&lt;br /&gt;
| Display/Keyboard&lt;br /&gt;
| Display and touch keyboard&lt;br /&gt;
| Under development&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[SEC01]]&lt;br /&gt;
| Security&lt;br /&gt;
| Security and Encryption&lt;br /&gt;
| Under development&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pin Use ==&lt;br /&gt;
&lt;br /&gt;
The [[STM32]] processors are not 100 % flexible in mapping I/O pins, so certain peripherals can only be mapped to certain pins.  Because of that, some of our board will conflict with each other.&lt;br /&gt;
&lt;br /&gt;
{{STM32World Pinout}}&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:3 STM32World Modules - backside.jpg&lt;br /&gt;
File:3 STM32World Modules stacked 2.jpg&lt;br /&gt;
File:3 STM32World Modules stacked.jpg&lt;br /&gt;
File:3 STM32World Modules with headers.jpg&lt;br /&gt;
File:3 STM32World Modules.jpg&lt;br /&gt;
File:MCUSTM32F405 and MEMW25Q128.jpg&lt;br /&gt;
File:MCUSTM32F405 angle.jpg&lt;br /&gt;
File:MCUSTM32F405 Bot.jpg&lt;br /&gt;
File:MCUSTM32F405 Top.jpg&lt;br /&gt;
File:MCUSTM32F405 with headers.jpg&lt;br /&gt;
File:MEMW25Q128 Bot.jpg&lt;br /&gt;
File:MEMW25Q128 wiith headers.jpg&lt;br /&gt;
File:MEMW25Q128 Top.jpg&lt;br /&gt;
File:PRGSTL and MCUSTM32F405.jpg&lt;br /&gt;
File:PRGSTL Bot.jpg&lt;br /&gt;
File:PRGSTL Side.jpg&lt;br /&gt;
File:PRGSTL Top.jpg&lt;br /&gt;
File:PRGSTL with headers.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=PRGSTL&amp;diff=8712</id>
		<title>PRGSTL</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=PRGSTL&amp;diff=8712"/>
		<updated>2026-10-12T13:49:00Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:STM32World]][[Category:Work in progress]]{{metadesc|STM32World Programmer}}&lt;br /&gt;
NOTICE!  The [[STM32World]] modules are no longer being developed.  Check [[Streamline]] instead, - more specifically the [[Streamline Connect]].&lt;br /&gt;
&lt;br /&gt;
[[PRGSTL]] is a programmer, that is Flashing and Debugging, for the [[STM32World]] [[:Category:STM32World MCU|MCU]] modules.&lt;br /&gt;
&lt;br /&gt;
== Schematics ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:prgstl rev a.svg]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Unfortunately [[ST]]'s [[ST-Link]] firmware is not open source, so we can not distribute the [[PRGSTL]] modules pre-programmed.  Instead, we deliver the [[PRGSTL]] module with a [[DFU]] bootloader, so that it can itself be flashed over USB.&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:PRGSTL Bot.jpg&lt;br /&gt;
File:PRGSTL Side.jpg&lt;br /&gt;
File:PRGSTL Top.jpg&lt;br /&gt;
File:PRGSTL with headers.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=PRGSTL&amp;diff=8711</id>
		<title>PRGSTL</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=PRGSTL&amp;diff=8711"/>
		<updated>2026-10-12T13:47:36Z</updated>

		<summary type="html">&lt;p&gt;Lth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:STM32World]][[Category:Work in progress]]{{metadesc|STM32World Programmer}}&lt;br /&gt;
NOTICE!  The [[STM32World]] modules are no longer being developed.  Check [[Streamline]] instead.&lt;br /&gt;
&lt;br /&gt;
[[PRGSTL]] is a programmer, that is Flashing and Debugging, for the [[STM32World]] [[:Category:STM32World MCU|MCU]] modules.&lt;br /&gt;
&lt;br /&gt;
== Schematics ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:prgstl rev a.svg]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Unfortunately [[ST]]'s [[ST-Link]] firmware is not open source, so we can not distribute the [[PRGSTL]] modules pre-programmed.  Instead, we deliver the [[PRGSTL]] module with a [[DFU]] bootloader, so that it can itself be flashed over USB.&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:PRGSTL Bot.jpg&lt;br /&gt;
File:PRGSTL Side.jpg&lt;br /&gt;
File:PRGSTL Top.jpg&lt;br /&gt;
File:PRGSTL with headers.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=STM32_In-circuit_Debugging&amp;diff=8710</id>
		<title>STM32 In-circuit Debugging</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=STM32_In-circuit_Debugging&amp;diff=8710"/>
		<updated>2026-10-12T11:33:08Z</updated>

		<summary type="html">&lt;p&gt;Lth: Created page with &amp;quot;{{Video |series=STM32 Remake Video |number=3 |title=STM32 In-circuit Debugging |youtube-id=S9w6YEkzf-k |description=2026 Remake of STM32 Tutorial #5 covering STM32 in-circuit...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Video&lt;br /&gt;
|series=STM32 Remake Video&lt;br /&gt;
|number=3&lt;br /&gt;
|title=STM32 In-circuit Debugging&lt;br /&gt;
|youtube-id=S9w6YEkzf-k&lt;br /&gt;
|description=2026 Remake of STM32 Tutorial #5 covering STM32 in-circuit debugging.  We will cover Serial print, SWD and SWO.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lth</name></author>
	</entry>
</feed>