<?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=Niclas</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=Niclas"/>
	<link rel="alternate" type="text/html" href="https://stm32world.com/wiki/Special:Contributions/Niclas"/>
	<updated>2026-05-09T14:14:54Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.0</generator>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Runtime&amp;diff=7521</id>
		<title>Colibri Runtime</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Runtime&amp;diff=7521"/>
		<updated>2026-05-09T09:35:23Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Colibri Runtime is the custom firmware that is running on Colibri MCUs, an application in [[Colibri Zephyr]] orchestrating the hardware resources, WebAssembly engines with I/O drivers and user programs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Development == &lt;br /&gt;
[[Colibri EEPROM Layout]]&lt;br /&gt;
&lt;br /&gt;
[[Colibri WebAssembly Notes]]&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Runtime&amp;diff=7520</id>
		<title>Colibri Runtime</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Runtime&amp;diff=7520"/>
		<updated>2026-05-09T09:35:12Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Colibri Runtime is the custom firmware that is running on Colibri MCUs, an application in [[Colibri Zephyr]] orchestrating the hardware resources, WebAssembly engines with I/O drivers and user programs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Development == &lt;br /&gt;
[[Colibri EEPROM Layout]]&lt;br /&gt;
[[Colibri WebAssembly Notes]]&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_EEPROM_Layout&amp;diff=7519</id>
		<title>Colibri EEPROM Layout</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_EEPROM_Layout&amp;diff=7519"/>
		<updated>2026-05-09T09:32:26Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Memory Layout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All the Colibri I/O modules come with a 1Mbit EEPROM on board, that serves to store a few different things;&lt;br /&gt;
&lt;br /&gt;
* Vendor, Model and Revision of 'this' board.&lt;br /&gt;
* Calibration parameters needed to compensate for hardware tolerances.&lt;br /&gt;
* Test report (if any) from factory.&lt;br /&gt;
* The ''driver(s)'' (i.e. code) of the board, to be executed in the MCU module on behalf of the board.&lt;br /&gt;
* Any additional parameters, configuration that should survive over time.&lt;br /&gt;
* Any storage space an on-module co-MCU needs.&lt;br /&gt;
&lt;br /&gt;
= Memory Layout =&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Length&lt;br /&gt;
! Description &lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Contains the value 0xdeadbabe to indicate that it has been initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| Serial Number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 8&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 4&lt;br /&gt;
| Vendor ID, according to table below.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 4&lt;br /&gt;
| Vendor Model identifier. This is specific to each vendor. Vendors are encouraged to add their tables on this page.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0018&lt;br /&gt;
| 4&lt;br /&gt;
| Vendor Hardware Revision, where revision 'A' is written as 0x00000041 and revision 'AC' is 0x00004341 &lt;br /&gt;
|-&lt;br /&gt;
| 0x001c&lt;br /&gt;
| 4&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0020&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Vendor name, in ASCII.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0024&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Vendor name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0028&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Model name, in ASCII.&lt;br /&gt;
|-&lt;br /&gt;
| 0x002c&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Model name.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0030&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Product Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x0034&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Product Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x0038&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Documentation Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x003c&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Documentation Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 4&lt;br /&gt;
| Size of ARM PIC (Position Independent Code).&lt;br /&gt;
|-&lt;br /&gt;
| 0x0044&lt;br /&gt;
| 60&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0080&lt;br /&gt;
| 128&lt;br /&gt;
| Calibration data, see each I/O module for details&lt;br /&gt;
|-&lt;br /&gt;
| 0x0100&lt;br /&gt;
| 256&lt;br /&gt;
| Test Reports, see each I/O module for details&lt;br /&gt;
|-&lt;br /&gt;
| 0x0200&lt;br /&gt;
| 2048&lt;br /&gt;
| Text area. Links points to here, i.e. Vendor name, model name, documentation link and product link.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A00&lt;br /&gt;
| 1536&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 12288&lt;br /&gt;
| Vendor area&lt;br /&gt;
|-&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 8192&lt;br /&gt;
| Driver software/code. ARM PIC&lt;br /&gt;
|-&lt;br /&gt;
| 0x6000&lt;br /&gt;
| 40960&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 65536&lt;br /&gt;
| Reserved for co-MCU on I/O module, or vendor defined.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Vendor ID =&lt;br /&gt;
Contact us at info@currentmakers.com if you have products you want added.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|-&lt;br /&gt;
! ID&lt;br /&gt;
! Company&lt;br /&gt;
! Webpage&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| CurrentMakers&lt;br /&gt;
| https://currentmakers.com&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_EEPROM_Layout&amp;diff=7518</id>
		<title>Colibri EEPROM Layout</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_EEPROM_Layout&amp;diff=7518"/>
		<updated>2026-05-09T09:16:24Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Memory Layout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All the Colibri I/O modules come with a 1Mbit EEPROM on board, that serves to store a few different things;&lt;br /&gt;
&lt;br /&gt;
* Vendor, Model and Revision of 'this' board.&lt;br /&gt;
* Calibration parameters needed to compensate for hardware tolerances.&lt;br /&gt;
* Test report (if any) from factory.&lt;br /&gt;
* The ''driver(s)'' (i.e. code) of the board, to be executed in the MCU module on behalf of the board.&lt;br /&gt;
* Any additional parameters, configuration that should survive over time.&lt;br /&gt;
* Any storage space an on-module co-MCU needs.&lt;br /&gt;
&lt;br /&gt;
= Memory Layout =&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Length&lt;br /&gt;
! Description &lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Contains the value 0xdeadbabe to indicate that it has been initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| Serial Number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 8&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 4&lt;br /&gt;
| Vendor ID, according to table below.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 4&lt;br /&gt;
| Vendor Model identifier. This is specific to each vendor. Vendors are encouraged to add their tables on this page.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0018&lt;br /&gt;
| 4&lt;br /&gt;
| Vendor Hardware Revision, where revision 'A' is written as 0x00000041 and revision 'AC' is 0x00004341 &lt;br /&gt;
|-&lt;br /&gt;
| 0x001c&lt;br /&gt;
| 4&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0020&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Vendor name, in ASCII.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0024&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Vendor name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0028&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Model name, in ASCII.&lt;br /&gt;
|-&lt;br /&gt;
| 0x002c&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Model name.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0030&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Product Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x0034&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Product Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x0038&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Documentation Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x003c&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Documentation Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 4&lt;br /&gt;
| Size of ARM PIC (Position Independent Code).&lt;br /&gt;
|-&lt;br /&gt;
| 0x0044&lt;br /&gt;
| 60&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0080&lt;br /&gt;
| 128&lt;br /&gt;
| Calibration data, see each I/O module for details&lt;br /&gt;
|-&lt;br /&gt;
| 0x0100&lt;br /&gt;
| 256&lt;br /&gt;
| Test Reports, see each I/O module for details&lt;br /&gt;
|-&lt;br /&gt;
| 0x0200&lt;br /&gt;
| 2048&lt;br /&gt;
| Text area. Links points to here, i.e. Vendor name, model name, documentation link and product link.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A00&lt;br /&gt;
| 1536&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 12288&lt;br /&gt;
| Vendor area&lt;br /&gt;
|-&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 8192&lt;br /&gt;
| Driver software/code. ARM PIC&lt;br /&gt;
|-&lt;br /&gt;
| 0x6000&lt;br /&gt;
| 40960&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 65536&lt;br /&gt;
| Reserved for co-MCU on I/O module, or vendor defined.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_EEPROM_Layout&amp;diff=7517</id>
		<title>Colibri EEPROM Layout</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_EEPROM_Layout&amp;diff=7517"/>
		<updated>2026-05-09T07:08:13Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Memory Layout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All the Colibri I/O modules come with a 1Mbit EEPROM on board, that serves to store a few different things;&lt;br /&gt;
&lt;br /&gt;
* Vendor, Model and Revision of 'this' board.&lt;br /&gt;
* Calibration parameters needed to compensate for hardware tolerances.&lt;br /&gt;
* Test report (if any) from factory.&lt;br /&gt;
* The ''driver(s)'' (i.e. code) of the board, to be executed in the MCU module on behalf of the board.&lt;br /&gt;
* Any additional parameters, configuration that should survive over time.&lt;br /&gt;
* Any storage space an on-module co-MCU needs.&lt;br /&gt;
&lt;br /&gt;
= Memory Layout =&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Length&lt;br /&gt;
! Description &lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Contains the value 0xdeadbabe to indicate that it has been initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 12&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 4&lt;br /&gt;
| Vendor ID, according to table below.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 4&lt;br /&gt;
| Vendor Model identifier. This is specific to each vendor. Vendors are encouraged to add their tables on this page.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0018&lt;br /&gt;
| 4&lt;br /&gt;
| Vendor Hardware Revision, where revision 'A' is written as 0x00000041 and revision 'AC' is 0x00004341 &lt;br /&gt;
|-&lt;br /&gt;
| 0x001c&lt;br /&gt;
| 4&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0020&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Vendor name, in ASCII.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0024&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Vendor name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0028&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Model name, in ASCII.&lt;br /&gt;
|-&lt;br /&gt;
| 0x002c&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Model name.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0030&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Product Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x0034&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Product Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x0038&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Documentation Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x003c&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Documentation Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 4&lt;br /&gt;
| Size of ARM PIC (Position Independent Code).&lt;br /&gt;
|-&lt;br /&gt;
| 0x0044&lt;br /&gt;
| 60&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0080&lt;br /&gt;
| 128&lt;br /&gt;
| Calibration data, see each I/O module for details&lt;br /&gt;
|-&lt;br /&gt;
| 0x0100&lt;br /&gt;
| 256&lt;br /&gt;
| Test Reports, see each I/O module for details&lt;br /&gt;
|-&lt;br /&gt;
| 0x0200&lt;br /&gt;
| 2048&lt;br /&gt;
| Text area. Links points to here, i.e. Vendor name, model name, documentation link and product link.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A00&lt;br /&gt;
| 1536&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 12288&lt;br /&gt;
| Vendor area&lt;br /&gt;
|-&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 8192&lt;br /&gt;
| Driver software/code. ARM PIC&lt;br /&gt;
|-&lt;br /&gt;
| 0x6000&lt;br /&gt;
| 40960&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 65536&lt;br /&gt;
| Reserved for co-MCU on I/O module, or vendor defined.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_EEPROM_Layout&amp;diff=7516</id>
		<title>Colibri EEPROM Layout</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_EEPROM_Layout&amp;diff=7516"/>
		<updated>2026-05-09T06:57:13Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Memory Layout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All the Colibri I/O modules come with a 1Mbit EEPROM on board, that serves to store a few different things;&lt;br /&gt;
&lt;br /&gt;
* Vendor, Model and Revision of 'this' board.&lt;br /&gt;
* Calibration parameters needed to compensate for hardware tolerances.&lt;br /&gt;
* Test report (if any) from factory.&lt;br /&gt;
* The ''driver(s)'' (i.e. code) of the board, to be executed in the MCU module on behalf of the board.&lt;br /&gt;
* Any additional parameters, configuration that should survive over time.&lt;br /&gt;
* Any storage space an on-module co-MCU needs.&lt;br /&gt;
&lt;br /&gt;
= Memory Layout =&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Length&lt;br /&gt;
! Description &lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Contains the value 0xdeadbabe to indicate that it has been initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 12&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 4&lt;br /&gt;
| Vendor ID, according to table below.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 4&lt;br /&gt;
| Vendor Model identifier. This is specific to each vendor. Vendors are encouraged to add their tables on this page.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0018&lt;br /&gt;
| 4&lt;br /&gt;
| Vendor Hardware Revision, where revision 'A' is written as 0x00000041 and revision 'AC' is 0x00004341 &lt;br /&gt;
|-&lt;br /&gt;
| 0x001c&lt;br /&gt;
| 4&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0020&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Vendor name, in ASCII.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0024&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Vendor name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0028&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Model name, in ASCII.&lt;br /&gt;
|-&lt;br /&gt;
| 0x002c&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Model name.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0030&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Product Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x0034&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Product Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x0038&lt;br /&gt;
| 4&lt;br /&gt;
| Pointer to Documentation Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x003c&lt;br /&gt;
| 4&lt;br /&gt;
| Length of Documentation Link&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 4&lt;br /&gt;
| Size of ARM PIC (Position Independent Code).&lt;br /&gt;
|-&lt;br /&gt;
| 0x0044&lt;br /&gt;
| 60&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0080&lt;br /&gt;
| 128&lt;br /&gt;
| Calibration data, see each I/O module for details&lt;br /&gt;
|-&lt;br /&gt;
| 0x0100&lt;br /&gt;
| 256&lt;br /&gt;
| Test Reports, see each I/O module for details&lt;br /&gt;
|-&lt;br /&gt;
| 0x0200&lt;br /&gt;
| 1536&lt;br /&gt;
| Text area. Links points to here, i.e. Vendor name, model name, documentation link and product link.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0800&lt;br /&gt;
| 2048&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 12288&lt;br /&gt;
| Vendor area&lt;br /&gt;
|-&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 8192&lt;br /&gt;
| Driver software/code. ARM PIC&lt;br /&gt;
|-&lt;br /&gt;
| 0x6000&lt;br /&gt;
| 40960&lt;br /&gt;
| Reserved for future use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 65536&lt;br /&gt;
| Reserved for co-MCU on I/O module, or vendor defined.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Programming_Languages&amp;diff=7515</id>
		<title>Colibri Programming Languages</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Programming_Languages&amp;diff=7515"/>
		<updated>2026-05-09T06:33:40Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* zeptoforth */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= zeptoforth =&lt;br /&gt;
&lt;br /&gt;
[[zeptoforth]] is a possible programming language for the Colibri family. Each I/O module will contain the source code for its own usage, meaning that the MCU's firmware doesn't need updating when new I/O modules are available and installed.&lt;br /&gt;
&lt;br /&gt;
Forth is a unique programming language and some people are very unhappy with it, and hence we will try to support additional programming languages to the best of our abilities.&lt;br /&gt;
&lt;br /&gt;
= MicroPython =&lt;br /&gt;
[[MicroPython]] is a rather large environment, and it will be challenging (or even impossible) to squeeze it into some of the MCUs (such as MCU1 with the LoraWAN stack).&lt;br /&gt;
&lt;br /&gt;
= Lua =&lt;br /&gt;
[[Lua]] is a  neat little language that is easily embeddable in any C hosted (and other) environment. The flash memory footprint is said to be in the 100-200kB range.&lt;br /&gt;
&lt;br /&gt;
= C++ - Arduino =&lt;br /&gt;
Since we are using most STM32 MCUs, and practically every MCU marketed at the Maker community is supporting the Arduino approach. Now, the recent acquisition of Arduino by Qualcomm might lead to a decline in the platoform's popularity, and CurrentMakers is too small to invest resources in this uncertainty. The only reason to use Arduino software platform is because of its incredible popularity.&lt;br /&gt;
&lt;br /&gt;
= C - STM32Cube HAL / Bare-metal =&lt;br /&gt;
It is of course very possible to implement a software stack for Colibri using C. Libraries for peripheral access is readily available, or it is quite easy to implement in bare metal programming, see STM32World's [[https://www.youtube.com/playlist?list=PLVfOnriB1RjUO4qv9lQcYVliGpt8T3gOR bare metal video series]].&lt;br /&gt;
&lt;br /&gt;
= OpenPLC =&lt;br /&gt;
[https://autonomylogic.com/ OpenPLC] (from a company called Autonomy) is an interesting choice, especially for PLC professionals. It allows for [https://en.wikipedia.org/wiki/IEC_61131-3 IEC 61131-3 standard] programs to be compiled to C and flashed into MCUs. It supports some STM32, ESP32 and RP2350 (external Flash). It is quite likely it is not too difficult to make this work.&lt;br /&gt;
&lt;br /&gt;
= WebAssembly =&lt;br /&gt;
WebAssembly is a kind of runtime sandbox with a well-defined instruction set and memory model. Many languages can be compiled to WebAssembly with the LLVM project. The main advantage to pull this off would be to have a stable runtime on the MCU and &amp;quot;upload&amp;quot; user programs without flashing a binary. What to compile ''from'' would still be up for debate.&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_WebAssembly_Notes&amp;diff=7511</id>
		<title>Colibri WebAssembly Notes</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_WebAssembly_Notes&amp;diff=7511"/>
		<updated>2026-05-07T04:02:09Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Various notes, investigations and other useful information that might be needed later.&lt;br /&gt;
&lt;br /&gt;
= WASM3 peculiarity = &lt;br /&gt;
I am loading 8 different WASM binaries, and each are called its &amp;lt;code&amp;gt;event()&amp;lt;/code&amp;gt; function every 10ms.&lt;br /&gt;
&lt;br /&gt;
7 of the does the blinking of the RGB LEDs and the last one doesn't.&lt;br /&gt;
&lt;br /&gt;
I changed the last one to be the same as the first one. And again the last one doesn't blink the LED. So, it is not the WASM code that is the issue.&lt;br /&gt;
&lt;br /&gt;
I can single step through the wasm execution and there is nothing that stands out. However, since only the &amp;quot;if(next &amp;lt; now)&amp;quot; is executed, then there is not that much that is happening.&lt;br /&gt;
&lt;br /&gt;
= Zephyr Mutexes =&lt;br /&gt;
I now have a case where the a zephyr mutex was set up in main(), and later called from a different Zephyr thread, and immediately crashes.&lt;br /&gt;
&lt;br /&gt;
    k_mutex_lock(&amp;amp;data-&amp;gt;lock, K_FOREVER);&lt;br /&gt;
&lt;br /&gt;
That is an inlined function of&lt;br /&gt;
    __pinned_func&lt;br /&gt;
    static inline int k_mutex_lock(struct k_mutex * mutex, k_timeout_t timeout)&lt;br /&gt;
    {&lt;br /&gt;
        compiler_barrier();&lt;br /&gt;
        return z_impl_k_mutex_lock(mutex, timeout);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
And &amp;lt;code&amp;gt;compiler_barrier()&amp;lt;/code&amp;gt; expands to &lt;br /&gt;
&lt;br /&gt;
    do { __asm__ __volatile__ (&amp;quot;&amp;quot; ::: &amp;quot;memory&amp;quot;); }&lt;br /&gt;
    while (0);&lt;br /&gt;
&lt;br /&gt;
on the STM32.&lt;br /&gt;
&lt;br /&gt;
I am now moving code around to ensure that it is always the same thread calling the mutex.&lt;br /&gt;
&lt;br /&gt;
Hmmm... Now instead completely crashing, it is ending up in &lt;br /&gt;
&lt;br /&gt;
    void arch_system_halt(unsigned int reason){}&lt;br /&gt;
&lt;br /&gt;
with a reason=4, which is &amp;lt;code&amp;gt;K_ERR_KERNEL_PANIC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Call stack reveals nothing.&lt;br /&gt;
&lt;br /&gt;
    arch_system_halt fatal.c:30&lt;br /&gt;
    k_sys_fatal_error_handler fatal.c:44&lt;br /&gt;
    z_fatal_error fatal.c:119&lt;br /&gt;
    z_arm_fatal_error fatal.c:93&lt;br /&gt;
    z_arm_fault fault.c:1090&lt;br /&gt;
    z_arm_usage_fault fault_s.S:103&lt;br /&gt;
    assert_post_action assert.c:44&lt;br /&gt;
    z_spinlock_validate_pre spinlock.h:132&lt;br /&gt;
    k_spin_lock spinlock.h:192&lt;br /&gt;
    z_unpend1_no_timeout sched.c:717&lt;br /&gt;
    z_impl_k_timer_stop timer.c:276&lt;br /&gt;
    z_log_msg_post_finalize log_core.c:195&lt;br /&gt;
    msg_commit log_core.c:717&lt;br /&gt;
    z_log_msg_commit log_core.c:723&lt;br /&gt;
    z_log_msg_finalize log_msg.c:54&lt;br /&gt;
    z_log_msg_simple_create log_msg.c:130&lt;br /&gt;
    z_impl_z_log_msg_simple_create_1 log_msg.c:229&lt;br /&gt;
    esf_dump fatal.c:67&lt;br /&gt;
    z_arm_fatal_error fatal.c:76&lt;br /&gt;
    z_do_kernel_oops fatal.c:141&lt;br /&gt;
    z_arm_svc svc.S:158&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Need more work here...&lt;br /&gt;
That was an unsolved PANIC, but after a bit more fiddling with memory settings, I got to a point where a very clear Stack Overflow occurred. And that was due to stack size for the I/O subsystem thread was set too small. 1024 wasn't enough to execute WASM3 and the stuff I had around it.&lt;br /&gt;
&lt;br /&gt;
= CMake for I/O drivers =&lt;br /&gt;
It is crucial that the wasm binary is stripped of all meta data. This is an example of a reasonable &amp;lt;code&amp;gt;CMakeLists.txt&amp;lt;/code&amp;gt; for the [[Colibri DIO1]] module.&lt;br /&gt;
&lt;br /&gt;
    cmake_minimum_required(VERSION 3.5)&lt;br /&gt;
    set(CMAKE_LINK_DEPENDS_USE_LINKER FALSE)&lt;br /&gt;
    project(io_dio1 C)&lt;br /&gt;
    &lt;br /&gt;
    set(CMAKE_C_STANDARD 11)&lt;br /&gt;
    set(CMAKE_C_COMPILER clang)&lt;br /&gt;
    &lt;br /&gt;
    include_directories(colibri-sdk/)&lt;br /&gt;
    &lt;br /&gt;
    add_executable(io_dio1 dio1.c)&lt;br /&gt;
    set_target_properties(io_dio1 PROPERTIES SUFFIX &amp;quot;.wasm&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    target_compile_options(io_dio1 PRIVATE&lt;br /&gt;
            --target=wasm32&lt;br /&gt;
            -Oz&lt;br /&gt;
            -ffunction-sections&lt;br /&gt;
            -fdata-sections&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
    target_link_options(io_dio1 PRIVATE&lt;br /&gt;
            --target=wasm32-unknown-unknown-wasm  # or just =wasm&lt;br /&gt;
            -nostdlib&lt;br /&gt;
            -Wl,--no-entry&lt;br /&gt;
            -Wl,--allow-undefined&lt;br /&gt;
            -Wl,--gc-sections&lt;br /&gt;
            -Wl,--strip-all&lt;br /&gt;
    &lt;br /&gt;
            # Exports&lt;br /&gt;
            -Wl,--export=event&lt;br /&gt;
            -Wl,--export=init&lt;br /&gt;
            -Wl,--export=loaded&lt;br /&gt;
            -Wl,--export=unloading&lt;br /&gt;
    &lt;br /&gt;
            # Memory Management&lt;br /&gt;
            -Wl,--import-memory        # Host provides the memory&lt;br /&gt;
            -Wl,--initial-memory=65536 # Request 2 pages (required for standard compliance)&lt;br /&gt;
            -Wl,--max-memory=65536     # Cap it at 2 pages&lt;br /&gt;
            -Wl,-z,stack-size=512      # Shrink WASM-internal stack (Default is often 64KB!)&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
    add_custom_command(&lt;br /&gt;
            TARGET io_dio1 POST_BUILD&lt;br /&gt;
            COMMAND xxd -i -n io_dio1 ${CMAKE_BINARY_DIR}/io_dio1/io_dio1.wasm | sed 's/unsigned /const unsigned /' &amp;gt;${CMAKE_BINARY_DIR}/io_dio1.h&lt;br /&gt;
            WORKING_DIRECTORY ${CMAKE_BINARY_DIR}&lt;br /&gt;
            COMMENT &amp;quot;Generating io_dio1.h from io_dio1.wasm using xxd&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
= Memory Allocations =&lt;br /&gt;
This was an investigation into how much RAM is used to instantiate WebAssembly runtimes. 8 wasm files were deployed, each blinking the LED for the respective slot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ---- Program to be loaded  ----&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    #include &amp;quot;colibri.h&amp;quot;&lt;br /&gt;
    #define export __attribute__((visibility(&amp;quot;default&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    static int next = 0;&lt;br /&gt;
    static int state = 0;&lt;br /&gt;
    &lt;br /&gt;
    int tick(long time) {&lt;br /&gt;
        if (next &amp;lt; time) {&lt;br /&gt;
            if (state){&lt;br /&gt;
                set_rgb_error();&lt;br /&gt;
                next = time + 100;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                set_rgb_off();&lt;br /&gt;
                next = time + 500;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return state;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void event(int id, long value) {&lt;br /&gt;
        tick(value);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void init() {&lt;br /&gt;
        set_rgb_ok_color(0x000400);&lt;br /&gt;
        set_rgb_warning_color(0x040400);&lt;br /&gt;
        set_rgb_error_color(0x080000);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void loaded() {&lt;br /&gt;
        set_rgb_off();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void unloading() {&lt;br /&gt;
        set_rgb_off();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Env      Heap @ 0x10000000    112  bytes&lt;br /&gt;
    wasm0    Heap @ 0x10000070    4960 bytes&lt;br /&gt;
    wasm1    Heap @ 0x100013D0    4368 bytes&lt;br /&gt;
    wasm2    Heap @ 0x100024E0    4368 bytes&lt;br /&gt;
    wasm3    Heap @ 0x100035f0    4368 bytes&lt;br /&gt;
    wasm4    Heap @ 0x10004700    4608 bytes&lt;br /&gt;
    wasm5    Heap @ 0x10005900    4368 bytes&lt;br /&gt;
    wasm6    Heap @ 0x10006a10    4368 bytes&lt;br /&gt;
    wasm7    Heap @ 0x10007b20    5200 bytes&lt;br /&gt;
    End      Heap @ 0x10008F70&lt;br /&gt;
    &lt;br /&gt;
    ----- Once -----&lt;br /&gt;
    NewEnvironment&lt;br /&gt;
        M3Environment struct    0x20&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        &lt;br /&gt;
    -----  Per wasm  ---&lt;br /&gt;
    &lt;br /&gt;
    NewRuntime&lt;br /&gt;
        M3Runtime  struct       0x434&lt;br /&gt;
        runtime-&amp;gt;origStack      0x410  (stack + 4 32bit words)        &lt;br /&gt;
        &lt;br /&gt;
    ParseModule&lt;br /&gt;
        M3Module    module      0x78&lt;br /&gt;
        io_module-&amp;gt;functTypes   0x0c&lt;br /&gt;
        AllocFuncType           0x08&lt;br /&gt;
        Free&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free&lt;br /&gt;
        AllocFuncType           0x0A&lt;br /&gt;
        Free&lt;br /&gt;
        PreAllocFunctions       0x154  (5 functions * 68 bytes?)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;memory&amp;quot;                0x07&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_off&amp;quot;           0x0C&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_ok_color&amp;quot;      0x11&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_warning_color&amp;quot; 0x16&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_error_color&amp;quot;   0x14&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        PreAllocFunctions       0x220  &lt;br /&gt;
        AddGlobal               0x20&lt;br /&gt;
        &amp;quot;event&amp;quot;                 0x06    (exports)&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;init&amp;quot;                  0x05&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;loaded&amp;quot;                0x07&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;unloading&amp;quot;             0x0A&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        Free NULL                       (one extra exported name)                       &lt;br /&gt;
        M3DataSegments          0x20    (0 data segment)&lt;br /&gt;
        &lt;br /&gt;
    LoadModule&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x08    (&amp;quot;event&amp;quot;)&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x12    (&amp;quot;init&amp;quot;)&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x14&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_WebAssembly_Notes&amp;diff=7510</id>
		<title>Colibri WebAssembly Notes</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_WebAssembly_Notes&amp;diff=7510"/>
		<updated>2026-05-06T08:42:00Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Zephyr Mutexes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Various notes, investigations and other useful information that might be needed later.&lt;br /&gt;
&lt;br /&gt;
= Zephyr Mutexes =&lt;br /&gt;
I now have a case where the a zephyr mutex was set up in main(), and later called from a different Zephyr thread, and immediately crashes.&lt;br /&gt;
&lt;br /&gt;
    k_mutex_lock(&amp;amp;data-&amp;gt;lock, K_FOREVER);&lt;br /&gt;
&lt;br /&gt;
That is an inlined function of&lt;br /&gt;
    __pinned_func&lt;br /&gt;
    static inline int k_mutex_lock(struct k_mutex * mutex, k_timeout_t timeout)&lt;br /&gt;
    {&lt;br /&gt;
        compiler_barrier();&lt;br /&gt;
        return z_impl_k_mutex_lock(mutex, timeout);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
And &amp;lt;code&amp;gt;compiler_barrier()&amp;lt;/code&amp;gt; expands to &lt;br /&gt;
&lt;br /&gt;
    do { __asm__ __volatile__ (&amp;quot;&amp;quot; ::: &amp;quot;memory&amp;quot;); }&lt;br /&gt;
    while (0);&lt;br /&gt;
&lt;br /&gt;
on the STM32.&lt;br /&gt;
&lt;br /&gt;
I am now moving code around to ensure that it is always the same thread calling the mutex.&lt;br /&gt;
&lt;br /&gt;
Hmmm... Now instead completely crashing, it is ending up in &lt;br /&gt;
&lt;br /&gt;
    void arch_system_halt(unsigned int reason){}&lt;br /&gt;
&lt;br /&gt;
with a reason=4, which is &amp;lt;code&amp;gt;K_ERR_KERNEL_PANIC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Call stack reveals nothing.&lt;br /&gt;
&lt;br /&gt;
    arch_system_halt fatal.c:30&lt;br /&gt;
    k_sys_fatal_error_handler fatal.c:44&lt;br /&gt;
    z_fatal_error fatal.c:119&lt;br /&gt;
    z_arm_fatal_error fatal.c:93&lt;br /&gt;
    z_arm_fault fault.c:1090&lt;br /&gt;
    z_arm_usage_fault fault_s.S:103&lt;br /&gt;
    assert_post_action assert.c:44&lt;br /&gt;
    z_spinlock_validate_pre spinlock.h:132&lt;br /&gt;
    k_spin_lock spinlock.h:192&lt;br /&gt;
    z_unpend1_no_timeout sched.c:717&lt;br /&gt;
    z_impl_k_timer_stop timer.c:276&lt;br /&gt;
    z_log_msg_post_finalize log_core.c:195&lt;br /&gt;
    msg_commit log_core.c:717&lt;br /&gt;
    z_log_msg_commit log_core.c:723&lt;br /&gt;
    z_log_msg_finalize log_msg.c:54&lt;br /&gt;
    z_log_msg_simple_create log_msg.c:130&lt;br /&gt;
    z_impl_z_log_msg_simple_create_1 log_msg.c:229&lt;br /&gt;
    esf_dump fatal.c:67&lt;br /&gt;
    z_arm_fatal_error fatal.c:76&lt;br /&gt;
    z_do_kernel_oops fatal.c:141&lt;br /&gt;
    z_arm_svc svc.S:158&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Need more work here...&lt;br /&gt;
&lt;br /&gt;
= CMake for I/O drivers =&lt;br /&gt;
It is crucial that the wasm binary is stripped of all meta data. This is an example of a reasonable &amp;lt;code&amp;gt;CMakeLists.txt&amp;lt;/code&amp;gt; for the [[Colibri DIO1]] module.&lt;br /&gt;
&lt;br /&gt;
    cmake_minimum_required(VERSION 3.5)&lt;br /&gt;
    set(CMAKE_LINK_DEPENDS_USE_LINKER FALSE)&lt;br /&gt;
    project(io_dio1 C)&lt;br /&gt;
    &lt;br /&gt;
    set(CMAKE_C_STANDARD 11)&lt;br /&gt;
    set(CMAKE_C_COMPILER clang)&lt;br /&gt;
    &lt;br /&gt;
    include_directories(colibri-sdk/)&lt;br /&gt;
    &lt;br /&gt;
    add_executable(io_dio1 dio1.c)&lt;br /&gt;
    set_target_properties(io_dio1 PROPERTIES SUFFIX &amp;quot;.wasm&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    target_compile_options(io_dio1 PRIVATE&lt;br /&gt;
            --target=wasm32&lt;br /&gt;
            -Oz&lt;br /&gt;
            -ffunction-sections&lt;br /&gt;
            -fdata-sections&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
    target_link_options(io_dio1 PRIVATE&lt;br /&gt;
            --target=wasm32-unknown-unknown-wasm  # or just =wasm&lt;br /&gt;
            -nostdlib&lt;br /&gt;
            -Wl,--no-entry&lt;br /&gt;
            -Wl,--allow-undefined&lt;br /&gt;
            -Wl,--gc-sections&lt;br /&gt;
            -Wl,--strip-all&lt;br /&gt;
    &lt;br /&gt;
            # Exports&lt;br /&gt;
            -Wl,--export=event&lt;br /&gt;
            -Wl,--export=init&lt;br /&gt;
            -Wl,--export=loaded&lt;br /&gt;
            -Wl,--export=unloading&lt;br /&gt;
    &lt;br /&gt;
            # Memory Management&lt;br /&gt;
            -Wl,--import-memory        # Host provides the memory&lt;br /&gt;
            -Wl,--initial-memory=65536 # Request 2 pages (required for standard compliance)&lt;br /&gt;
            -Wl,--max-memory=65536     # Cap it at 2 pages&lt;br /&gt;
            -Wl,-z,stack-size=512      # Shrink WASM-internal stack (Default is often 64KB!)&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
    add_custom_command(&lt;br /&gt;
            TARGET io_dio1 POST_BUILD&lt;br /&gt;
            COMMAND xxd -i -n io_dio1 ${CMAKE_BINARY_DIR}/io_dio1/io_dio1.wasm | sed 's/unsigned /const unsigned /' &amp;gt;${CMAKE_BINARY_DIR}/io_dio1.h&lt;br /&gt;
            WORKING_DIRECTORY ${CMAKE_BINARY_DIR}&lt;br /&gt;
            COMMENT &amp;quot;Generating io_dio1.h from io_dio1.wasm using xxd&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
= Memory Allocations =&lt;br /&gt;
This was an investigation into how much RAM is used to instantiate WebAssembly runtimes. 8 wasm files were deployed, each blinking the LED for the respective slot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ---- Program to be loaded  ----&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    #include &amp;quot;colibri.h&amp;quot;&lt;br /&gt;
    #define export __attribute__((visibility(&amp;quot;default&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    static int next = 0;&lt;br /&gt;
    static int state = 0;&lt;br /&gt;
    &lt;br /&gt;
    int tick(long time) {&lt;br /&gt;
        if (next &amp;lt; time) {&lt;br /&gt;
            if (state){&lt;br /&gt;
                set_rgb_error();&lt;br /&gt;
                next = time + 100;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                set_rgb_off();&lt;br /&gt;
                next = time + 500;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return state;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void event(int id, long value) {&lt;br /&gt;
        tick(value);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void init() {&lt;br /&gt;
        set_rgb_ok_color(0x000400);&lt;br /&gt;
        set_rgb_warning_color(0x040400);&lt;br /&gt;
        set_rgb_error_color(0x080000);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void loaded() {&lt;br /&gt;
        set_rgb_off();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void unloading() {&lt;br /&gt;
        set_rgb_off();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Env      Heap @ 0x10000000    112  bytes&lt;br /&gt;
    wasm0    Heap @ 0x10000070    4960 bytes&lt;br /&gt;
    wasm1    Heap @ 0x100013D0    4368 bytes&lt;br /&gt;
    wasm2    Heap @ 0x100024E0    4368 bytes&lt;br /&gt;
    wasm3    Heap @ 0x100035f0    4368 bytes&lt;br /&gt;
    wasm4    Heap @ 0x10004700    4608 bytes&lt;br /&gt;
    wasm5    Heap @ 0x10005900    4368 bytes&lt;br /&gt;
    wasm6    Heap @ 0x10006a10    4368 bytes&lt;br /&gt;
    wasm7    Heap @ 0x10007b20    5200 bytes&lt;br /&gt;
    End      Heap @ 0x10008F70&lt;br /&gt;
    &lt;br /&gt;
    ----- Once -----&lt;br /&gt;
    NewEnvironment&lt;br /&gt;
        M3Environment struct    0x20&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        &lt;br /&gt;
    -----  Per wasm  ---&lt;br /&gt;
    &lt;br /&gt;
    NewRuntime&lt;br /&gt;
        M3Runtime  struct       0x434&lt;br /&gt;
        runtime-&amp;gt;origStack      0x410  (stack + 4 32bit words)        &lt;br /&gt;
        &lt;br /&gt;
    ParseModule&lt;br /&gt;
        M3Module    module      0x78&lt;br /&gt;
        io_module-&amp;gt;functTypes   0x0c&lt;br /&gt;
        AllocFuncType           0x08&lt;br /&gt;
        Free&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free&lt;br /&gt;
        AllocFuncType           0x0A&lt;br /&gt;
        Free&lt;br /&gt;
        PreAllocFunctions       0x154  (5 functions * 68 bytes?)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;memory&amp;quot;                0x07&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_off&amp;quot;           0x0C&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_ok_color&amp;quot;      0x11&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_warning_color&amp;quot; 0x16&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_error_color&amp;quot;   0x14&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        PreAllocFunctions       0x220  &lt;br /&gt;
        AddGlobal               0x20&lt;br /&gt;
        &amp;quot;event&amp;quot;                 0x06    (exports)&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;init&amp;quot;                  0x05&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;loaded&amp;quot;                0x07&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;unloading&amp;quot;             0x0A&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        Free NULL                       (one extra exported name)                       &lt;br /&gt;
        M3DataSegments          0x20    (0 data segment)&lt;br /&gt;
        &lt;br /&gt;
    LoadModule&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x08    (&amp;quot;event&amp;quot;)&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x12    (&amp;quot;init&amp;quot;)&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x14&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_WebAssembly_Notes&amp;diff=7509</id>
		<title>Colibri WebAssembly Notes</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_WebAssembly_Notes&amp;diff=7509"/>
		<updated>2026-05-06T08:37:03Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Various notes, investigations and other useful information that might be needed later.&lt;br /&gt;
&lt;br /&gt;
= Zephyr Mutexes =&lt;br /&gt;
I now have a case where the a zephyr mutex was set up in main(), and later called from a different Zephyr thread, and immediately crashes.&lt;br /&gt;
&lt;br /&gt;
    k_mutex_lock(&amp;amp;data-&amp;gt;lock, K_FOREVER);&lt;br /&gt;
&lt;br /&gt;
That is an inlined function of&lt;br /&gt;
    __pinned_func&lt;br /&gt;
    static inline int k_mutex_lock(struct k_mutex * mutex, k_timeout_t timeout)&lt;br /&gt;
    {&lt;br /&gt;
        compiler_barrier();&lt;br /&gt;
        return z_impl_k_mutex_lock(mutex, timeout);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
And &amp;lt;code&amp;gt;compiler_barrier()&amp;lt;/code&amp;gt; expands to &lt;br /&gt;
&lt;br /&gt;
    do { __asm__ __volatile__ (&amp;quot;&amp;quot; ::: &amp;quot;memory&amp;quot;); }&lt;br /&gt;
    while (0);&lt;br /&gt;
&lt;br /&gt;
on the STM32.&lt;br /&gt;
&lt;br /&gt;
I am now moving code around to ensure that it is always the same thread calling the mutex.&lt;br /&gt;
&lt;br /&gt;
Hmmm... Now instead completely crashing, it is ending up in &lt;br /&gt;
&lt;br /&gt;
    void arch_system_halt(unsigned int reason){}&lt;br /&gt;
&lt;br /&gt;
with a reason=4, which is &amp;lt;code&amp;gt;K_ERR_KERNEL_PANIC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Need more work here...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= CMake for I/O drivers =&lt;br /&gt;
It is crucial that the wasm binary is stripped of all meta data. This is an example of a reasonable &amp;lt;code&amp;gt;CMakeLists.txt&amp;lt;/code&amp;gt; for the [[Colibri DIO1]] module.&lt;br /&gt;
&lt;br /&gt;
    cmake_minimum_required(VERSION 3.5)&lt;br /&gt;
    set(CMAKE_LINK_DEPENDS_USE_LINKER FALSE)&lt;br /&gt;
    project(io_dio1 C)&lt;br /&gt;
    &lt;br /&gt;
    set(CMAKE_C_STANDARD 11)&lt;br /&gt;
    set(CMAKE_C_COMPILER clang)&lt;br /&gt;
    &lt;br /&gt;
    include_directories(colibri-sdk/)&lt;br /&gt;
    &lt;br /&gt;
    add_executable(io_dio1 dio1.c)&lt;br /&gt;
    set_target_properties(io_dio1 PROPERTIES SUFFIX &amp;quot;.wasm&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    target_compile_options(io_dio1 PRIVATE&lt;br /&gt;
            --target=wasm32&lt;br /&gt;
            -Oz&lt;br /&gt;
            -ffunction-sections&lt;br /&gt;
            -fdata-sections&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
    target_link_options(io_dio1 PRIVATE&lt;br /&gt;
            --target=wasm32-unknown-unknown-wasm  # or just =wasm&lt;br /&gt;
            -nostdlib&lt;br /&gt;
            -Wl,--no-entry&lt;br /&gt;
            -Wl,--allow-undefined&lt;br /&gt;
            -Wl,--gc-sections&lt;br /&gt;
            -Wl,--strip-all&lt;br /&gt;
    &lt;br /&gt;
            # Exports&lt;br /&gt;
            -Wl,--export=event&lt;br /&gt;
            -Wl,--export=init&lt;br /&gt;
            -Wl,--export=loaded&lt;br /&gt;
            -Wl,--export=unloading&lt;br /&gt;
    &lt;br /&gt;
            # Memory Management&lt;br /&gt;
            -Wl,--import-memory        # Host provides the memory&lt;br /&gt;
            -Wl,--initial-memory=65536 # Request 2 pages (required for standard compliance)&lt;br /&gt;
            -Wl,--max-memory=65536     # Cap it at 2 pages&lt;br /&gt;
            -Wl,-z,stack-size=512      # Shrink WASM-internal stack (Default is often 64KB!)&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
    add_custom_command(&lt;br /&gt;
            TARGET io_dio1 POST_BUILD&lt;br /&gt;
            COMMAND xxd -i -n io_dio1 ${CMAKE_BINARY_DIR}/io_dio1/io_dio1.wasm | sed 's/unsigned /const unsigned /' &amp;gt;${CMAKE_BINARY_DIR}/io_dio1.h&lt;br /&gt;
            WORKING_DIRECTORY ${CMAKE_BINARY_DIR}&lt;br /&gt;
            COMMENT &amp;quot;Generating io_dio1.h from io_dio1.wasm using xxd&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
= Memory Allocations =&lt;br /&gt;
This was an investigation into how much RAM is used to instantiate WebAssembly runtimes. 8 wasm files were deployed, each blinking the LED for the respective slot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ---- Program to be loaded  ----&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    #include &amp;quot;colibri.h&amp;quot;&lt;br /&gt;
    #define export __attribute__((visibility(&amp;quot;default&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    static int next = 0;&lt;br /&gt;
    static int state = 0;&lt;br /&gt;
    &lt;br /&gt;
    int tick(long time) {&lt;br /&gt;
        if (next &amp;lt; time) {&lt;br /&gt;
            if (state){&lt;br /&gt;
                set_rgb_error();&lt;br /&gt;
                next = time + 100;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                set_rgb_off();&lt;br /&gt;
                next = time + 500;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return state;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void event(int id, long value) {&lt;br /&gt;
        tick(value);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void init() {&lt;br /&gt;
        set_rgb_ok_color(0x000400);&lt;br /&gt;
        set_rgb_warning_color(0x040400);&lt;br /&gt;
        set_rgb_error_color(0x080000);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void loaded() {&lt;br /&gt;
        set_rgb_off();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void unloading() {&lt;br /&gt;
        set_rgb_off();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Env      Heap @ 0x10000000    112  bytes&lt;br /&gt;
    wasm0    Heap @ 0x10000070    4960 bytes&lt;br /&gt;
    wasm1    Heap @ 0x100013D0    4368 bytes&lt;br /&gt;
    wasm2    Heap @ 0x100024E0    4368 bytes&lt;br /&gt;
    wasm3    Heap @ 0x100035f0    4368 bytes&lt;br /&gt;
    wasm4    Heap @ 0x10004700    4608 bytes&lt;br /&gt;
    wasm5    Heap @ 0x10005900    4368 bytes&lt;br /&gt;
    wasm6    Heap @ 0x10006a10    4368 bytes&lt;br /&gt;
    wasm7    Heap @ 0x10007b20    5200 bytes&lt;br /&gt;
    End      Heap @ 0x10008F70&lt;br /&gt;
    &lt;br /&gt;
    ----- Once -----&lt;br /&gt;
    NewEnvironment&lt;br /&gt;
        M3Environment struct    0x20&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        &lt;br /&gt;
    -----  Per wasm  ---&lt;br /&gt;
    &lt;br /&gt;
    NewRuntime&lt;br /&gt;
        M3Runtime  struct       0x434&lt;br /&gt;
        runtime-&amp;gt;origStack      0x410  (stack + 4 32bit words)        &lt;br /&gt;
        &lt;br /&gt;
    ParseModule&lt;br /&gt;
        M3Module    module      0x78&lt;br /&gt;
        io_module-&amp;gt;functTypes   0x0c&lt;br /&gt;
        AllocFuncType           0x08&lt;br /&gt;
        Free&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free&lt;br /&gt;
        AllocFuncType           0x0A&lt;br /&gt;
        Free&lt;br /&gt;
        PreAllocFunctions       0x154  (5 functions * 68 bytes?)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;memory&amp;quot;                0x07&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_off&amp;quot;           0x0C&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_ok_color&amp;quot;      0x11&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_warning_color&amp;quot; 0x16&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_error_color&amp;quot;   0x14&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        PreAllocFunctions       0x220  &lt;br /&gt;
        AddGlobal               0x20&lt;br /&gt;
        &amp;quot;event&amp;quot;                 0x06    (exports)&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;init&amp;quot;                  0x05&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;loaded&amp;quot;                0x07&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;unloading&amp;quot;             0x0A&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        Free NULL                       (one extra exported name)                       &lt;br /&gt;
        M3DataSegments          0x20    (0 data segment)&lt;br /&gt;
        &lt;br /&gt;
    LoadModule&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x08    (&amp;quot;event&amp;quot;)&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x12    (&amp;quot;init&amp;quot;)&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x14&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_WebAssembly_Notes&amp;diff=7508</id>
		<title>Colibri WebAssembly Notes</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_WebAssembly_Notes&amp;diff=7508"/>
		<updated>2026-05-06T05:04:09Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Various notes, investigations and other useful information that might be needed later.&lt;br /&gt;
&lt;br /&gt;
= CMake for I/O drivers =&lt;br /&gt;
It is crucial that the wasm binary is stripped of all meta data. This is an example of a reasonable &amp;lt;code&amp;gt;CMakeLists.txt&amp;lt;/code&amp;gt; for the [[Colibri DIO1]] module.&lt;br /&gt;
&lt;br /&gt;
    cmake_minimum_required(VERSION 3.5)&lt;br /&gt;
    set(CMAKE_LINK_DEPENDS_USE_LINKER FALSE)&lt;br /&gt;
    project(io_dio1 C)&lt;br /&gt;
    &lt;br /&gt;
    set(CMAKE_C_STANDARD 11)&lt;br /&gt;
    set(CMAKE_C_COMPILER clang)&lt;br /&gt;
    &lt;br /&gt;
    include_directories(colibri-sdk/)&lt;br /&gt;
    &lt;br /&gt;
    add_executable(io_dio1 dio1.c)&lt;br /&gt;
    set_target_properties(io_dio1 PROPERTIES SUFFIX &amp;quot;.wasm&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    target_compile_options(io_dio1 PRIVATE&lt;br /&gt;
            --target=wasm32&lt;br /&gt;
            -Oz&lt;br /&gt;
            -ffunction-sections&lt;br /&gt;
            -fdata-sections&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
    target_link_options(io_dio1 PRIVATE&lt;br /&gt;
            --target=wasm32-unknown-unknown-wasm  # or just =wasm&lt;br /&gt;
            -nostdlib&lt;br /&gt;
            -Wl,--no-entry&lt;br /&gt;
            -Wl,--allow-undefined&lt;br /&gt;
            -Wl,--gc-sections&lt;br /&gt;
            -Wl,--strip-all&lt;br /&gt;
    &lt;br /&gt;
            # Exports&lt;br /&gt;
            -Wl,--export=event&lt;br /&gt;
            -Wl,--export=init&lt;br /&gt;
            -Wl,--export=loaded&lt;br /&gt;
            -Wl,--export=unloading&lt;br /&gt;
    &lt;br /&gt;
            # Memory Management&lt;br /&gt;
            -Wl,--import-memory        # Host provides the memory&lt;br /&gt;
            -Wl,--initial-memory=65536 # Request 2 pages (required for standard compliance)&lt;br /&gt;
            -Wl,--max-memory=65536     # Cap it at 2 pages&lt;br /&gt;
            -Wl,-z,stack-size=512      # Shrink WASM-internal stack (Default is often 64KB!)&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
    add_custom_command(&lt;br /&gt;
            TARGET io_dio1 POST_BUILD&lt;br /&gt;
            COMMAND xxd -i -n io_dio1 ${CMAKE_BINARY_DIR}/io_dio1/io_dio1.wasm | sed 's/unsigned /const unsigned /' &amp;gt;${CMAKE_BINARY_DIR}/io_dio1.h&lt;br /&gt;
            WORKING_DIRECTORY ${CMAKE_BINARY_DIR}&lt;br /&gt;
            COMMENT &amp;quot;Generating io_dio1.h from io_dio1.wasm using xxd&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
= Memory Allocations =&lt;br /&gt;
This was an investigation into how much RAM is used to instantiate WebAssembly runtimes. 8 wasm files were deployed, each blinking the LED for the respective slot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ---- Program to be loaded  ----&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    #include &amp;quot;colibri.h&amp;quot;&lt;br /&gt;
    #define export __attribute__((visibility(&amp;quot;default&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    static int next = 0;&lt;br /&gt;
    static int state = 0;&lt;br /&gt;
    &lt;br /&gt;
    int tick(long time) {&lt;br /&gt;
        if (next &amp;lt; time) {&lt;br /&gt;
            if (state){&lt;br /&gt;
                set_rgb_error();&lt;br /&gt;
                next = time + 100;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                set_rgb_off();&lt;br /&gt;
                next = time + 500;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return state;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void event(int id, long value) {&lt;br /&gt;
        tick(value);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void init() {&lt;br /&gt;
        set_rgb_ok_color(0x000400);&lt;br /&gt;
        set_rgb_warning_color(0x040400);&lt;br /&gt;
        set_rgb_error_color(0x080000);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void loaded() {&lt;br /&gt;
        set_rgb_off();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void unloading() {&lt;br /&gt;
        set_rgb_off();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Env      Heap @ 0x10000000    112  bytes&lt;br /&gt;
    wasm0    Heap @ 0x10000070    4960 bytes&lt;br /&gt;
    wasm1    Heap @ 0x100013D0    4368 bytes&lt;br /&gt;
    wasm2    Heap @ 0x100024E0    4368 bytes&lt;br /&gt;
    wasm3    Heap @ 0x100035f0    4368 bytes&lt;br /&gt;
    wasm4    Heap @ 0x10004700    4608 bytes&lt;br /&gt;
    wasm5    Heap @ 0x10005900    4368 bytes&lt;br /&gt;
    wasm6    Heap @ 0x10006a10    4368 bytes&lt;br /&gt;
    wasm7    Heap @ 0x10007b20    5200 bytes&lt;br /&gt;
    End      Heap @ 0x10008F70&lt;br /&gt;
    &lt;br /&gt;
    ----- Once -----&lt;br /&gt;
    NewEnvironment&lt;br /&gt;
        M3Environment struct    0x20&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        &lt;br /&gt;
    -----  Per wasm  ---&lt;br /&gt;
    &lt;br /&gt;
    NewRuntime&lt;br /&gt;
        M3Runtime  struct       0x434&lt;br /&gt;
        runtime-&amp;gt;origStack      0x410  (stack + 4 32bit words)        &lt;br /&gt;
        &lt;br /&gt;
    ParseModule&lt;br /&gt;
        M3Module    module      0x78&lt;br /&gt;
        io_module-&amp;gt;functTypes   0x0c&lt;br /&gt;
        AllocFuncType           0x08&lt;br /&gt;
        Free&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free&lt;br /&gt;
        AllocFuncType           0x0A&lt;br /&gt;
        Free&lt;br /&gt;
        PreAllocFunctions       0x154  (5 functions * 68 bytes?)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;memory&amp;quot;                0x07&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_off&amp;quot;           0x0C&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_ok_color&amp;quot;      0x11&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_warning_color&amp;quot; 0x16&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_error_color&amp;quot;   0x14&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        PreAllocFunctions       0x220  &lt;br /&gt;
        AddGlobal               0x20&lt;br /&gt;
        &amp;quot;event&amp;quot;                 0x06    (exports)&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;init&amp;quot;                  0x05&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;loaded&amp;quot;                0x07&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;unloading&amp;quot;             0x0A&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        Free NULL                       (one extra exported name)                       &lt;br /&gt;
        M3DataSegments          0x20    (0 data segment)&lt;br /&gt;
        &lt;br /&gt;
    LoadModule&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x08    (&amp;quot;event&amp;quot;)&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x12    (&amp;quot;init&amp;quot;)&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x14&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_WebAssembly_Notes&amp;diff=7507</id>
		<title>Colibri WebAssembly Notes</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_WebAssembly_Notes&amp;diff=7507"/>
		<updated>2026-05-06T04:54:38Z</updated>

		<summary type="html">&lt;p&gt;Niclas: Created page with &amp;quot;Various notes, investigations and other useful information that might be needed later.   = Meory Allocations = This was an investigation into how much RAM is used to instantia...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Various notes, investigations and other useful information that might be needed later.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Meory Allocations =&lt;br /&gt;
This was an investigation into how much RAM is used to instantiate WebAssembly runtimes. 8 wasm files were deployed, each blinking the LED for the respective slot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ---- Program to be loaded  ----&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    #include &amp;quot;colibri.h&amp;quot;&lt;br /&gt;
    #define export __attribute__((visibility(&amp;quot;default&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    static int next = 0;&lt;br /&gt;
    static int state = 0;&lt;br /&gt;
    &lt;br /&gt;
    int tick(long time) {&lt;br /&gt;
        if (next &amp;lt; time) {&lt;br /&gt;
            if (state){&lt;br /&gt;
                set_rgb_error();&lt;br /&gt;
                next = time + 100;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                set_rgb_off();&lt;br /&gt;
                next = time + 500;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return state;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void event(int id, long value) {&lt;br /&gt;
        tick(value);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void init() {&lt;br /&gt;
        set_rgb_ok_color(0x000400);&lt;br /&gt;
        set_rgb_warning_color(0x040400);&lt;br /&gt;
        set_rgb_error_color(0x080000);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void loaded() {&lt;br /&gt;
        set_rgb_off();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    export void unloading() {&lt;br /&gt;
        set_rgb_off();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Env      Heap @ 0x10000000    112  bytes&lt;br /&gt;
    wasm0    Heap @ 0x10000070    4960 bytes&lt;br /&gt;
    wasm1    Heap @ 0x100013D0    4368 bytes&lt;br /&gt;
    wasm2    Heap @ 0x100024E0    4368 bytes&lt;br /&gt;
    wasm3    Heap @ 0x100035f0    4368 bytes&lt;br /&gt;
    wasm4    Heap @ 0x10004700    4608 bytes&lt;br /&gt;
    wasm5    Heap @ 0x10005900    4368 bytes&lt;br /&gt;
    wasm6    Heap @ 0x10006a10    4368 bytes&lt;br /&gt;
    wasm7    Heap @ 0x10007b20    5200 bytes&lt;br /&gt;
    End      Heap @ 0x10008F70&lt;br /&gt;
    &lt;br /&gt;
    ----- Once -----&lt;br /&gt;
    NewEnvironment&lt;br /&gt;
        M3Environment struct    0x20&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        &lt;br /&gt;
    -----  Per wasm  ---&lt;br /&gt;
    &lt;br /&gt;
    NewRuntime&lt;br /&gt;
        M3Runtime  struct       0x434&lt;br /&gt;
        runtime-&amp;gt;origStack      0x410  (stack + 4 32bit words)        &lt;br /&gt;
        &lt;br /&gt;
    ParseModule&lt;br /&gt;
        M3Module    module      0x78&lt;br /&gt;
        io_module-&amp;gt;functTypes   0x0c&lt;br /&gt;
        AllocFuncType           0x08&lt;br /&gt;
        Free&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free&lt;br /&gt;
        AllocFuncType           0x0A&lt;br /&gt;
        Free&lt;br /&gt;
        PreAllocFunctions       0x154  (5 functions * 68 bytes?)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;memory&amp;quot;                0x07&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_off&amp;quot;           0x0C&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_ok_color&amp;quot;      0x11&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_warning_color&amp;quot; 0x16&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        &amp;quot;env&amp;quot;                   0x04   &lt;br /&gt;
        &amp;quot;set_rgb_error_color&amp;quot;   0x14&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        Free NULL                       (freeing import, module name)&lt;br /&gt;
        Free NULL                       (freeing import, field name)&lt;br /&gt;
        PreAllocFunctions       0x220  &lt;br /&gt;
        AddGlobal               0x20&lt;br /&gt;
        &amp;quot;event&amp;quot;                 0x06    (exports)&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;init&amp;quot;                  0x05&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;loaded&amp;quot;                0x07&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        &amp;quot;unloading&amp;quot;             0x0A&lt;br /&gt;
        Free NULL                       (exported name)                       &lt;br /&gt;
        Free NULL                       (one extra exported name)                       &lt;br /&gt;
        M3DataSegments          0x20    (0 data segment)&lt;br /&gt;
        &lt;br /&gt;
    LoadModule&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        Free NULL&lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        AllocFuncType           0x09&lt;br /&gt;
        Free &lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x08    (&amp;quot;event&amp;quot;)&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x12    (&amp;quot;init&amp;quot;)&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        NewCodePage             0x40&lt;br /&gt;
        CompileFunction         0x14&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Runtime&amp;diff=7506</id>
		<title>Colibri Runtime</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Runtime&amp;diff=7506"/>
		<updated>2026-05-06T04:49:46Z</updated>

		<summary type="html">&lt;p&gt;Niclas: Created page with &amp;quot;The Colibri Runtime is the custom firmware that is running on Colibri MCUs, an application in Colibri Zephyr orchestrating the hardware resources, WebAssembly engines with...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Colibri Runtime is the custom firmware that is running on Colibri MCUs, an application in [[Colibri Zephyr]] orchestrating the hardware resources, WebAssembly engines with I/O drivers and user programs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Development == &lt;br /&gt;
&lt;br /&gt;
[[Colibri WebAssembly Notes]]&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7492</id>
		<title>Streamline Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7492"/>
		<updated>2026-05-02T02:54:23Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Software]][[Category:Zephyr]][[Category:Work in progress]]{{metadesc|Zephyr on Streamline boards}}&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
Let's see how we can easily setup a Zephyr development environment for some Streamline demos.&lt;br /&gt;
&lt;br /&gt;
   sudo apt update&lt;br /&gt;
   sudo apt upgrade&lt;br /&gt;
   sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
     ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
     xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
   &lt;br /&gt;
   mkdir streamline-demos&lt;br /&gt;
   cd streamline-demos&lt;br /&gt;
   python3 -m venv .venv&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_BASE=`pwd`/zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   source .venv/bin/activate&lt;br /&gt;
   pip install west&lt;br /&gt;
   mkdir demo1&lt;br /&gt;
   echo &amp;quot;&lt;br /&gt;
   # @copyright Copyright (c) 2026, CurrentMakers.com and the individuals that has contributed to this project.&lt;br /&gt;
   #&lt;br /&gt;
   # SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
   &lt;br /&gt;
   manifest:&lt;br /&gt;
     projects:&lt;br /&gt;
       - name: zephyr&lt;br /&gt;
         revision: v4.4.0&lt;br /&gt;
         url: https://github.com/zephyrproject-rtos/zephyr&lt;br /&gt;
         west-commands: scripts/west-commands.yml&lt;br /&gt;
         import:&lt;br /&gt;
           name-allowlist:&lt;br /&gt;
             - littlefs&lt;br /&gt;
             - picolibc&lt;br /&gt;
             - hal_stm32&lt;br /&gt;
             - hal_st&lt;br /&gt;
             - hal_nordic&lt;br /&gt;
             - hal_rpi_pico&lt;br /&gt;
             - cmsis_6&lt;br /&gt;
       - name: zephyr-cm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-cm&lt;br /&gt;
         revision: master &lt;br /&gt;
         path: zephyr-cm&lt;br /&gt;
       - name: zephyr-ws2812b-pwm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-ws2812b-pwm&lt;br /&gt;
         revision: master&lt;br /&gt;
         path: modules/lib/zephyr-ws2812b-pwm&lt;br /&gt;
     self:&lt;br /&gt;
       path: demo1&lt;br /&gt;
   &amp;quot;&amp;gt;demo1/west.yml&lt;br /&gt;
   cd demo1&lt;br /&gt;
   west init --local &lt;br /&gt;
   west update&lt;br /&gt;
   west zephyr-export&lt;br /&gt;
   west packages pip --install&lt;br /&gt;
   west sdk install -t arm-zephyr-eabi&lt;br /&gt;
   west config zephyr.toolchain-variant zephyr&lt;br /&gt;
   west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
We also need to redirect the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; to use the STM32CubeIDE TCL scripts, to support the newer STM32 families, like STM32H5 and STM32C5. So &lt;br /&gt;
&lt;br /&gt;
== Flashing ==&lt;br /&gt;
It is really difficult to get flashing to work reliably with new STM32 families, so I suggest the following;&lt;br /&gt;
&lt;br /&gt;
# Download the [https://www.st.com/en/development-tools/stm32cubeprog.html STM32CubeProgrammer].&lt;br /&gt;
# Install it &amp;quot;somewhere&amp;quot;, let's say ${HOME}/st&lt;br /&gt;
# Add a symlink of ${HOME}/st/STM32CubeProgrammer-2.22.0/bin/STM32_Programmer_CLI to a location which is on the PATH, such as ${HOME}/.local/bin&lt;br /&gt;
&lt;br /&gt;
When flashing with &amp;lt;code&amp;gt;west&amp;lt;/code&amp;gt; simply do&lt;br /&gt;
&lt;br /&gt;
    west flash --runner stm32cubeprogrammer&lt;br /&gt;
&lt;br /&gt;
== Demo 1 ==&lt;br /&gt;
&lt;br /&gt;
   west build --pristine always --board streamline_mcu_stm32f407 ../zephyr/samples/basic/blinky&lt;br /&gt;
   west flash --runner stm32cubeprogrammer&lt;br /&gt;
&lt;br /&gt;
And any of the following boards can be substituted;&lt;br /&gt;
&lt;br /&gt;
   streamline_mcu_stm32f407&lt;br /&gt;
   streamline_mcu_stm32h562&lt;br /&gt;
   streamline_mcu_stm32c551&lt;br /&gt;
   streamline_mcu_stm32l475&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7489</id>
		<title>Streamline Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7489"/>
		<updated>2026-05-01T09:26:21Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Software]][[Category:Zephyr]][[Category:Work in progress]]{{metadesc|Zephyr on Streamline boards}}&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
Let's see how we can easily setup a Zephyr development environment for some Streamline demos.&lt;br /&gt;
&lt;br /&gt;
   sudo apt update&lt;br /&gt;
   sudo apt upgrade&lt;br /&gt;
   sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
     ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
     xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
   &lt;br /&gt;
   mkdir streamline-demos&lt;br /&gt;
   cd streamline-demos&lt;br /&gt;
   python3 -m venv .venv&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_BASE=`pwd`/zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   source .venv/bin/activate&lt;br /&gt;
   pip install west&lt;br /&gt;
   mkdir demo1&lt;br /&gt;
   echo &amp;quot;&lt;br /&gt;
   # @copyright Copyright (c) 2026, CurrentMakers.com and the individuals that has contributed to this project.&lt;br /&gt;
   #&lt;br /&gt;
   # SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
   &lt;br /&gt;
   manifest:&lt;br /&gt;
     projects:&lt;br /&gt;
       - name: zephyr&lt;br /&gt;
         revision: v4.4.0&lt;br /&gt;
         url: https://github.com/zephyrproject-rtos/zephyr&lt;br /&gt;
         west-commands: scripts/west-commands.yml&lt;br /&gt;
         import:&lt;br /&gt;
           name-allowlist:&lt;br /&gt;
             - littlefs&lt;br /&gt;
             - picolibc&lt;br /&gt;
             - hal_stm32&lt;br /&gt;
             - hal_st&lt;br /&gt;
             - hal_nordic&lt;br /&gt;
             - hal_rpi_pico&lt;br /&gt;
             - cmsis_6&lt;br /&gt;
       - name: zephyr-cm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-cm&lt;br /&gt;
         revision: master &lt;br /&gt;
         path: zephyr-cm&lt;br /&gt;
       - name: zephyr-ws2812b-pwm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-ws2812b-pwm&lt;br /&gt;
         revision: master&lt;br /&gt;
         path: modules/lib/zephyr-ws2812b-pwm&lt;br /&gt;
     self:&lt;br /&gt;
       path: demo1&lt;br /&gt;
   &amp;quot;&amp;gt;demo1/west.yml&lt;br /&gt;
   cd demo1&lt;br /&gt;
   west init --local &lt;br /&gt;
   west update&lt;br /&gt;
   west zephyr-export&lt;br /&gt;
   west packages pip --install&lt;br /&gt;
   west sdk install -t arm-zephyr-eabi&lt;br /&gt;
   west config zephyr.toolchain-variant zephyr&lt;br /&gt;
   west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
We also need to redirect the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; to use the STM32CubeIDE TCL scripts, to support the newer STM32 families, like STM32H5 and STM32C5. So &lt;br /&gt;
&lt;br /&gt;
   cd streamline-demos/demo1&lt;br /&gt;
   echo &amp;quot;set ST_SCRIPTS ${HOME}/st/stm32cubeide_2.1.1/plugins/com.st.stm32cube.ide.mcu.debug.openocd_2.3.300.202602021527/resources/openocd/st_scripts&amp;quot; &amp;gt;openocd_paths.cfg  # or wherever your stm32cubeide directory is.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, I have not gotten the &amp;lt;code&amp;gt;west&amp;lt;/code&amp;gt; build system to do the right thing with that.&lt;br /&gt;
&lt;br /&gt;
== Demo 1 ==&lt;br /&gt;
&lt;br /&gt;
   west build --pristine always --board streamline_mcu_stm32f407 ../zephyr/samples/basic/blinky&lt;br /&gt;
   st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
And any of the following boards can be substituted;&lt;br /&gt;
&lt;br /&gt;
   streamline_mcu_stm32f407&lt;br /&gt;
   streamline_mcu_stm32h562&lt;br /&gt;
   streamline_mcu_stm32c551&lt;br /&gt;
   streamline_mcu_stm32l475&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7488</id>
		<title>Streamline Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7488"/>
		<updated>2026-05-01T05:42:57Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Demo 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Software]][[Category:Zephyr]][[Category:Work in progress]]{{metadesc|Zephyr on Streamline boards}}&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
Let's see how we can easily setup a Zephyr development environment for some Streamline demos.&lt;br /&gt;
&lt;br /&gt;
   sudo apt update&lt;br /&gt;
   sudo apt upgrade&lt;br /&gt;
   sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
     ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
     xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
   &lt;br /&gt;
   mkdir streamline-demos&lt;br /&gt;
   cd streamline-demos&lt;br /&gt;
   python3 -m venv .venv&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_BASE=`pwd`/zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   source .venv/bin/activate&lt;br /&gt;
   pip install west&lt;br /&gt;
   mkdir demo1&lt;br /&gt;
   echo &amp;quot;&lt;br /&gt;
   # @copyright Copyright (c) 2026, CurrentMakers.com and the individuals that has contributed to this project.&lt;br /&gt;
   #&lt;br /&gt;
   # SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
   &lt;br /&gt;
   manifest:&lt;br /&gt;
     projects:&lt;br /&gt;
       - name: zephyr&lt;br /&gt;
         revision: v4.4.0&lt;br /&gt;
         url: https://github.com/zephyrproject-rtos/zephyr&lt;br /&gt;
         west-commands: scripts/west-commands.yml&lt;br /&gt;
         import:&lt;br /&gt;
           name-allowlist:&lt;br /&gt;
             - littlefs&lt;br /&gt;
             - picolibc&lt;br /&gt;
             - hal_stm32&lt;br /&gt;
             - hal_st&lt;br /&gt;
             - hal_nordic&lt;br /&gt;
             - hal_rpi_pico&lt;br /&gt;
             - cmsis_6&lt;br /&gt;
       - name: zephyr-cm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-cm&lt;br /&gt;
         revision: master &lt;br /&gt;
         path: zephyr-cm&lt;br /&gt;
       - name: zephyr-ws2812b-pwm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-ws2812b-pwm&lt;br /&gt;
         revision: master&lt;br /&gt;
         path: modules/lib/zephyr-ws2812b-pwm&lt;br /&gt;
     self:&lt;br /&gt;
       path: demo1&lt;br /&gt;
   &amp;quot;&amp;gt;demo1/west.yml&lt;br /&gt;
   cd demo1&lt;br /&gt;
   west init --local &lt;br /&gt;
   west update&lt;br /&gt;
   west zephyr-export&lt;br /&gt;
   west packages pip --install&lt;br /&gt;
   west sdk install -t arm-zephyr-eabi&lt;br /&gt;
   west config zephyr.toolchain-variant zephyr&lt;br /&gt;
   west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
== Demo 1 ==&lt;br /&gt;
   cd streamline-demos/demo1&lt;br /&gt;
   west build --pristine always --board streamline_mcu_stm32f407 ../zephyr/samples/basic/blinky&lt;br /&gt;
   west flash --runner openocd&lt;br /&gt;
&lt;br /&gt;
And any of the following boards can be substituted;&lt;br /&gt;
&lt;br /&gt;
   streamline_mcu_stm32f407&lt;br /&gt;
   streamline_mcu_stm32h562&lt;br /&gt;
   streamline_mcu_stm32c551&lt;br /&gt;
   streamline_mcu_stm32l475&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7487</id>
		<title>Streamline Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7487"/>
		<updated>2026-05-01T05:20:17Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Demo 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Software]][[Category:Zephyr]][[Category:Work in progress]]{{metadesc|Zephyr on Streamline boards}}&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
Let's see how we can easily setup a Zephyr development environment for some Streamline demos.&lt;br /&gt;
&lt;br /&gt;
   sudo apt update&lt;br /&gt;
   sudo apt upgrade&lt;br /&gt;
   sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
     ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
     xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
   &lt;br /&gt;
   mkdir streamline-demos&lt;br /&gt;
   cd streamline-demos&lt;br /&gt;
   python3 -m venv .venv&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_BASE=`pwd`/zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   source .venv/bin/activate&lt;br /&gt;
   pip install west&lt;br /&gt;
   mkdir demo1&lt;br /&gt;
   echo &amp;quot;&lt;br /&gt;
   # @copyright Copyright (c) 2026, CurrentMakers.com and the individuals that has contributed to this project.&lt;br /&gt;
   #&lt;br /&gt;
   # SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
   &lt;br /&gt;
   manifest:&lt;br /&gt;
     projects:&lt;br /&gt;
       - name: zephyr&lt;br /&gt;
         revision: v4.4.0&lt;br /&gt;
         url: https://github.com/zephyrproject-rtos/zephyr&lt;br /&gt;
         west-commands: scripts/west-commands.yml&lt;br /&gt;
         import:&lt;br /&gt;
           name-allowlist:&lt;br /&gt;
             - littlefs&lt;br /&gt;
             - picolibc&lt;br /&gt;
             - hal_stm32&lt;br /&gt;
             - hal_st&lt;br /&gt;
             - hal_nordic&lt;br /&gt;
             - hal_rpi_pico&lt;br /&gt;
             - cmsis_6&lt;br /&gt;
       - name: zephyr-cm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-cm&lt;br /&gt;
         revision: master &lt;br /&gt;
         path: zephyr-cm&lt;br /&gt;
       - name: zephyr-ws2812b-pwm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-ws2812b-pwm&lt;br /&gt;
         revision: master&lt;br /&gt;
         path: modules/lib/zephyr-ws2812b-pwm&lt;br /&gt;
     self:&lt;br /&gt;
       path: demo1&lt;br /&gt;
   &amp;quot;&amp;gt;demo1/west.yml&lt;br /&gt;
   cd demo1&lt;br /&gt;
   west init --local &lt;br /&gt;
   west update&lt;br /&gt;
   west zephyr-export&lt;br /&gt;
   west packages pip --install&lt;br /&gt;
   west sdk install -t arm-zephyr-eabi&lt;br /&gt;
   west config zephyr.toolchain-variant zephyr&lt;br /&gt;
   west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
== Demo 1 ==&lt;br /&gt;
   cd streamline-demos/demo1&lt;br /&gt;
   west build --pristine always --board streamline_mcu_stm32f407 ../zephyr/samples/basic/blinky&lt;br /&gt;
   west flash --runner openocd&lt;br /&gt;
&lt;br /&gt;
And any of the following boards can be substituted;&lt;br /&gt;
&lt;br /&gt;
   streamline_mcu_stm32f407&lt;br /&gt;
   streamline_mcu_stm32h562&lt;br /&gt;
   streamline_mcu_stm32c551&lt;br /&gt;
   streamline_mcu_stm32l475 (not quite yet)&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7486</id>
		<title>Streamline Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7486"/>
		<updated>2026-05-01T05:18:50Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Software]][[Category:Zephyr]][[Category:Work in progress]]{{metadesc|Zephyr on Streamline boards}}&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
Let's see how we can easily setup a Zephyr development environment for some Streamline demos.&lt;br /&gt;
&lt;br /&gt;
   sudo apt update&lt;br /&gt;
   sudo apt upgrade&lt;br /&gt;
   sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
     ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
     xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
   &lt;br /&gt;
   mkdir streamline-demos&lt;br /&gt;
   cd streamline-demos&lt;br /&gt;
   python3 -m venv .venv&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_BASE=`pwd`/zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   source .venv/bin/activate&lt;br /&gt;
   pip install west&lt;br /&gt;
   mkdir demo1&lt;br /&gt;
   echo &amp;quot;&lt;br /&gt;
   # @copyright Copyright (c) 2026, CurrentMakers.com and the individuals that has contributed to this project.&lt;br /&gt;
   #&lt;br /&gt;
   # SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
   &lt;br /&gt;
   manifest:&lt;br /&gt;
     projects:&lt;br /&gt;
       - name: zephyr&lt;br /&gt;
         revision: v4.4.0&lt;br /&gt;
         url: https://github.com/zephyrproject-rtos/zephyr&lt;br /&gt;
         west-commands: scripts/west-commands.yml&lt;br /&gt;
         import:&lt;br /&gt;
           name-allowlist:&lt;br /&gt;
             - littlefs&lt;br /&gt;
             - picolibc&lt;br /&gt;
             - hal_stm32&lt;br /&gt;
             - hal_st&lt;br /&gt;
             - hal_nordic&lt;br /&gt;
             - hal_rpi_pico&lt;br /&gt;
             - cmsis_6&lt;br /&gt;
       - name: zephyr-cm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-cm&lt;br /&gt;
         revision: master &lt;br /&gt;
         path: zephyr-cm&lt;br /&gt;
       - name: zephyr-ws2812b-pwm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-ws2812b-pwm&lt;br /&gt;
         revision: master&lt;br /&gt;
         path: modules/lib/zephyr-ws2812b-pwm&lt;br /&gt;
     self:&lt;br /&gt;
       path: demo1&lt;br /&gt;
   &amp;quot;&amp;gt;demo1/west.yml&lt;br /&gt;
   cd demo1&lt;br /&gt;
   west init --local &lt;br /&gt;
   west update&lt;br /&gt;
   west zephyr-export&lt;br /&gt;
   west packages pip --install&lt;br /&gt;
   west sdk install -t arm-zephyr-eabi&lt;br /&gt;
   west config zephyr.toolchain-variant zephyr&lt;br /&gt;
   west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
== Demo 1 ==&lt;br /&gt;
   cd streamline-demos/demo1&lt;br /&gt;
   west build --pristine always --board streamline_mcu_stm32c551 ../zephyr/samples/basic/blinky&lt;br /&gt;
   west flash --runner openocd&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7484</id>
		<title>Streamline Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7484"/>
		<updated>2026-04-30T11:57:19Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Software]]{{metadesc|Zephyr on Streamline boards}}&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
Let's see how we can easily setup a Zephyr development environment for some Streamline demos.&lt;br /&gt;
&lt;br /&gt;
   sudo apt update&lt;br /&gt;
   sudo apt upgrade&lt;br /&gt;
   sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
     ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
     xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
   &lt;br /&gt;
   mkdir streamline-demos&lt;br /&gt;
   cd streamline-demos&lt;br /&gt;
   python3 -m venv .venv&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_BASE=`pwd`/zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   source .venv/bin/activate&lt;br /&gt;
   pip install west&lt;br /&gt;
   mkdir demo1&lt;br /&gt;
   echo &amp;quot;&lt;br /&gt;
   # @copyright Copyright (c) 2026, CurrentMakers.com and the individuals that has contributed to this project.&lt;br /&gt;
   #&lt;br /&gt;
   # SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
   &lt;br /&gt;
   manifest:&lt;br /&gt;
     projects:&lt;br /&gt;
       - name: zephyr&lt;br /&gt;
         revision: v4.4.0&lt;br /&gt;
         url: https://github.com/zephyrproject-rtos/zephyr&lt;br /&gt;
         west-commands: scripts/west-commands.yml&lt;br /&gt;
         import:&lt;br /&gt;
           name-allowlist:&lt;br /&gt;
             - littlefs&lt;br /&gt;
             - picolibc&lt;br /&gt;
             - hal_stm32&lt;br /&gt;
             - hal_st&lt;br /&gt;
             - hal_nordic&lt;br /&gt;
             - hal_rpi_pico&lt;br /&gt;
             - cmsis_6&lt;br /&gt;
       - name: zephyr-cm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-cm&lt;br /&gt;
         revision: master &lt;br /&gt;
         path: zephyr-cm&lt;br /&gt;
       - name: zephyr-ws2812b-pwm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-ws2812b-pwm&lt;br /&gt;
         revision: master&lt;br /&gt;
         path: modules/lib/zephyr-ws2812b-pwm&lt;br /&gt;
     self:&lt;br /&gt;
       path: demo1&lt;br /&gt;
   &amp;quot;&amp;gt;demo1/west.yml&lt;br /&gt;
   cd demo1&lt;br /&gt;
   west init --local &lt;br /&gt;
   west update&lt;br /&gt;
   west zephyr-export&lt;br /&gt;
   west packages pip --install&lt;br /&gt;
   west sdk install -t arm-zephyr-eabi&lt;br /&gt;
   west config zephyr.toolchain-variant zephyr&lt;br /&gt;
   west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7483</id>
		<title>Streamline Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7483"/>
		<updated>2026-04-30T11:51:46Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Software]]{{metadesc|Zephyr on Streamline boards}}&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
Let's see how we can easily setup a Zephyr development environment for some Streamline demos.&lt;br /&gt;
&lt;br /&gt;
   sudo apt update&lt;br /&gt;
   sudo apt upgrade&lt;br /&gt;
   sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
     ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
     xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
   &lt;br /&gt;
   mkdir streamline-demos&lt;br /&gt;
   cd streamline-demos&lt;br /&gt;
   python3 -m venv .venv&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_BASE=`pwd`/zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   source .venv/bin/activate&lt;br /&gt;
   pip install west&lt;br /&gt;
   mkdir demo1&lt;br /&gt;
   echo &amp;quot;&lt;br /&gt;
   # @copyright Copyright (c) 2026, CurrentMakers.com and the individuals that has contributed to this project.&lt;br /&gt;
   #&lt;br /&gt;
   # SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
   &lt;br /&gt;
   manifest:&lt;br /&gt;
     projects:&lt;br /&gt;
       - name: zephyr&lt;br /&gt;
         revision: v4.4.0&lt;br /&gt;
         url: https://github.com/zephyrproject-rtos/zephyr&lt;br /&gt;
         west-commands: scripts/west-commands.yml&lt;br /&gt;
         import:&lt;br /&gt;
           name-allowlist:&lt;br /&gt;
             - littlefs&lt;br /&gt;
             - picolibc&lt;br /&gt;
             - hal_stm32&lt;br /&gt;
             - hal_st&lt;br /&gt;
             - hal_nordic&lt;br /&gt;
             - hal_rpi_pico&lt;br /&gt;
             - cmsis_6&lt;br /&gt;
       - name: zephyr-cm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-cm&lt;br /&gt;
         revision: master &lt;br /&gt;
         path: zephyr-cm&lt;br /&gt;
       - name: zephyr-ws2812b-pwm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-ws2812b-pwm&lt;br /&gt;
         revision: master&lt;br /&gt;
         path: modules/lib/zephyr-ws2812b-pwm&lt;br /&gt;
     self:&lt;br /&gt;
       path: demo1&lt;br /&gt;
   &amp;quot;&amp;gt;demo1/west.yml&lt;br /&gt;
   west init --local demo1&lt;br /&gt;
   west update&lt;br /&gt;
   west zephyr-export&lt;br /&gt;
   west packages pip --install&lt;br /&gt;
   west sdk install -t arm-zephyr-eabi&lt;br /&gt;
   west config zephyr.toolchain-variant zephyr&lt;br /&gt;
   west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7482</id>
		<title>Streamline Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7482"/>
		<updated>2026-04-30T11:49:07Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Software]]{{metadesc|Zephyr on Streamline boards}}&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
Let's see how we can easily setup a Zephyr development environment for some Streamline demos.&lt;br /&gt;
&lt;br /&gt;
   sudo apt update&lt;br /&gt;
   sudo apt upgrade&lt;br /&gt;
   sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
     ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
     xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
   &lt;br /&gt;
   mkdir streamline-demos&lt;br /&gt;
   cd streamline-demos&lt;br /&gt;
   python3 -m venv .venv&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_BASE=`pwd`/zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   source .venv/bin/activate&lt;br /&gt;
   pip install west&lt;br /&gt;
   mkdir demo1&lt;br /&gt;
   echo &amp;quot;&lt;br /&gt;
   # @copyright Copyright (c) 2026, CurrentMakers.com and the individuals that has contributed to this project.&lt;br /&gt;
   #&lt;br /&gt;
   # SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
   &lt;br /&gt;
   manifest:&lt;br /&gt;
     projects:&lt;br /&gt;
       - name: zephyr&lt;br /&gt;
         revision: v4.4.0&lt;br /&gt;
         url: https://github.com/zephyrproject-rtos/zephyr&lt;br /&gt;
         west-commands: scripts/west-commands.yml&lt;br /&gt;
         import:&lt;br /&gt;
           name-allowlist:&lt;br /&gt;
             - littlefs&lt;br /&gt;
             - picolibc&lt;br /&gt;
             - hal_stm32&lt;br /&gt;
             - hal_st&lt;br /&gt;
             - hal_nordic&lt;br /&gt;
             - hal_rpi_pico&lt;br /&gt;
             - cmsis_6&lt;br /&gt;
       - name: zephyr-cm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-cm&lt;br /&gt;
         revision: master &lt;br /&gt;
         path: zephyr-cm&lt;br /&gt;
       - name: zephyr-ws2812b-pwm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-ws2812b-pwm&lt;br /&gt;
         revision: master&lt;br /&gt;
         path: modules/lib/zephyr-ws2812b-pwm&lt;br /&gt;
     self:&lt;br /&gt;
       path: demo1&lt;br /&gt;
   &amp;quot;&amp;gt;demo1/west.yml&lt;br /&gt;
   west init --local&lt;br /&gt;
   west update&lt;br /&gt;
   west zephyr-export&lt;br /&gt;
   west packages pip --install&lt;br /&gt;
   west sdk install -t arm-zephyr-eabi&lt;br /&gt;
   west config zephyr.toolchain-variant zephyr&lt;br /&gt;
   west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7481</id>
		<title>Streamline Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7481"/>
		<updated>2026-04-30T11:44:55Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Software]]{{metadesc|Zephyr on Streamline boards}}&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
Let's see how we can easily setup a Zephyr development environment for some Streamline demos.&lt;br /&gt;
&lt;br /&gt;
   sudo apt update&lt;br /&gt;
   sudo apt upgrade&lt;br /&gt;
   sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
     ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
     xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
   &lt;br /&gt;
   mkdir streamline-demos&lt;br /&gt;
   cd streamline-demos&lt;br /&gt;
   python3 -m venv .venv&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_BASE=`pwd`/zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   source .venv/bin/activate&lt;br /&gt;
   pip install west&lt;br /&gt;
   echo &amp;quot;&lt;br /&gt;
   # @copyright Copyright (c) 2026, CurrentMakers.com and the individuals that has contributed to this project.&lt;br /&gt;
   #&lt;br /&gt;
   # SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
   &lt;br /&gt;
   manifest:&lt;br /&gt;
     projects:&lt;br /&gt;
       - name: zephyr&lt;br /&gt;
         revision: v4.4.0&lt;br /&gt;
         url: https://github.com/zephyrproject-rtos/zephyr&lt;br /&gt;
         west-commands: scripts/west-commands.yml&lt;br /&gt;
         import:&lt;br /&gt;
           name-allowlist:&lt;br /&gt;
             - littlefs&lt;br /&gt;
             - picolibc&lt;br /&gt;
             - hal_stm32&lt;br /&gt;
             - hal_st&lt;br /&gt;
             - hal_nordic&lt;br /&gt;
             - hal_rpi_pico&lt;br /&gt;
             - cmsis_6&lt;br /&gt;
       - name: zephyr-cm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-cm&lt;br /&gt;
         revision: master &lt;br /&gt;
         path: zephyr-cm&lt;br /&gt;
       - name: zephyr-ws2812b-pwm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-ws2812b-pwm&lt;br /&gt;
         revision: master&lt;br /&gt;
         path: modules/lib/zephyr-ws2812b-pwm&lt;br /&gt;
     self:&lt;br /&gt;
       path: .&lt;br /&gt;
   &amp;quot;&amp;gt;west.yml&lt;br /&gt;
   west init --local&lt;br /&gt;
   west update&lt;br /&gt;
   west zephyr-export&lt;br /&gt;
   west packages pip --install&lt;br /&gt;
   west sdk install -t arm-zephyr-eabi&lt;br /&gt;
   west config zephyr.toolchain-variant zephyr&lt;br /&gt;
   west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7480</id>
		<title>Streamline Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline_Zephyr&amp;diff=7480"/>
		<updated>2026-04-30T11:41:13Z</updated>

		<summary type="html">&lt;p&gt;Niclas: Created page with &amp;quot;Category:STM32Category:StreamlineCategory:Streamline Software{{metadesc|Zephyr on Streamline boards}}  = Installation = Let's see how we can easily setup a Zephyr...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:Streamline Software]]{{metadesc|Zephyr on Streamline boards}}&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
Let's see how we can easily setup a Zephyr development environment for some Streamline demos.&lt;br /&gt;
&lt;br /&gt;
   sudo apt update&lt;br /&gt;
   sudo apt upgrade&lt;br /&gt;
   sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
     ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
     xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
   &lt;br /&gt;
   mkdir streamline_demos&lt;br /&gt;
   cd streamline_demos&lt;br /&gt;
   python3 -m venv .venv&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_BASE=`pwd`/zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
   source .venv/bin/activate&lt;br /&gt;
   pip install west&lt;br /&gt;
   echo &amp;quot;&lt;br /&gt;
   # @copyright Copyright (c) 2026, CurrentMakers.com and the individuals that has contributed to this project.&lt;br /&gt;
   #&lt;br /&gt;
   # SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
   &lt;br /&gt;
   manifest:&lt;br /&gt;
     projects:&lt;br /&gt;
       - name: zephyr&lt;br /&gt;
         revision: v4.4.0&lt;br /&gt;
         url: https://github.com/zephyrproject-rtos/zephyr&lt;br /&gt;
         west-commands: scripts/west-commands.yml&lt;br /&gt;
         import:&lt;br /&gt;
           name-allowlist:&lt;br /&gt;
             - littlefs&lt;br /&gt;
             - picolibc&lt;br /&gt;
             - hal_stm32&lt;br /&gt;
             - hal_st&lt;br /&gt;
             - hal_nordic&lt;br /&gt;
             - hal_rpi_pico&lt;br /&gt;
             - cmsis_6&lt;br /&gt;
       - name: zephyr-cm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-cm&lt;br /&gt;
         revision: master &lt;br /&gt;
         path: zephyr-cm&lt;br /&gt;
       - name: zephyr-ws2812b-pwm&lt;br /&gt;
         url: https://github.com/currentmakers/zephyr-ws2812b-pwm&lt;br /&gt;
         revision: master&lt;br /&gt;
         path: modules/lib/zephyr-ws2812b-pwm&lt;br /&gt;
     self:&lt;br /&gt;
       path: .&lt;br /&gt;
   &amp;quot;&amp;gt;west.yml&lt;br /&gt;
   west init --local&lt;br /&gt;
   west update&lt;br /&gt;
   west zephyr-export&lt;br /&gt;
   west packages pip --install&lt;br /&gt;
   west sdk install -t arm-zephyr-eabi&lt;br /&gt;
   west config zephyr.toolchain-variant zephyr&lt;br /&gt;
   west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Hardware_Interconnect_Buses&amp;diff=7463</id>
		<title>Hardware Interconnect Buses</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Hardware_Interconnect_Buses&amp;diff=7463"/>
		<updated>2026-04-29T02:40:14Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* RS-485 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Electronics]]{{metadesc|Documenting various forms of hardware interconnect}}&lt;br /&gt;
'''NOTICE!''' This page is a [[Category:Work in progress]] Work in progress&lt;br /&gt;
&lt;br /&gt;
There are literally hundreds - if not thousands - of different specifications for communications between different devices.  Most of these are probably proprietary but this page will document the most common on an introductory level.&lt;br /&gt;
&lt;br /&gt;
== Speed ==&lt;br /&gt;
&lt;br /&gt;
When it comes to any kind of communication, the speed is often expressed as &amp;quot;bps&amp;quot; (bits per second) or faster rates in &amp;quot;kbps&amp;quot; (kilobits per second), &amp;quot;Mbps&amp;quot; (Meta-bits per second) or even &amp;quot;Gbps&amp;quot; (Giga-bits per second).  Soon we'll probably begin to see &amp;quot;Tbps&amp;quot; but I am not sure that is available as of yet.&lt;br /&gt;
&lt;br /&gt;
It is worth noticing that, since a byte is 8 bits, you can often divide the bit-rate by 8 to get the Bytes per second).  Often, however, there are a few extra bits stuffed in the protocol, start, stop, parity, so this calculation really depends on the protocol.&lt;br /&gt;
&lt;br /&gt;
It should also be mentioned that in the early days the term &amp;quot;baud&amp;quot; was often used ([https://en.wikipedia.org/wiki/Baud Wikipedia article on baud).  Baud is defined as a symbol rate and is typically equivalent of the bit-rate.  However, later generation modems could use various forms of encoding to transfer multiple bits in one symbol which is why the term is rarely seen today.&lt;br /&gt;
&lt;br /&gt;
== Asynchronous ==&lt;br /&gt;
&lt;br /&gt;
=== RS-232 ===&lt;br /&gt;
[[File:PDP-11-70.jpeg|thumb|300px|PDP-11 with a serial terminal in the center]]&lt;br /&gt;
RS-232 can be considered the granddad of [[Hardware Interconnect Bus]]es.  It is a point-to-point bus which will connect exactly two devices with each other.  RS-232 would operate at speeds from around 150 bps, through 300, 4800, 9600 and 19200 bps.&lt;br /&gt;
&lt;br /&gt;
RS-232 was first introduced in 1960 and up through the 70s and even 80s it was widely used.  Early computers (see image on the right) were monstrous and were often operated through multiple serial terminals.  The communication between the central computer and those terminals were almost always (if not always) RS-232.&lt;br /&gt;
&lt;br /&gt;
Early PC's always had at least one RS-232 port which was often used to attach a modem.  Modems were common up until the late 90s and again - exclusively used RS-232.&lt;br /&gt;
&lt;br /&gt;
[[File:RS-232_POTS_DTE_DCE.svg|450px]]&lt;br /&gt;
&lt;br /&gt;
[[File:uart-tx-rx-cross-768x466.png|thumb|300px]]&lt;br /&gt;
Today, [[#RS-232|RS-232]] have all but vanished in consumer and professional equipment and is almost exclusively replaced by [[#USB|USB]].  The basic signalling are still commonly used for short distance communication.&lt;br /&gt;
&lt;br /&gt;
These connections will typically operate and a voltage level depending on the actual equipment - typically either 3.3V or 5V.&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/RS-232 Wikipedia article on RS-232]&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
=== RS-422 / RS 423 ===&lt;br /&gt;
RS-422 and RS-423 are serial communication standards that work with differential voltages, rather than absolute voltage levels like RS-232, and using 2 twisted pairs. This means that much longer cables can be used and the data will not get corrupted on the way. These are rarely used nowadays, and have essentially been superseded by more modern communication systems, such as CAN and Ethernet. The RS-485 sibling has survived until present day, see below. &lt;br /&gt;
&lt;br /&gt;
RS-422 is (i.e. was) the point-to-point variant, with full duplex in both directions. RS-423 is (i.e. was) the multi-drop variant, with one master that &amp;quot;owned&amp;quot; one pair and all the slaves shared the other pair, and higher level protocols would ensure that only one slave would respond at any given time.&lt;br /&gt;
&lt;br /&gt;
[[File:RS-422_Network.svg|600px]]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/RS-422 Wikipedia article on RS-422]&lt;br /&gt;
&lt;br /&gt;
=== RS-485 ===&lt;br /&gt;
Wikipedia claims that RS-485 was introduced in 1983. I think that is when it formalized as a standard (TIA-485/EIA-485), because I worked with RS-485 in 1984 with equipment that was way older than just 1 year. Modicon introduce Modbus in 1979, which was a serial protocol on top of RS-485. Nevertheless, RS-485 quickly became a favorite in industrial automation, and is still very popular, especially thanks to Modbus.&lt;br /&gt;
&lt;br /&gt;
RS-485 was originally a single twisted pair, differential voltage interface with maximum 30 devices on one segment, something like ~1000 feet (~300 meters) and 1 Mbit/s maximum communication speed. This has been revised over the years, as silicon vendors have improved performance, and the current standard (1998 &amp;amp; 2012) has been updated to reflect this. Faster speeds, more devices and longer cables. Only in-the-field tests can determine the maximum cable lengths at a given speed.&lt;br /&gt;
&lt;br /&gt;
Connecting an MCU to a RS-485 transceiver is very simple. The UART/USART Tx and Rx are connected to &amp;quot;D&amp;quot; (drive) and &amp;quot;R&amp;quot; (receive) pins on the transceiver chip. There are dozens (or more) RS-485 transceivers on the market, and most of the SOIC-8 variants, which are the majority, are pin compatible. Additionally, there are &amp;quot;RE&amp;quot; (receive enable) and &amp;quot;DE&amp;quot; (drive enable) on the transceivers, which the MCU needs to control. They are electrically inverted, so in most cases, we only need a single MCU pin for (direction) and it gos to both RE and DE.&lt;br /&gt;
&lt;br /&gt;
[[File:RS-485_Network.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/RS-485 Wikipedia article on RS-485]&lt;br /&gt;
&lt;br /&gt;
== {{I2C}} (Inter-Integrated Circuit) ==&lt;br /&gt;
[[File:I²C_bus_logo.svg|thumb|250px]]&lt;br /&gt;
{{I2C}} is a communication bus originally invented by Philips Semiconductors (now NXP) in 1980.  Today, it is widely used for communication between [[MCU]]s and various peripheral devices.&lt;br /&gt;
&lt;br /&gt;
Originally the speed was defined as 100 Kbps or 400 Kbps but faster options were possible and today a newer I3C option is emerging.&lt;br /&gt;
&lt;br /&gt;
[[File:i2c_bus.svg|600px]]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/I2C Wikipedia article on {{I2C}}]&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== SPI (Serial Peripheral Interface) ==&lt;br /&gt;
&lt;br /&gt;
[[File:SPI_8-bit_circular_transfer.svg|thumb|400px]]&lt;br /&gt;
&lt;br /&gt;
[[File:SPI_single_slave.svg|400px]]&lt;br /&gt;
&lt;br /&gt;
[[File:SPI_three_slaves.svg|400px]]&lt;br /&gt;
&lt;br /&gt;
[[File:SPI_three_slaves_daisy_chained.svg|400px]]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Serial_Peripheral_Interface Wikipedia article on SPI]&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== CAN ==&lt;br /&gt;
&lt;br /&gt;
The CAN bus was developed by Bosch in the early 1980s.&lt;br /&gt;
&lt;br /&gt;
[[File:CAN_ISO11898-3_Network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/CAN_bus Wikipedia article on CAN]&lt;br /&gt;
&lt;br /&gt;
== USB ==&lt;br /&gt;
[[File:USB_icon.svg|thumb|200px]]&lt;br /&gt;
USB have today almost completely replaced the original RS-232 for device to device communication.&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/USB Wikipedia article on USB]&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== Ethernet ==&lt;br /&gt;
[[File:PC_Network.svg|thumb|200px]]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Ethernet Wikipedia article on Ethernet]&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Serial_communication Wikipedia article on Serial Communications]&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Hardware_Interconnect_Buses&amp;diff=7462</id>
		<title>Hardware Interconnect Buses</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Hardware_Interconnect_Buses&amp;diff=7462"/>
		<updated>2026-04-29T02:22:51Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* RS-422 / RS 423 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Electronics]]{{metadesc|Documenting various forms of hardware interconnect}}&lt;br /&gt;
'''NOTICE!''' This page is a [[Category:Work in progress]] Work in progress&lt;br /&gt;
&lt;br /&gt;
There are literally hundreds - if not thousands - of different specifications for communications between different devices.  Most of these are probably proprietary but this page will document the most common on an introductory level.&lt;br /&gt;
&lt;br /&gt;
== Speed ==&lt;br /&gt;
&lt;br /&gt;
When it comes to any kind of communication, the speed is often expressed as &amp;quot;bps&amp;quot; (bits per second) or faster rates in &amp;quot;kbps&amp;quot; (kilobits per second), &amp;quot;Mbps&amp;quot; (Meta-bits per second) or even &amp;quot;Gbps&amp;quot; (Giga-bits per second).  Soon we'll probably begin to see &amp;quot;Tbps&amp;quot; but I am not sure that is available as of yet.&lt;br /&gt;
&lt;br /&gt;
It is worth noticing that, since a byte is 8 bits, you can often divide the bit-rate by 8 to get the Bytes per second).  Often, however, there are a few extra bits stuffed in the protocol, start, stop, parity, so this calculation really depends on the protocol.&lt;br /&gt;
&lt;br /&gt;
It should also be mentioned that in the early days the term &amp;quot;baud&amp;quot; was often used ([https://en.wikipedia.org/wiki/Baud Wikipedia article on baud).  Baud is defined as a symbol rate and is typically equivalent of the bit-rate.  However, later generation modems could use various forms of encoding to transfer multiple bits in one symbol which is why the term is rarely seen today.&lt;br /&gt;
&lt;br /&gt;
== Asynchronous ==&lt;br /&gt;
&lt;br /&gt;
=== RS-232 ===&lt;br /&gt;
[[File:PDP-11-70.jpeg|thumb|300px|PDP-11 with a serial terminal in the center]]&lt;br /&gt;
RS-232 can be considered the granddad of [[Hardware Interconnect Bus]]es.  It is a point-to-point bus which will connect exactly two devices with each other.  RS-232 would operate at speeds from around 150 bps, through 300, 4800, 9600 and 19200 bps.&lt;br /&gt;
&lt;br /&gt;
RS-232 was first introduced in 1960 and up through the 70s and even 80s it was widely used.  Early computers (see image on the right) were monstrous and were often operated through multiple serial terminals.  The communication between the central computer and those terminals were almost always (if not always) RS-232.&lt;br /&gt;
&lt;br /&gt;
Early PC's always had at least one RS-232 port which was often used to attach a modem.  Modems were common up until the late 90s and again - exclusively used RS-232.&lt;br /&gt;
&lt;br /&gt;
[[File:RS-232_POTS_DTE_DCE.svg|450px]]&lt;br /&gt;
&lt;br /&gt;
[[File:uart-tx-rx-cross-768x466.png|thumb|300px]]&lt;br /&gt;
Today, [[#RS-232|RS-232]] have all but vanished in consumer and professional equipment and is almost exclusively replaced by [[#USB|USB]].  The basic signalling are still commonly used for short distance communication.&lt;br /&gt;
&lt;br /&gt;
These connections will typically operate and a voltage level depending on the actual equipment - typically either 3.3V or 5V.&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/RS-232 Wikipedia article on RS-232]&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
=== RS-422 / RS 423 ===&lt;br /&gt;
RS-422 and RS-423 are serial communication standards that work with differential voltages, rather than absolute voltage levels like RS-232, and using 2 twisted pairs. This means that much longer cables can be used and the data will not get corrupted on the way. These are rarely used nowadays, and have essentially been superseded by more modern communication systems, such as CAN and Ethernet. The RS-485 sibling has survived until present day, see below. &lt;br /&gt;
&lt;br /&gt;
RS-422 is (i.e. was) the point-to-point variant, with full duplex in both directions. RS-423 is (i.e. was) the multi-drop variant, with one master that &amp;quot;owned&amp;quot; one pair and all the slaves shared the other pair, and higher level protocols would ensure that only one slave would respond at any given time.&lt;br /&gt;
&lt;br /&gt;
[[File:RS-422_Network.svg|600px]]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/RS-422 Wikipedia article on RS-422]&lt;br /&gt;
&lt;br /&gt;
=== RS-485 ===&lt;br /&gt;
&lt;br /&gt;
[[File:RS-485_Network.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/RS-485 Wikipedia article on RS-485]&lt;br /&gt;
&lt;br /&gt;
== {{I2C}} (Inter-Integrated Circuit) ==&lt;br /&gt;
[[File:I²C_bus_logo.svg|thumb|250px]]&lt;br /&gt;
{{I2C}} is a communication bus originally invented by Philips Semiconductors (now NXP) in 1980.  Today, it is widely used for communication between [[MCU]]s and various peripheral devices.&lt;br /&gt;
&lt;br /&gt;
Originally the speed was defined as 100 Kbps or 400 Kbps but faster options were possible and today a newer I3C option is emerging.&lt;br /&gt;
&lt;br /&gt;
[[File:i2c_bus.svg|600px]]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/I2C Wikipedia article on {{I2C}}]&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== SPI (Serial Peripheral Interface) ==&lt;br /&gt;
&lt;br /&gt;
[[File:SPI_8-bit_circular_transfer.svg|thumb|400px]]&lt;br /&gt;
&lt;br /&gt;
[[File:SPI_single_slave.svg|400px]]&lt;br /&gt;
&lt;br /&gt;
[[File:SPI_three_slaves.svg|400px]]&lt;br /&gt;
&lt;br /&gt;
[[File:SPI_three_slaves_daisy_chained.svg|400px]]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Serial_Peripheral_Interface Wikipedia article on SPI]&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== CAN ==&lt;br /&gt;
&lt;br /&gt;
The CAN bus was developed by Bosch in the early 1980s.&lt;br /&gt;
&lt;br /&gt;
[[File:CAN_ISO11898-3_Network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/CAN_bus Wikipedia article on CAN]&lt;br /&gt;
&lt;br /&gt;
== USB ==&lt;br /&gt;
[[File:USB_icon.svg|thumb|200px]]&lt;br /&gt;
USB have today almost completely replaced the original RS-232 for device to device communication.&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/USB Wikipedia article on USB]&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== Ethernet ==&lt;br /&gt;
[[File:PC_Network.svg|thumb|200px]]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Ethernet Wikipedia article on Ethernet]&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Serial_communication Wikipedia article on Serial Communications]&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7442</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7442"/>
		<updated>2026-04-29T01:25:46Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Setting up Zephyr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Setting up Zephyr development is somewhat confusing. The [https://docs.zephyrproject.org/latest/develop/getting_started/index.html official documentation] is in my opinion somewhat misleading. At least it misled me for quite a while. I have found this to be the most straight forward, although you can probably set up with a single `zephyr/` for multiple projects, but since our target here is for only a single workspace, I am ok to occupy a lot of disk space for this.&lt;br /&gt;
&lt;br /&gt;
    mkdir colibri-zephyr    # or whatever name you want&lt;br /&gt;
    cd colibri-zephyr&lt;br /&gt;
    &lt;br /&gt;
    sudo apt update&lt;br /&gt;
    sudo apt upgrade&lt;br /&gt;
    sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
      ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
      xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
    curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-$(uname -m | sed s/aarch64/arm64/)-linux.tar.gz | tar xz&lt;br /&gt;
    mv * wasi-sdk&lt;br /&gt;
    python3 -m venv .venv&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_BASE=`pwd`/zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
    pip install west&lt;br /&gt;
    west init -m https://github.com/currentmakers/colibri-runtime&lt;br /&gt;
    west update&lt;br /&gt;
    west zephyr-export&lt;br /&gt;
    west packages pip --install&lt;br /&gt;
    west sdk install -t arm-zephyr-eabi&lt;br /&gt;
    west config zephyr.toolchain-variant zephyr&lt;br /&gt;
    west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
To build [[Colibri Runtime]], go to the directory created on the first step above (&amp;lt;code&amp;gt;cd colibri-zephyr/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
After opening a new shell/terminal/konsole you will need to initialize the virtual Python environment.&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
&lt;br /&gt;
And thereafter the build can be executed,&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 --shield colibri_carrier colibri-runtime&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
It seems that Zephyr disables the SWD interface by default, hence the &amp;lt;code&amp;gt;--connect-under-reset&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime development = &lt;br /&gt;
The [[Colibri Runtime]] (if you are only interested in USING the Colibri Runtime, go to that page) project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7407</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7407"/>
		<updated>2026-04-28T09:01:34Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Developing with Zephyr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Setting up Zephyr development is somewhat confusing. The [https://docs.zephyrproject.org/latest/develop/getting_started/index.html official documentation] is in my opinion somewhat misleading. At least it misled me for quite a while. I have found this to be the most straight forward, although you can probably set up with a single `zephyr/` for multiple projects, but since our target here is for only a single workspace, I am ok to occupy a lot of disk space for this.&lt;br /&gt;
&lt;br /&gt;
    mkdir colibri-zephyr    # or whatever name you want&lt;br /&gt;
    cd colibri-zephyr&lt;br /&gt;
    &lt;br /&gt;
    sudo apt update&lt;br /&gt;
    sudo apt upgrade&lt;br /&gt;
    sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
      ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
      xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
    curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-$(uname -m | sed s/aarch64/arm64/)-linux.tar.gz | tar xz&lt;br /&gt;
    mv * wasi-sdk&lt;br /&gt;
    python3 -m venv .venv&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
    pip install west&lt;br /&gt;
    west init -m https://github.com/currentmakers/colibri-runtime&lt;br /&gt;
    west update&lt;br /&gt;
    west zephyr-export&lt;br /&gt;
    west packages pip --install&lt;br /&gt;
    west sdk install -t arm-zephyr-eabi&lt;br /&gt;
    west config zephyr.toolchain-variant zephyr&lt;br /&gt;
    west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
To build [[Colibri Runtime]], go to the directory created on the first step above (&amp;lt;code&amp;gt;cd colibri-zephyr/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
After opening a new shell/terminal/konsole you will need to initialize the virtual Python environment.&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
&lt;br /&gt;
And thereafter the build can be executed,&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 --shield colibri_carrier colibri-runtime&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
It seems that Zephyr disables the SWD interface by default, hence the &amp;lt;code&amp;gt;--connect-under-reset&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime development = &lt;br /&gt;
The [[Colibri Runtime]] (if you are only interested in USING the Colibri Runtime, go to that page) project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri&amp;diff=7406</id>
		<title>Colibri</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri&amp;diff=7406"/>
		<updated>2026-04-28T06:15:07Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Programming */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width: 250px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;width: 250px; height: 150px; overflow: hidden; position: relative; background: #000;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;position: absolute; top: -20px; left: -15px;&amp;quot;&amp;gt;&lt;br /&gt;
        [[File:Colibri_8_photo1.jpg|250px|link=File:Colibri_8_photo1.jpg|alt=Colibri 8 PCB]]&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[File:Colibri-3-6.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri_3a_photo1.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri rs485u-2.jpg|180px|thumb]]&lt;br /&gt;
[[File:Colibri aic-RevA-2.jpg|180px|thumb]]&lt;br /&gt;
&lt;br /&gt;
Check out the [[Colibri Videos]] on Youtube.&lt;br /&gt;
&lt;br /&gt;
Colibri is a low-cost automation system, primarily intended for building automation, home automation, energy supervision, agriculture supervision and similar systems. Main features beside costs are;&lt;br /&gt;
* Flexible I/O system, via MCU modules and I/O modules in M.2 Key E sockets. Many types already developed.&lt;br /&gt;
* Power supply of 9-36 Volt, either AC or DC (some I/O cards won't work with DC supply, and some not with AC supply)&lt;br /&gt;
* Each I/O slot can be powered-up/down individually from the MCU.&lt;br /&gt;
* Each I/O slot is addressable individually.&lt;br /&gt;
* MCU communicates with each I/O slot via I2C and/or SPI. The I2C bus is multiplexed to avoid address collision. SPI uses one Chip Select per I/O slot and 2 additional Chip Select if multi SPI devices are on a single I/O module.&lt;br /&gt;
* Each I/O module has an 1Mbit EEPROM with calibration parameters and a WebAssembly program for the MCU module to execute.&lt;br /&gt;
* Some I/O modules have on-board secondary processors for time-critical or other reasons, for instance RS-485 communication, digital inputs (pulse counting) and PID regulator.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Colibri_Architecture-1.svg|240px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Colors in this view represents who creates the software for each part.&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
The Colibri system is designed around two main external projects, [[Colibri Zephyr|Zephyr]] and WebAssembly ([https://github.com/wasm3/wasm3 wasm3] or [https://github.com/bytecodealliance/wasm-micro-runtime WAMR]).&lt;br /&gt;
&lt;br /&gt;
Zephyr provides a lot of ''operating system'' type of features, like task scheduling, concurrency data types, timers, peripheral drivers and cross-platform compatibility to be able to support STM32, RP2354 and possibly other MCU families. And combining that with a WebAssembly environment, we should be able to have a lot of platform independence.&lt;br /&gt;
&lt;br /&gt;
The WebAssembly approach is to allow for;&lt;br /&gt;
* I/O modules that are unknown to the MCU module to be installed without re-flashing the firmware,&lt;br /&gt;
* Uploading of user programs, without flashing the firmware,&lt;br /&gt;
* Sandboxed execution to limit issues that user programs can create,&lt;br /&gt;
* Simplified tool chain,&lt;br /&gt;
* Deferring the choice of programming languages,&lt;br /&gt;
* Future-proofing for programming evolution, option to create our own language.&lt;br /&gt;
&lt;br /&gt;
== Carrier Boards ==&lt;br /&gt;
* ''Colibri 3a'' has 2 I/O slots and one MCU slot, one USB-C port to the MCU slot, Jolt Connect pin header for programming.&lt;br /&gt;
* ''Colibri 8'' is like the ''Colibri 3a'', but with 7 I/O slots and an isolated RS-485 port to the MCU slot.&lt;br /&gt;
* Planned; ''Colibri 8pi'' is like the ''Colibri 8'' but with a full-fledged Raspberry Pi Compute Module 5. 1 Colibri MCU slot and 7 I/O slots,&lt;br /&gt;
* Planned; ''Colibri 16pi'' is like the ''Colibri 8pi'', but with 15 I/O slots rather than 7.&lt;br /&gt;
&lt;br /&gt;
== MCU Modules ==&lt;br /&gt;
There is a choice, and more will follow;&lt;br /&gt;
&lt;br /&gt;
* ''[[Colibri MCU1]]'' - MCU module with a STM32WLE5, 256kB Flash, 64kB RAM, on-chip LoRa and LoraWAN protocol available in STM32CubeMX.&lt;br /&gt;
* ''[[Colibri MCU2]]'' - MCU module with a STM32H562RG, 1024kB Flash, 640kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU3]]'' - MCU module with a STM32F405RG, 1MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU4]]'' - MCU module with a STM32L475RG, 1MB Flash, 128kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU5]]'' - (deprecated) MCU module with a STM32F103RE, 512kB Flash and 64kB RAM. No external flash memory.&lt;br /&gt;
* ''[[Colibri MCU6]]'' - MCU module with a RP2354B, 2MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
&lt;br /&gt;
== I/O Modules ==&lt;br /&gt;
The Colibri system is based around the M.2 connector and a non-standard bus for I2C and SPI communications. Each I/O module has an [[Colibri_EEPROM_Layout|EEPROM memory]] available to identify which module is present in each I/O slot, links to documentation, calibration parameters, testing results and (up to) 16kB of WebAssembly for the MCU module to execute.&lt;br /&gt;
&lt;br /&gt;
== [[Colibri Form Factor|Form Factor]] ==&lt;br /&gt;
&lt;br /&gt;
Both Colibri I/O modules and MCU modules are 22x42mm and has an edge connector called M.2 Key E, '''but it doesn't follow the M.2 specification for Key E'''. The distance between the I/O slots are specified to 23.5mm,&lt;br /&gt;
theoretically making it possible for multi-slot I/O modules (none are planned).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF4444&amp;quot;&amp;gt;'''WARNING!!! Do NOT plug Colibri I/O modules nor any MCU module into other equipment. Do NOT plug any M.2 card into a Colibri system, unless that card/board is specifically made for Colibri.'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modules &amp;amp; Carriers ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri 3a]]''&lt;br /&gt;
| Carrier&lt;br /&gt;
| Minimal Colibri carrier board with 2 I/O slots and one MCU slot. MCU slot is to be populated with any of the MCU variants available.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 8]]''&lt;br /&gt;
| Carrier&lt;br /&gt;
| Colibri carrier board with Colibri MCU slot and 7 Colibri I/O slots. &lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 1dp]]''&lt;br /&gt;
| Carrier&lt;br /&gt;
| Minimal Colibri Host with a single MCU slot and 0-500Pa air pressure sensor.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU1]]''&lt;br /&gt;
| MCU module&lt;br /&gt;
| MCU module with a STM32WLE5CC, for LoraWAN applications.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU2]]''&lt;br /&gt;
| MCU module&lt;br /&gt;
| MCU module with a STM32H562RG and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU3]]''&lt;br /&gt;
| MCU module&lt;br /&gt;
| MCU module with a STM32F405RG and a 16MB flash memory.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU4]]''&lt;br /&gt;
| MCU module&lt;br /&gt;
| MCU module with a STM32L475RGTx and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU6]]''&lt;br /&gt;
| MCU module&lt;br /&gt;
| MCU module with a Raspberry Pi RP2354B and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[M.2 E Breakout]]''&lt;br /&gt;
| M.2 breakout board&lt;br /&gt;
| Generic breakout board for M.2 E key boards.&lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIC]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-20mA inputs&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V inputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AQV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V outputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DII]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two ISOLATED digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIO1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| IEC 61131-2 compliant, 4-channels digital inputs and outputs.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIU]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DP1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| A 0-500Pa air pressure sensor mounted on I/O module.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri FET]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital outputs, FET outputs sinking to GND. Max 1 Amp per channel.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri PID1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| PID regulator, with a PT1000 input and a 0-10V analog output. On-board STM32F030 for host-independent operation.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri Pt1000]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two PT1000 temperature sensor inputs.&lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485I]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Isolated RS-485 port. On-board STM32G431KB to implement protocols, such as Modbus RTU.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485U]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two non-isolated RS-485 ports. On-board STM32F030 implementing Modbus protocol, either as master or slave device.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri SSR]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two Solid State Relays, ON/OFF.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri TRIAC1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four Triac outputs, driving 24V AC.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Planned Boards ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri-8pi]]''&lt;br /&gt;
| Carrier&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 7 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri-16pi]]''&lt;br /&gt;
| Carrier&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 15 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
All Schematics are licensed with the GPLv3, meaning that you are free to make your own designs or manufacture devices using these. We expect that if you derive new design, that you publish these, preferably on this website.&lt;br /&gt;
&lt;br /&gt;
The software will also be published with GPLv3, when something is workable.&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri&amp;diff=7405</id>
		<title>Colibri</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri&amp;diff=7405"/>
		<updated>2026-04-28T04:24:22Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Modules &amp;amp; Carriers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width: 250px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;width: 250px; height: 150px; overflow: hidden; position: relative; background: #000;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;position: absolute; top: -20px; left: -15px;&amp;quot;&amp;gt;&lt;br /&gt;
        [[File:Colibri_8_photo1.jpg|250px|link=File:Colibri_8_photo1.jpg|alt=Colibri 8 PCB]]&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[File:Colibri-3-6.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri_3a_photo1.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri rs485u-2.jpg|180px|thumb]]&lt;br /&gt;
[[File:Colibri aic-RevA-2.jpg|180px|thumb]]&lt;br /&gt;
&lt;br /&gt;
Check out the [[Colibri Videos]] on Youtube.&lt;br /&gt;
&lt;br /&gt;
Colibri is a low-cost automation system, primarily intended for building automation, home automation, energy supervision, agriculture supervision and similar systems. Main features beside costs are;&lt;br /&gt;
* Flexible I/O system, via MCU modules and I/O modules in M.2 Key E sockets. Many types already developed.&lt;br /&gt;
* Power supply of 9-36 Volt, either AC or DC (some I/O cards won't work with DC supply, and some not with AC supply)&lt;br /&gt;
* Each I/O slot can be powered-up/down individually from the MCU.&lt;br /&gt;
* Each I/O slot is addressable individually.&lt;br /&gt;
* MCU communicates with each I/O slot via I2C and/or SPI. The I2C bus is multiplexed to avoid address collision. SPI uses one Chip Select per I/O slot and 2 additional Chip Select if multi SPI devices are on a single I/O module.&lt;br /&gt;
* Each I/O module has an 1Mbit EEPROM with calibration parameters and a WebAssembly program for the MCU module to execute.&lt;br /&gt;
* Some I/O modules have on-board secondary processors for time-critical or other reasons, for instance RS-485 communication, digital inputs (pulse counting) and PID regulator.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Colibri_Architecture-1.svg|240px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Colors in this view represents who creates the software for each part.&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
The Colibri system is designed around two main external projects, [[Colibri Zephyr|Zephyr]] and WebAssembly ([https://github.com/wasm3/wasm3 wasm3]).&lt;br /&gt;
&lt;br /&gt;
Zephyr provides a lot of ''operating system'' type of features, like task scheduling, concurrency data types, timers, peripheral drivers and cross-platform compatibility to be able to support STM32, RP2354 and possibly other MCU families. And combining that with a WebAssembly environment, we should be able to have a lot of platform independence.&lt;br /&gt;
&lt;br /&gt;
The WebAssembly approach is to allow for;&lt;br /&gt;
* I/O modules that are unknown to the MCU module to be installed without re-flashing the firmware,&lt;br /&gt;
* Uploading of user programs, without flashing the firmware,&lt;br /&gt;
* Sandboxed execution to limit issues that user programs can create,&lt;br /&gt;
* Simplified tool chain,&lt;br /&gt;
* Deferring the choice of programming languages,&lt;br /&gt;
* Future-proofing for programming evolution, option to create our own language.&lt;br /&gt;
&lt;br /&gt;
== Carrier Boards ==&lt;br /&gt;
* ''Colibri 3a'' has 2 I/O slots and one MCU slot, one USB-C port to the MCU slot, Jolt Connect pin header for programming.&lt;br /&gt;
* ''Colibri 8'' is like the ''Colibri 3a'', but with 7 I/O slots and an isolated RS-485 port to the MCU slot.&lt;br /&gt;
* Planned; ''Colibri 8pi'' is like the ''Colibri 8'' but with a full-fledged Raspberry Pi Compute Module 5. 1 Colibri MCU slot and 7 I/O slots,&lt;br /&gt;
* Planned; ''Colibri 16pi'' is like the ''Colibri 8pi'', but with 15 I/O slots rather than 7.&lt;br /&gt;
&lt;br /&gt;
== MCU Modules ==&lt;br /&gt;
There is a choice, and more will follow;&lt;br /&gt;
&lt;br /&gt;
* ''[[Colibri MCU1]]'' - MCU module with a STM32WLE5, 256kB Flash, 64kB RAM, on-chip LoRa and LoraWAN protocol available in STM32CubeMX.&lt;br /&gt;
* ''[[Colibri MCU2]]'' - MCU module with a STM32H562RG, 1024kB Flash, 640kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU3]]'' - MCU module with a STM32F405RG, 1MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU4]]'' - MCU module with a STM32L475RG, 1MB Flash, 128kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU5]]'' - (deprecated) MCU module with a STM32F103RE, 512kB Flash and 64kB RAM. No external flash memory.&lt;br /&gt;
* ''[[Colibri MCU6]]'' - MCU module with a RP2354B, 2MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
&lt;br /&gt;
== I/O Modules ==&lt;br /&gt;
The Colibri system is based around the M.2 connector and a non-standard bus for I2C and SPI communications. Each I/O module has an [[Colibri_EEPROM_Layout|EEPROM memory]] available to identify which module is present in each I/O slot, links to documentation, calibration parameters, testing results and (up to) 16kB of WebAssembly for the MCU module to execute.&lt;br /&gt;
&lt;br /&gt;
== [[Colibri Form Factor|Form Factor]] ==&lt;br /&gt;
&lt;br /&gt;
Both Colibri I/O modules and MCU modules are 22x42mm and has an edge connector called M.2 Key E, '''but it doesn't follow the M.2 specification for Key E'''. The distance between the I/O slots are specified to 23.5mm,&lt;br /&gt;
theoretically making it possible for multi-slot I/O modules (none are planned).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF4444&amp;quot;&amp;gt;'''WARNING!!! Do NOT plug Colibri I/O modules nor any MCU module into other equipment. Do NOT plug any M.2 card into a Colibri system, unless that card/board is specifically made for Colibri.'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modules &amp;amp; Carriers ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri 3a]]''&lt;br /&gt;
| Carrier&lt;br /&gt;
| Minimal Colibri carrier board with 2 I/O slots and one MCU slot. MCU slot is to be populated with any of the MCU variants available.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 8]]''&lt;br /&gt;
| Carrier&lt;br /&gt;
| Colibri carrier board with Colibri MCU slot and 7 Colibri I/O slots. &lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 1dp]]''&lt;br /&gt;
| Carrier&lt;br /&gt;
| Minimal Colibri Host with a single MCU slot and 0-500Pa air pressure sensor.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU1]]''&lt;br /&gt;
| MCU module&lt;br /&gt;
| MCU module with a STM32WLE5CC, for LoraWAN applications.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU2]]''&lt;br /&gt;
| MCU module&lt;br /&gt;
| MCU module with a STM32H562RG and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU3]]''&lt;br /&gt;
| MCU module&lt;br /&gt;
| MCU module with a STM32F405RG and a 16MB flash memory.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU4]]''&lt;br /&gt;
| MCU module&lt;br /&gt;
| MCU module with a STM32L475RGTx and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU6]]''&lt;br /&gt;
| MCU module&lt;br /&gt;
| MCU module with a Raspberry Pi RP2354B and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[M.2 E Breakout]]''&lt;br /&gt;
| M.2 breakout board&lt;br /&gt;
| Generic breakout board for M.2 E key boards.&lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIC]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-20mA inputs&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V inputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AQV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V outputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DII]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two ISOLATED digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIO1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| IEC 61131-2 compliant, 4-channels digital inputs and outputs.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIU]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DP1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| A 0-500Pa air pressure sensor mounted on I/O module.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri FET]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital outputs, FET outputs sinking to GND. Max 1 Amp per channel.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri PID1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| PID regulator, with a PT1000 input and a 0-10V analog output. On-board STM32F030 for host-independent operation.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri Pt1000]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two PT1000 temperature sensor inputs.&lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485I]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Isolated RS-485 port. On-board STM32G431KB to implement protocols, such as Modbus RTU.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485U]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two non-isolated RS-485 ports. On-board STM32F030 implementing Modbus protocol, either as master or slave device.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri SSR]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two Solid State Relays, ON/OFF.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri TRIAC1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four Triac outputs, driving 24V AC.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Planned Boards ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri-8pi]]''&lt;br /&gt;
| Carrier&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 7 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri-16pi]]''&lt;br /&gt;
| Carrier&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 15 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
All Schematics are licensed with the GPLv3, meaning that you are free to make your own designs or manufacture devices using these. We expect that if you derive new design, that you publish these, preferably on this website.&lt;br /&gt;
&lt;br /&gt;
The software will also be published with GPLv3, when something is workable.&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri&amp;diff=7404</id>
		<title>Colibri</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri&amp;diff=7404"/>
		<updated>2026-04-28T04:23:34Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Planned Boards */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width: 250px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;width: 250px; height: 150px; overflow: hidden; position: relative; background: #000;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;position: absolute; top: -20px; left: -15px;&amp;quot;&amp;gt;&lt;br /&gt;
        [[File:Colibri_8_photo1.jpg|250px|link=File:Colibri_8_photo1.jpg|alt=Colibri 8 PCB]]&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[File:Colibri-3-6.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri_3a_photo1.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri rs485u-2.jpg|180px|thumb]]&lt;br /&gt;
[[File:Colibri aic-RevA-2.jpg|180px|thumb]]&lt;br /&gt;
&lt;br /&gt;
Check out the [[Colibri Videos]] on Youtube.&lt;br /&gt;
&lt;br /&gt;
Colibri is a low-cost automation system, primarily intended for building automation, home automation, energy supervision, agriculture supervision and similar systems. Main features beside costs are;&lt;br /&gt;
* Flexible I/O system, via MCU modules and I/O modules in M.2 Key E sockets. Many types already developed.&lt;br /&gt;
* Power supply of 9-36 Volt, either AC or DC (some I/O cards won't work with DC supply, and some not with AC supply)&lt;br /&gt;
* Each I/O slot can be powered-up/down individually from the MCU.&lt;br /&gt;
* Each I/O slot is addressable individually.&lt;br /&gt;
* MCU communicates with each I/O slot via I2C and/or SPI. The I2C bus is multiplexed to avoid address collision. SPI uses one Chip Select per I/O slot and 2 additional Chip Select if multi SPI devices are on a single I/O module.&lt;br /&gt;
* Each I/O module has an 1Mbit EEPROM with calibration parameters and a WebAssembly program for the MCU module to execute.&lt;br /&gt;
* Some I/O modules have on-board secondary processors for time-critical or other reasons, for instance RS-485 communication, digital inputs (pulse counting) and PID regulator.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Colibri_Architecture-1.svg|240px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Colors in this view represents who creates the software for each part.&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
The Colibri system is designed around two main external projects, [[Colibri Zephyr|Zephyr]] and WebAssembly ([https://github.com/wasm3/wasm3 wasm3]).&lt;br /&gt;
&lt;br /&gt;
Zephyr provides a lot of ''operating system'' type of features, like task scheduling, concurrency data types, timers, peripheral drivers and cross-platform compatibility to be able to support STM32, RP2354 and possibly other MCU families. And combining that with a WebAssembly environment, we should be able to have a lot of platform independence.&lt;br /&gt;
&lt;br /&gt;
The WebAssembly approach is to allow for;&lt;br /&gt;
* I/O modules that are unknown to the MCU module to be installed without re-flashing the firmware,&lt;br /&gt;
* Uploading of user programs, without flashing the firmware,&lt;br /&gt;
* Sandboxed execution to limit issues that user programs can create,&lt;br /&gt;
* Simplified tool chain,&lt;br /&gt;
* Deferring the choice of programming languages,&lt;br /&gt;
* Future-proofing for programming evolution, option to create our own language.&lt;br /&gt;
&lt;br /&gt;
== Carrier Boards ==&lt;br /&gt;
* ''Colibri 3a'' has 2 I/O slots and one MCU slot, one USB-C port to the MCU slot, Jolt Connect pin header for programming.&lt;br /&gt;
* ''Colibri 8'' is like the ''Colibri 3a'', but with 7 I/O slots and an isolated RS-485 port to the MCU slot.&lt;br /&gt;
* Planned; ''Colibri 8pi'' is like the ''Colibri 8'' but with a full-fledged Raspberry Pi Compute Module 5. 1 Colibri MCU slot and 7 I/O slots,&lt;br /&gt;
* Planned; ''Colibri 16pi'' is like the ''Colibri 8pi'', but with 15 I/O slots rather than 7.&lt;br /&gt;
&lt;br /&gt;
== MCU Modules ==&lt;br /&gt;
There is a choice, and more will follow;&lt;br /&gt;
&lt;br /&gt;
* ''[[Colibri MCU1]]'' - MCU module with a STM32WLE5, 256kB Flash, 64kB RAM, on-chip LoRa and LoraWAN protocol available in STM32CubeMX.&lt;br /&gt;
* ''[[Colibri MCU2]]'' - MCU module with a STM32H562RG, 1024kB Flash, 640kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU3]]'' - MCU module with a STM32F405RG, 1MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU4]]'' - MCU module with a STM32L475RG, 1MB Flash, 128kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU5]]'' - (deprecated) MCU module with a STM32F103RE, 512kB Flash and 64kB RAM. No external flash memory.&lt;br /&gt;
* ''[[Colibri MCU6]]'' - MCU module with a RP2354B, 2MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
&lt;br /&gt;
== I/O Modules ==&lt;br /&gt;
The Colibri system is based around the M.2 connector and a non-standard bus for I2C and SPI communications. Each I/O module has an [[Colibri_EEPROM_Layout|EEPROM memory]] available to identify which module is present in each I/O slot, links to documentation, calibration parameters, testing results and (up to) 16kB of WebAssembly for the MCU module to execute.&lt;br /&gt;
&lt;br /&gt;
== [[Colibri Form Factor|Form Factor]] ==&lt;br /&gt;
&lt;br /&gt;
Both Colibri I/O modules and MCU modules are 22x42mm and has an edge connector called M.2 Key E, '''but it doesn't follow the M.2 specification for Key E'''. The distance between the I/O slots are specified to 23.5mm,&lt;br /&gt;
theoretically making it possible for multi-slot I/O modules (none are planned).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF4444&amp;quot;&amp;gt;'''WARNING!!! Do NOT plug Colibri I/O modules nor any MCU module into other equipment. Do NOT plug any M.2 card into a Colibri system, unless that card/board is specifically made for Colibri.'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modules &amp;amp; Carriers ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri 3a]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri carrier board with 2 I/O slots and one MCU slot. MCU slot is to be populated with any of the MCU variants available.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 8]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Colibri carrier board with Colibri MCU slot and 7 Colibri I/O slots. &lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 1dp]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri Host with a single MCU slot and 0-500Pa air pressure sensor.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU1]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32WLE5CC, for LoraWAN applications.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU2]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32H562RG and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU3]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32F405RG and a 16MB flash memory.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU4]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32L475RGTx and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU6]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a Raspberry Pi RP2354B and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[M.2 E Breakout]]''&lt;br /&gt;
| M.2 breakout board&lt;br /&gt;
| Generic breakout board for M.2 E key boards.&lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIC]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-20mA inputs&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V inputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AQV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V outputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DII]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two ISOLATED digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIO1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| IEC 61131-2 compliant, 4-channels digital inputs and outputs.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIU]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DP1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| A 0-500Pa air pressure sensor mounted on I/O module.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri FET]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital outputs, FET outputs sinking to GND. Max 1 Amp per channel.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri PID1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| PID regulator, with a PT1000 input and a 0-10V analog output. On-board STM32F030 for host-independent operation.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri Pt1000]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two PT1000 temperature sensor inputs.&lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485I]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Isolated RS-485 port. On-board STM32G431KB to implement protocols, such as Modbus RTU.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485U]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two non-isolated RS-485 ports. On-board STM32F030 implementing Modbus protocol, either as master or slave device.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri SSR]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two Solid State Relays, ON/OFF.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri TRIAC1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four Triac outputs, driving 24V AC.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Planned Boards ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri-8pi]]''&lt;br /&gt;
| Carrier&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 7 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri-16pi]]''&lt;br /&gt;
| Carrier&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 15 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
All Schematics are licensed with the GPLv3, meaning that you are free to make your own designs or manufacture devices using these. We expect that if you derive new design, that you publish these, preferably on this website.&lt;br /&gt;
&lt;br /&gt;
The software will also be published with GPLv3, when something is workable.&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri&amp;diff=7403</id>
		<title>Colibri</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri&amp;diff=7403"/>
		<updated>2026-04-28T04:23:15Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Planned Boards */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width: 250px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;width: 250px; height: 150px; overflow: hidden; position: relative; background: #000;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;position: absolute; top: -20px; left: -15px;&amp;quot;&amp;gt;&lt;br /&gt;
        [[File:Colibri_8_photo1.jpg|250px|link=File:Colibri_8_photo1.jpg|alt=Colibri 8 PCB]]&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[File:Colibri-3-6.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri_3a_photo1.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri rs485u-2.jpg|180px|thumb]]&lt;br /&gt;
[[File:Colibri aic-RevA-2.jpg|180px|thumb]]&lt;br /&gt;
&lt;br /&gt;
Check out the [[Colibri Videos]] on Youtube.&lt;br /&gt;
&lt;br /&gt;
Colibri is a low-cost automation system, primarily intended for building automation, home automation, energy supervision, agriculture supervision and similar systems. Main features beside costs are;&lt;br /&gt;
* Flexible I/O system, via MCU modules and I/O modules in M.2 Key E sockets. Many types already developed.&lt;br /&gt;
* Power supply of 9-36 Volt, either AC or DC (some I/O cards won't work with DC supply, and some not with AC supply)&lt;br /&gt;
* Each I/O slot can be powered-up/down individually from the MCU.&lt;br /&gt;
* Each I/O slot is addressable individually.&lt;br /&gt;
* MCU communicates with each I/O slot via I2C and/or SPI. The I2C bus is multiplexed to avoid address collision. SPI uses one Chip Select per I/O slot and 2 additional Chip Select if multi SPI devices are on a single I/O module.&lt;br /&gt;
* Each I/O module has an 1Mbit EEPROM with calibration parameters and a WebAssembly program for the MCU module to execute.&lt;br /&gt;
* Some I/O modules have on-board secondary processors for time-critical or other reasons, for instance RS-485 communication, digital inputs (pulse counting) and PID regulator.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Colibri_Architecture-1.svg|240px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Colors in this view represents who creates the software for each part.&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
The Colibri system is designed around two main external projects, [[Colibri Zephyr|Zephyr]] and WebAssembly ([https://github.com/wasm3/wasm3 wasm3]).&lt;br /&gt;
&lt;br /&gt;
Zephyr provides a lot of ''operating system'' type of features, like task scheduling, concurrency data types, timers, peripheral drivers and cross-platform compatibility to be able to support STM32, RP2354 and possibly other MCU families. And combining that with a WebAssembly environment, we should be able to have a lot of platform independence.&lt;br /&gt;
&lt;br /&gt;
The WebAssembly approach is to allow for;&lt;br /&gt;
* I/O modules that are unknown to the MCU module to be installed without re-flashing the firmware,&lt;br /&gt;
* Uploading of user programs, without flashing the firmware,&lt;br /&gt;
* Sandboxed execution to limit issues that user programs can create,&lt;br /&gt;
* Simplified tool chain,&lt;br /&gt;
* Deferring the choice of programming languages,&lt;br /&gt;
* Future-proofing for programming evolution, option to create our own language.&lt;br /&gt;
&lt;br /&gt;
== Carrier Boards ==&lt;br /&gt;
* ''Colibri 3a'' has 2 I/O slots and one MCU slot, one USB-C port to the MCU slot, Jolt Connect pin header for programming.&lt;br /&gt;
* ''Colibri 8'' is like the ''Colibri 3a'', but with 7 I/O slots and an isolated RS-485 port to the MCU slot.&lt;br /&gt;
* Planned; ''Colibri 8pi'' is like the ''Colibri 8'' but with a full-fledged Raspberry Pi Compute Module 5. 1 Colibri MCU slot and 7 I/O slots,&lt;br /&gt;
* Planned; ''Colibri 16pi'' is like the ''Colibri 8pi'', but with 15 I/O slots rather than 7.&lt;br /&gt;
&lt;br /&gt;
== MCU Modules ==&lt;br /&gt;
There is a choice, and more will follow;&lt;br /&gt;
&lt;br /&gt;
* ''[[Colibri MCU1]]'' - MCU module with a STM32WLE5, 256kB Flash, 64kB RAM, on-chip LoRa and LoraWAN protocol available in STM32CubeMX.&lt;br /&gt;
* ''[[Colibri MCU2]]'' - MCU module with a STM32H562RG, 1024kB Flash, 640kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU3]]'' - MCU module with a STM32F405RG, 1MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU4]]'' - MCU module with a STM32L475RG, 1MB Flash, 128kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU5]]'' - (deprecated) MCU module with a STM32F103RE, 512kB Flash and 64kB RAM. No external flash memory.&lt;br /&gt;
* ''[[Colibri MCU6]]'' - MCU module with a RP2354B, 2MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
&lt;br /&gt;
== I/O Modules ==&lt;br /&gt;
The Colibri system is based around the M.2 connector and a non-standard bus for I2C and SPI communications. Each I/O module has an [[Colibri_EEPROM_Layout|EEPROM memory]] available to identify which module is present in each I/O slot, links to documentation, calibration parameters, testing results and (up to) 16kB of WebAssembly for the MCU module to execute.&lt;br /&gt;
&lt;br /&gt;
== [[Colibri Form Factor|Form Factor]] ==&lt;br /&gt;
&lt;br /&gt;
Both Colibri I/O modules and MCU modules are 22x42mm and has an edge connector called M.2 Key E, '''but it doesn't follow the M.2 specification for Key E'''. The distance between the I/O slots are specified to 23.5mm,&lt;br /&gt;
theoretically making it possible for multi-slot I/O modules (none are planned).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF4444&amp;quot;&amp;gt;'''WARNING!!! Do NOT plug Colibri I/O modules nor any MCU module into other equipment. Do NOT plug any M.2 card into a Colibri system, unless that card/board is specifically made for Colibri.'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modules &amp;amp; Carriers ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri 3a]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri carrier board with 2 I/O slots and one MCU slot. MCU slot is to be populated with any of the MCU variants available.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 8]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Colibri carrier board with Colibri MCU slot and 7 Colibri I/O slots. &lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 1dp]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri Host with a single MCU slot and 0-500Pa air pressure sensor.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU1]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32WLE5CC, for LoraWAN applications.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU2]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32H562RG and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU3]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32F405RG and a 16MB flash memory.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU4]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32L475RGTx and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU6]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a Raspberry Pi RP2354B and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[M.2 E Breakout]]''&lt;br /&gt;
| M.2 breakout board&lt;br /&gt;
| Generic breakout board for M.2 E key boards.&lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIC]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-20mA inputs&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V inputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AQV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V outputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DII]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two ISOLATED digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIO1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| IEC 61131-2 compliant, 4-channels digital inputs and outputs.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIU]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DP1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| A 0-500Pa air pressure sensor mounted on I/O module.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri FET]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital outputs, FET outputs sinking to GND. Max 1 Amp per channel.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri PID1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| PID regulator, with a PT1000 input and a 0-10V analog output. On-board STM32F030 for host-independent operation.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri Pt1000]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two PT1000 temperature sensor inputs.&lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485I]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Isolated RS-485 port. On-board STM32G431KB to implement protocols, such as Modbus RTU.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485U]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two non-isolated RS-485 ports. On-board STM32F030 implementing Modbus protocol, either as master or slave device.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri SSR]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two Solid State Relays, ON/OFF.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri TRIAC1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four Triac outputs, driving 24V AC.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Planned Boards ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri-8pi]]''&lt;br /&gt;
| Carrier board&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 7 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri-16pi]]''&lt;br /&gt;
| Carrier board&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 15 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
All Schematics are licensed with the GPLv3, meaning that you are free to make your own designs or manufacture devices using these. We expect that if you derive new design, that you publish these, preferably on this website.&lt;br /&gt;
&lt;br /&gt;
The software will also be published with GPLv3, when something is workable.&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri&amp;diff=7402</id>
		<title>Colibri</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri&amp;diff=7402"/>
		<updated>2026-04-28T04:22:51Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Modules &amp;amp; Carriers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width: 250px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;width: 250px; height: 150px; overflow: hidden; position: relative; background: #000;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;position: absolute; top: -20px; left: -15px;&amp;quot;&amp;gt;&lt;br /&gt;
        [[File:Colibri_8_photo1.jpg|250px|link=File:Colibri_8_photo1.jpg|alt=Colibri 8 PCB]]&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[File:Colibri-3-6.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri_3a_photo1.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri rs485u-2.jpg|180px|thumb]]&lt;br /&gt;
[[File:Colibri aic-RevA-2.jpg|180px|thumb]]&lt;br /&gt;
&lt;br /&gt;
Check out the [[Colibri Videos]] on Youtube.&lt;br /&gt;
&lt;br /&gt;
Colibri is a low-cost automation system, primarily intended for building automation, home automation, energy supervision, agriculture supervision and similar systems. Main features beside costs are;&lt;br /&gt;
* Flexible I/O system, via MCU modules and I/O modules in M.2 Key E sockets. Many types already developed.&lt;br /&gt;
* Power supply of 9-36 Volt, either AC or DC (some I/O cards won't work with DC supply, and some not with AC supply)&lt;br /&gt;
* Each I/O slot can be powered-up/down individually from the MCU.&lt;br /&gt;
* Each I/O slot is addressable individually.&lt;br /&gt;
* MCU communicates with each I/O slot via I2C and/or SPI. The I2C bus is multiplexed to avoid address collision. SPI uses one Chip Select per I/O slot and 2 additional Chip Select if multi SPI devices are on a single I/O module.&lt;br /&gt;
* Each I/O module has an 1Mbit EEPROM with calibration parameters and a WebAssembly program for the MCU module to execute.&lt;br /&gt;
* Some I/O modules have on-board secondary processors for time-critical or other reasons, for instance RS-485 communication, digital inputs (pulse counting) and PID regulator.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Colibri_Architecture-1.svg|240px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Colors in this view represents who creates the software for each part.&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
The Colibri system is designed around two main external projects, [[Colibri Zephyr|Zephyr]] and WebAssembly ([https://github.com/wasm3/wasm3 wasm3]).&lt;br /&gt;
&lt;br /&gt;
Zephyr provides a lot of ''operating system'' type of features, like task scheduling, concurrency data types, timers, peripheral drivers and cross-platform compatibility to be able to support STM32, RP2354 and possibly other MCU families. And combining that with a WebAssembly environment, we should be able to have a lot of platform independence.&lt;br /&gt;
&lt;br /&gt;
The WebAssembly approach is to allow for;&lt;br /&gt;
* I/O modules that are unknown to the MCU module to be installed without re-flashing the firmware,&lt;br /&gt;
* Uploading of user programs, without flashing the firmware,&lt;br /&gt;
* Sandboxed execution to limit issues that user programs can create,&lt;br /&gt;
* Simplified tool chain,&lt;br /&gt;
* Deferring the choice of programming languages,&lt;br /&gt;
* Future-proofing for programming evolution, option to create our own language.&lt;br /&gt;
&lt;br /&gt;
== Carrier Boards ==&lt;br /&gt;
* ''Colibri 3a'' has 2 I/O slots and one MCU slot, one USB-C port to the MCU slot, Jolt Connect pin header for programming.&lt;br /&gt;
* ''Colibri 8'' is like the ''Colibri 3a'', but with 7 I/O slots and an isolated RS-485 port to the MCU slot.&lt;br /&gt;
* Planned; ''Colibri 8pi'' is like the ''Colibri 8'' but with a full-fledged Raspberry Pi Compute Module 5. 1 Colibri MCU slot and 7 I/O slots,&lt;br /&gt;
* Planned; ''Colibri 16pi'' is like the ''Colibri 8pi'', but with 15 I/O slots rather than 7.&lt;br /&gt;
&lt;br /&gt;
== MCU Modules ==&lt;br /&gt;
There is a choice, and more will follow;&lt;br /&gt;
&lt;br /&gt;
* ''[[Colibri MCU1]]'' - MCU module with a STM32WLE5, 256kB Flash, 64kB RAM, on-chip LoRa and LoraWAN protocol available in STM32CubeMX.&lt;br /&gt;
* ''[[Colibri MCU2]]'' - MCU module with a STM32H562RG, 1024kB Flash, 640kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU3]]'' - MCU module with a STM32F405RG, 1MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU4]]'' - MCU module with a STM32L475RG, 1MB Flash, 128kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU5]]'' - (deprecated) MCU module with a STM32F103RE, 512kB Flash and 64kB RAM. No external flash memory.&lt;br /&gt;
* ''[[Colibri MCU6]]'' - MCU module with a RP2354B, 2MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
&lt;br /&gt;
== I/O Modules ==&lt;br /&gt;
The Colibri system is based around the M.2 connector and a non-standard bus for I2C and SPI communications. Each I/O module has an [[Colibri_EEPROM_Layout|EEPROM memory]] available to identify which module is present in each I/O slot, links to documentation, calibration parameters, testing results and (up to) 16kB of WebAssembly for the MCU module to execute.&lt;br /&gt;
&lt;br /&gt;
== [[Colibri Form Factor|Form Factor]] ==&lt;br /&gt;
&lt;br /&gt;
Both Colibri I/O modules and MCU modules are 22x42mm and has an edge connector called M.2 Key E, '''but it doesn't follow the M.2 specification for Key E'''. The distance between the I/O slots are specified to 23.5mm,&lt;br /&gt;
theoretically making it possible for multi-slot I/O modules (none are planned).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF4444&amp;quot;&amp;gt;'''WARNING!!! Do NOT plug Colibri I/O modules nor any MCU module into other equipment. Do NOT plug any M.2 card into a Colibri system, unless that card/board is specifically made for Colibri.'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modules &amp;amp; Carriers ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri 3a]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri carrier board with 2 I/O slots and one MCU slot. MCU slot is to be populated with any of the MCU variants available.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 8]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Colibri carrier board with Colibri MCU slot and 7 Colibri I/O slots. &lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 1dp]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri Host with a single MCU slot and 0-500Pa air pressure sensor.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU1]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32WLE5CC, for LoraWAN applications.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU2]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32H562RG and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU3]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32F405RG and a 16MB flash memory.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU4]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32L475RGTx and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU6]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a Raspberry Pi RP2354B and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[M.2 E Breakout]]''&lt;br /&gt;
| M.2 breakout board&lt;br /&gt;
| Generic breakout board for M.2 E key boards.&lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIC]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-20mA inputs&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V inputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AQV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V outputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DII]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two ISOLATED digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIO1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| IEC 61131-2 compliant, 4-channels digital inputs and outputs.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIU]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DP1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| A 0-500Pa air pressure sensor mounted on I/O module.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri FET]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital outputs, FET outputs sinking to GND. Max 1 Amp per channel.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri PID1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| PID regulator, with a PT1000 input and a 0-10V analog output. On-board STM32F030 for host-independent operation.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri Pt1000]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two PT1000 temperature sensor inputs.&lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485I]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Isolated RS-485 port. On-board STM32G431KB to implement protocols, such as Modbus RTU.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485U]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two non-isolated RS-485 ports. On-board STM32F030 implementing Modbus protocol, either as master or slave device.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri SSR]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two Solid State Relays, ON/OFF.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri TRIAC1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four Triac outputs, driving 24V AC.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|}&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;
| ''[[Colibri-8pi]]''&lt;br /&gt;
| Carrier board&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 7 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri-16pi]]''&lt;br /&gt;
| Carrier board&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 15 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
All Schematics are licensed with the GPLv3, meaning that you are free to make your own designs or manufacture devices using these. We expect that if you derive new design, that you publish these, preferably on this website.&lt;br /&gt;
&lt;br /&gt;
The software will also be published with GPLv3, when something is workable.&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri&amp;diff=7401</id>
		<title>Colibri</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri&amp;diff=7401"/>
		<updated>2026-04-28T04:21:47Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Modules &amp;amp; Carriers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width: 250px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;width: 250px; height: 150px; overflow: hidden; position: relative; background: #000;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;position: absolute; top: -20px; left: -15px;&amp;quot;&amp;gt;&lt;br /&gt;
        [[File:Colibri_8_photo1.jpg|250px|link=File:Colibri_8_photo1.jpg|alt=Colibri 8 PCB]]&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[File:Colibri-3-6.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri_3a_photo1.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri rs485u-2.jpg|180px|thumb]]&lt;br /&gt;
[[File:Colibri aic-RevA-2.jpg|180px|thumb]]&lt;br /&gt;
&lt;br /&gt;
Check out the [[Colibri Videos]] on Youtube.&lt;br /&gt;
&lt;br /&gt;
Colibri is a low-cost automation system, primarily intended for building automation, home automation, energy supervision, agriculture supervision and similar systems. Main features beside costs are;&lt;br /&gt;
* Flexible I/O system, via MCU modules and I/O modules in M.2 Key E sockets. Many types already developed.&lt;br /&gt;
* Power supply of 9-36 Volt, either AC or DC (some I/O cards won't work with DC supply, and some not with AC supply)&lt;br /&gt;
* Each I/O slot can be powered-up/down individually from the MCU.&lt;br /&gt;
* Each I/O slot is addressable individually.&lt;br /&gt;
* MCU communicates with each I/O slot via I2C and/or SPI. The I2C bus is multiplexed to avoid address collision. SPI uses one Chip Select per I/O slot and 2 additional Chip Select if multi SPI devices are on a single I/O module.&lt;br /&gt;
* Each I/O module has an 1Mbit EEPROM with calibration parameters and a WebAssembly program for the MCU module to execute.&lt;br /&gt;
* Some I/O modules have on-board secondary processors for time-critical or other reasons, for instance RS-485 communication, digital inputs (pulse counting) and PID regulator.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Colibri_Architecture-1.svg|240px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Colors in this view represents who creates the software for each part.&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
The Colibri system is designed around two main external projects, [[Colibri Zephyr|Zephyr]] and WebAssembly ([https://github.com/wasm3/wasm3 wasm3]).&lt;br /&gt;
&lt;br /&gt;
Zephyr provides a lot of ''operating system'' type of features, like task scheduling, concurrency data types, timers, peripheral drivers and cross-platform compatibility to be able to support STM32, RP2354 and possibly other MCU families. And combining that with a WebAssembly environment, we should be able to have a lot of platform independence.&lt;br /&gt;
&lt;br /&gt;
The WebAssembly approach is to allow for;&lt;br /&gt;
* I/O modules that are unknown to the MCU module to be installed without re-flashing the firmware,&lt;br /&gt;
* Uploading of user programs, without flashing the firmware,&lt;br /&gt;
* Sandboxed execution to limit issues that user programs can create,&lt;br /&gt;
* Simplified tool chain,&lt;br /&gt;
* Deferring the choice of programming languages,&lt;br /&gt;
* Future-proofing for programming evolution, option to create our own language.&lt;br /&gt;
&lt;br /&gt;
== Carrier Boards ==&lt;br /&gt;
* ''Colibri 3a'' has 2 I/O slots and one MCU slot, one USB-C port to the MCU slot, Jolt Connect pin header for programming.&lt;br /&gt;
* ''Colibri 8'' is like the ''Colibri 3a'', but with 7 I/O slots and an isolated RS-485 port to the MCU slot.&lt;br /&gt;
* Planned; ''Colibri 8pi'' is like the ''Colibri 8'' but with a full-fledged Raspberry Pi Compute Module 5. 1 Colibri MCU slot and 7 I/O slots,&lt;br /&gt;
* Planned; ''Colibri 16pi'' is like the ''Colibri 8pi'', but with 15 I/O slots rather than 7.&lt;br /&gt;
&lt;br /&gt;
== MCU Modules ==&lt;br /&gt;
There is a choice, and more will follow;&lt;br /&gt;
&lt;br /&gt;
* ''[[Colibri MCU1]]'' - MCU module with a STM32WLE5, 256kB Flash, 64kB RAM, on-chip LoRa and LoraWAN protocol available in STM32CubeMX.&lt;br /&gt;
* ''[[Colibri MCU2]]'' - MCU module with a STM32H562RG, 1024kB Flash, 640kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU3]]'' - MCU module with a STM32F405RG, 1MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU4]]'' - MCU module with a STM32L475RG, 1MB Flash, 128kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU5]]'' - (deprecated) MCU module with a STM32F103RE, 512kB Flash and 64kB RAM. No external flash memory.&lt;br /&gt;
* ''[[Colibri MCU6]]'' - MCU module with a RP2354B, 2MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
&lt;br /&gt;
== I/O Modules ==&lt;br /&gt;
The Colibri system is based around the M.2 connector and a non-standard bus for I2C and SPI communications. Each I/O module has an [[Colibri_EEPROM_Layout|EEPROM memory]] available to identify which module is present in each I/O slot, links to documentation, calibration parameters, testing results and (up to) 16kB of WebAssembly for the MCU module to execute.&lt;br /&gt;
&lt;br /&gt;
== [[Colibri Form Factor|Form Factor]] ==&lt;br /&gt;
&lt;br /&gt;
Both Colibri I/O modules and MCU modules are 22x42mm and has an edge connector called M.2 Key E, '''but it doesn't follow the M.2 specification for Key E'''. The distance between the I/O slots are specified to 23.5mm,&lt;br /&gt;
theoretically making it possible for multi-slot I/O modules (none are planned).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF4444&amp;quot;&amp;gt;'''WARNING!!! Do NOT plug Colibri I/O modules nor any MCU module into other equipment. Do NOT plug any M.2 card into a Colibri system, unless that card/board is specifically made for Colibri.'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modules &amp;amp; Carriers ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri 3a]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri carrier board with 2 I/O slots and one MCU slot. MCU slot is to be populated with any of the MCU variants available.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 8]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Colibri carrier board with Colibri MCU slot and 7 Colibri I/O slots. &lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 1dp]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri Host with a single MCU slot and 0-500Pa air pressure sensor.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU1]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32WLE5CC, for LoraWAN applications.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU2]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32H562RG and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU3]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32F405RG and a 16MB flash memory.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU4]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32L475RGTx and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU6]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a Raspberry Pi RP2354B and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[M.2 E Breakout]]''&lt;br /&gt;
| M.2 breakout board&lt;br /&gt;
| Generic breakout board for M.2 E key boards.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIC]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-20mA inputs&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V inputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AQV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V outputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DII]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two ISOLATED digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIO1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| IEC 61131-2 compliant, 4-channels digital inputs and outputs.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIU]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DP1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| A 0-500Pa air pressure sensor mounted on I/O module.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri FET]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital outputs, FET outputs sinking to GND. Max 1 Amp per channel.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri PID1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| PID regulator, with a PT1000 input and a 0-10V analog output. On-board STM32F030 for host-independent operation.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri Pt1000]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two PT1000 temperature sensor inputs.&lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485I]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Isolated RS-485 port. On-board STM32G431KB to implement protocols, such as Modbus RTU.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485U]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two non-isolated RS-485 ports. On-board STM32F030 implementing Modbus protocol, either as master or slave device.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri SSR]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two Solid State Relays, ON/OFF.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri TRIAC1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four Triac outputs, driving 24V AC.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|}&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;
| ''[[Colibri-8pi]]''&lt;br /&gt;
| Carrier board&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 7 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri-16pi]]''&lt;br /&gt;
| Carrier board&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 15 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
All Schematics are licensed with the GPLv3, meaning that you are free to make your own designs or manufacture devices using these. We expect that if you derive new design, that you publish these, preferably on this website.&lt;br /&gt;
&lt;br /&gt;
The software will also be published with GPLv3, when something is workable.&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri&amp;diff=7400</id>
		<title>Colibri</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri&amp;diff=7400"/>
		<updated>2026-04-28T04:21:22Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Modules &amp;amp; Carriers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width: 250px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;width: 250px; height: 150px; overflow: hidden; position: relative; background: #000;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;position: absolute; top: -20px; left: -15px;&amp;quot;&amp;gt;&lt;br /&gt;
        [[File:Colibri_8_photo1.jpg|250px|link=File:Colibri_8_photo1.jpg|alt=Colibri 8 PCB]]&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[File:Colibri-3-6.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri_3a_photo1.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri rs485u-2.jpg|180px|thumb]]&lt;br /&gt;
[[File:Colibri aic-RevA-2.jpg|180px|thumb]]&lt;br /&gt;
&lt;br /&gt;
Check out the [[Colibri Videos]] on Youtube.&lt;br /&gt;
&lt;br /&gt;
Colibri is a low-cost automation system, primarily intended for building automation, home automation, energy supervision, agriculture supervision and similar systems. Main features beside costs are;&lt;br /&gt;
* Flexible I/O system, via MCU modules and I/O modules in M.2 Key E sockets. Many types already developed.&lt;br /&gt;
* Power supply of 9-36 Volt, either AC or DC (some I/O cards won't work with DC supply, and some not with AC supply)&lt;br /&gt;
* Each I/O slot can be powered-up/down individually from the MCU.&lt;br /&gt;
* Each I/O slot is addressable individually.&lt;br /&gt;
* MCU communicates with each I/O slot via I2C and/or SPI. The I2C bus is multiplexed to avoid address collision. SPI uses one Chip Select per I/O slot and 2 additional Chip Select if multi SPI devices are on a single I/O module.&lt;br /&gt;
* Each I/O module has an 1Mbit EEPROM with calibration parameters and a WebAssembly program for the MCU module to execute.&lt;br /&gt;
* Some I/O modules have on-board secondary processors for time-critical or other reasons, for instance RS-485 communication, digital inputs (pulse counting) and PID regulator.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Colibri_Architecture-1.svg|240px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Colors in this view represents who creates the software for each part.&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
The Colibri system is designed around two main external projects, [[Colibri Zephyr|Zephyr]] and WebAssembly ([https://github.com/wasm3/wasm3 wasm3]).&lt;br /&gt;
&lt;br /&gt;
Zephyr provides a lot of ''operating system'' type of features, like task scheduling, concurrency data types, timers, peripheral drivers and cross-platform compatibility to be able to support STM32, RP2354 and possibly other MCU families. And combining that with a WebAssembly environment, we should be able to have a lot of platform independence.&lt;br /&gt;
&lt;br /&gt;
The WebAssembly approach is to allow for;&lt;br /&gt;
* I/O modules that are unknown to the MCU module to be installed without re-flashing the firmware,&lt;br /&gt;
* Uploading of user programs, without flashing the firmware,&lt;br /&gt;
* Sandboxed execution to limit issues that user programs can create,&lt;br /&gt;
* Simplified tool chain,&lt;br /&gt;
* Deferring the choice of programming languages,&lt;br /&gt;
* Future-proofing for programming evolution, option to create our own language.&lt;br /&gt;
&lt;br /&gt;
== Carrier Boards ==&lt;br /&gt;
* ''Colibri 3a'' has 2 I/O slots and one MCU slot, one USB-C port to the MCU slot, Jolt Connect pin header for programming.&lt;br /&gt;
* ''Colibri 8'' is like the ''Colibri 3a'', but with 7 I/O slots and an isolated RS-485 port to the MCU slot.&lt;br /&gt;
* Planned; ''Colibri 8pi'' is like the ''Colibri 8'' but with a full-fledged Raspberry Pi Compute Module 5. 1 Colibri MCU slot and 7 I/O slots,&lt;br /&gt;
* Planned; ''Colibri 16pi'' is like the ''Colibri 8pi'', but with 15 I/O slots rather than 7.&lt;br /&gt;
&lt;br /&gt;
== MCU Modules ==&lt;br /&gt;
There is a choice, and more will follow;&lt;br /&gt;
&lt;br /&gt;
* ''[[Colibri MCU1]]'' - MCU module with a STM32WLE5, 256kB Flash, 64kB RAM, on-chip LoRa and LoraWAN protocol available in STM32CubeMX.&lt;br /&gt;
* ''[[Colibri MCU2]]'' - MCU module with a STM32H562RG, 1024kB Flash, 640kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU3]]'' - MCU module with a STM32F405RG, 1MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU4]]'' - MCU module with a STM32L475RG, 1MB Flash, 128kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU5]]'' - (deprecated) MCU module with a STM32F103RE, 512kB Flash and 64kB RAM. No external flash memory.&lt;br /&gt;
* ''[[Colibri MCU6]]'' - MCU module with a RP2354B, 2MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
&lt;br /&gt;
== I/O Modules ==&lt;br /&gt;
The Colibri system is based around the M.2 connector and a non-standard bus for I2C and SPI communications. Each I/O module has an [[Colibri_EEPROM_Layout|EEPROM memory]] available to identify which module is present in each I/O slot, links to documentation, calibration parameters, testing results and (up to) 16kB of WebAssembly for the MCU module to execute.&lt;br /&gt;
&lt;br /&gt;
== [[Colibri Form Factor|Form Factor]] ==&lt;br /&gt;
&lt;br /&gt;
Both Colibri I/O modules and MCU modules are 22x42mm and has an edge connector called M.2 Key E, '''but it doesn't follow the M.2 specification for Key E'''. The distance between the I/O slots are specified to 23.5mm,&lt;br /&gt;
theoretically making it possible for multi-slot I/O modules (none are planned).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF4444&amp;quot;&amp;gt;'''WARNING!!! Do NOT plug Colibri I/O modules nor any MCU module into other equipment. Do NOT plug any M.2 card into a Colibri system, unless that card/board is specifically made for Colibri.'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modules &amp;amp; Carriers ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri 3a]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri carrier board with 2 I/O slots and one MCU slot. MCU slot is to be populated with any of the MCU variants available.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 8]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Colibri carrier board with Colibri MCU slot and 7 Colibri I/O slots. &lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 1dp]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri Host with a single MCU slot and 0-500Pa air pressure sensor.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU1]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32WLE5CC, for LoraWAN applications.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU2]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32H562RG and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU3]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32F405RG and a 16MB flash memory.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU4]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32L475RGTx and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU6]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a Raspberry Pi RP2354B and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[M.2 E Breakout]]''&lt;br /&gt;
| M.2 breakout board&lt;br /&gt;
| Generic breakout board for M.2 E key boards.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIC]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-20mA inputs&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V inputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AQV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V outputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DII]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two ISOLATED digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIO1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| IEC 61131-2 compliant, 4-channels digital inputs and outputs.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIU]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DP1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| A 0-500Pa air pressure sensor mounted on I/O module.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri FET]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital outputs, FET outputs sinking to GND. Max 1 Amp per channel.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri PID1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| PID regulator, with a PT1000 input and a 0-10V analog output. On-board STM32F030 for host-independent operation.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri Pt1000]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two PT1000 temperature sensor inputs.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485I]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Isolated RS-485 port. On-board STM32G431KB to implement protocols, such as Modbus RTU.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485U]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two non-isolated RS-485 ports. On-board STM32F030 implementing Modbus protocol, either as master or slave device.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri SSR]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two Solid State Relays, ON/OFF.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri TRIAC1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four Triac outputs, driving 24V AC.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|}&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;
| ''[[Colibri-8pi]]''&lt;br /&gt;
| Carrier board&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 7 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri-16pi]]''&lt;br /&gt;
| Carrier board&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 15 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
All Schematics are licensed with the GPLv3, meaning that you are free to make your own designs or manufacture devices using these. We expect that if you derive new design, that you publish these, preferably on this website.&lt;br /&gt;
&lt;br /&gt;
The software will also be published with GPLv3, when something is workable.&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri&amp;diff=7399</id>
		<title>Colibri</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri&amp;diff=7399"/>
		<updated>2026-04-28T04:20:56Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Modules &amp;amp; Carriers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width: 250px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;width: 250px; height: 150px; overflow: hidden; position: relative; background: #000;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;position: absolute; top: -20px; left: -15px;&amp;quot;&amp;gt;&lt;br /&gt;
        [[File:Colibri_8_photo1.jpg|250px|link=File:Colibri_8_photo1.jpg|alt=Colibri 8 PCB]]&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[File:Colibri-3-6.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri_3a_photo1.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri rs485u-2.jpg|180px|thumb]]&lt;br /&gt;
[[File:Colibri aic-RevA-2.jpg|180px|thumb]]&lt;br /&gt;
&lt;br /&gt;
Check out the [[Colibri Videos]] on Youtube.&lt;br /&gt;
&lt;br /&gt;
Colibri is a low-cost automation system, primarily intended for building automation, home automation, energy supervision, agriculture supervision and similar systems. Main features beside costs are;&lt;br /&gt;
* Flexible I/O system, via MCU modules and I/O modules in M.2 Key E sockets. Many types already developed.&lt;br /&gt;
* Power supply of 9-36 Volt, either AC or DC (some I/O cards won't work with DC supply, and some not with AC supply)&lt;br /&gt;
* Each I/O slot can be powered-up/down individually from the MCU.&lt;br /&gt;
* Each I/O slot is addressable individually.&lt;br /&gt;
* MCU communicates with each I/O slot via I2C and/or SPI. The I2C bus is multiplexed to avoid address collision. SPI uses one Chip Select per I/O slot and 2 additional Chip Select if multi SPI devices are on a single I/O module.&lt;br /&gt;
* Each I/O module has an 1Mbit EEPROM with calibration parameters and a WebAssembly program for the MCU module to execute.&lt;br /&gt;
* Some I/O modules have on-board secondary processors for time-critical or other reasons, for instance RS-485 communication, digital inputs (pulse counting) and PID regulator.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Colibri_Architecture-1.svg|240px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Colors in this view represents who creates the software for each part.&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
The Colibri system is designed around two main external projects, [[Colibri Zephyr|Zephyr]] and WebAssembly ([https://github.com/wasm3/wasm3 wasm3]).&lt;br /&gt;
&lt;br /&gt;
Zephyr provides a lot of ''operating system'' type of features, like task scheduling, concurrency data types, timers, peripheral drivers and cross-platform compatibility to be able to support STM32, RP2354 and possibly other MCU families. And combining that with a WebAssembly environment, we should be able to have a lot of platform independence.&lt;br /&gt;
&lt;br /&gt;
The WebAssembly approach is to allow for;&lt;br /&gt;
* I/O modules that are unknown to the MCU module to be installed without re-flashing the firmware,&lt;br /&gt;
* Uploading of user programs, without flashing the firmware,&lt;br /&gt;
* Sandboxed execution to limit issues that user programs can create,&lt;br /&gt;
* Simplified tool chain,&lt;br /&gt;
* Deferring the choice of programming languages,&lt;br /&gt;
* Future-proofing for programming evolution, option to create our own language.&lt;br /&gt;
&lt;br /&gt;
== Carrier Boards ==&lt;br /&gt;
* ''Colibri 3a'' has 2 I/O slots and one MCU slot, one USB-C port to the MCU slot, Jolt Connect pin header for programming.&lt;br /&gt;
* ''Colibri 8'' is like the ''Colibri 3a'', but with 7 I/O slots and an isolated RS-485 port to the MCU slot.&lt;br /&gt;
* Planned; ''Colibri 8pi'' is like the ''Colibri 8'' but with a full-fledged Raspberry Pi Compute Module 5. 1 Colibri MCU slot and 7 I/O slots,&lt;br /&gt;
* Planned; ''Colibri 16pi'' is like the ''Colibri 8pi'', but with 15 I/O slots rather than 7.&lt;br /&gt;
&lt;br /&gt;
== MCU Modules ==&lt;br /&gt;
There is a choice, and more will follow;&lt;br /&gt;
&lt;br /&gt;
* ''[[Colibri MCU1]]'' - MCU module with a STM32WLE5, 256kB Flash, 64kB RAM, on-chip LoRa and LoraWAN protocol available in STM32CubeMX.&lt;br /&gt;
* ''[[Colibri MCU2]]'' - MCU module with a STM32H562RG, 1024kB Flash, 640kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU3]]'' - MCU module with a STM32F405RG, 1MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU4]]'' - MCU module with a STM32L475RG, 1MB Flash, 128kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU5]]'' - (deprecated) MCU module with a STM32F103RE, 512kB Flash and 64kB RAM. No external flash memory.&lt;br /&gt;
* ''[[Colibri MCU6]]'' - MCU module with a RP2354B, 2MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
&lt;br /&gt;
== I/O Modules ==&lt;br /&gt;
The Colibri system is based around the M.2 connector and a non-standard bus for I2C and SPI communications. Each I/O module has an [[Colibri_EEPROM_Layout|EEPROM memory]] available to identify which module is present in each I/O slot, links to documentation, calibration parameters, testing results and (up to) 16kB of WebAssembly for the MCU module to execute.&lt;br /&gt;
&lt;br /&gt;
== [[Colibri Form Factor|Form Factor]] ==&lt;br /&gt;
&lt;br /&gt;
Both Colibri I/O modules and MCU modules are 22x42mm and has an edge connector called M.2 Key E, '''but it doesn't follow the M.2 specification for Key E'''. The distance between the I/O slots are specified to 23.5mm,&lt;br /&gt;
theoretically making it possible for multi-slot I/O modules (none are planned).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF4444&amp;quot;&amp;gt;'''WARNING!!! Do NOT plug Colibri I/O modules nor any MCU module into other equipment. Do NOT plug any M.2 card into a Colibri system, unless that card/board is specifically made for Colibri.'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modules &amp;amp; Carriers ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri 3a]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri carrier board with 2 I/O slots and one MCU slot. MCU slot is to be populated with any of the MCU variants available.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 8]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Colibri carrier board with Colibri MCU slot and 7 Colibri I/O slots. &lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 1dp]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri Host with a single MCU slot and 0-500Pa air pressure sensor.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU1]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32WLE5CC, for LoraWAN applications.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU2]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32H562RG and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU3]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32F405RG and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU4]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32L475RGTx and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU6]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a Raspberry Pi RP2354B and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[M.2 E Breakout]]''&lt;br /&gt;
| M.2 breakout board&lt;br /&gt;
| Generic breakout board for M.2 E key boards.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIC]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-20mA inputs&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V inputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AQV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V outputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DII]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two ISOLATED digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIO1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| IEC 61131-2 compliant, 4-channels digital inputs and outputs.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIU]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DP1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| A 0-500Pa air pressure sensor mounted on I/O module.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri FET]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital outputs, FET outputs sinking to GND. Max 1 Amp per channel.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri PID1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| PID regulator, with a PT1000 input and a 0-10V analog output. On-board STM32F030 for host-independent operation.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri Pt1000]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two PT1000 temperature sensor inputs.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485I]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Isolated RS-485 port. On-board STM32G431KB to implement protocols, such as Modbus RTU.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485U]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two non-isolated RS-485 ports. On-board STM32F030 implementing Modbus protocol, either as master or slave device.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri SSR]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two Solid State Relays, ON/OFF.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri TRIAC1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four Triac outputs, driving 24V AC.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|}&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;
| ''[[Colibri-8pi]]''&lt;br /&gt;
| Carrier board&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 7 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri-16pi]]''&lt;br /&gt;
| Carrier board&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 15 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
All Schematics are licensed with the GPLv3, meaning that you are free to make your own designs or manufacture devices using these. We expect that if you derive new design, that you publish these, preferably on this website.&lt;br /&gt;
&lt;br /&gt;
The software will also be published with GPLv3, when something is workable.&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri&amp;diff=7398</id>
		<title>Colibri</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri&amp;diff=7398"/>
		<updated>2026-04-28T04:19:30Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Boards */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width: 250px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;width: 250px; height: 150px; overflow: hidden; position: relative; background: #000;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;position: absolute; top: -20px; left: -15px;&amp;quot;&amp;gt;&lt;br /&gt;
        [[File:Colibri_8_photo1.jpg|250px|link=File:Colibri_8_photo1.jpg|alt=Colibri 8 PCB]]&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[File:Colibri-3-6.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri_3a_photo1.jpg|thumb|250px]]&lt;br /&gt;
[[File:Colibri rs485u-2.jpg|180px|thumb]]&lt;br /&gt;
[[File:Colibri aic-RevA-2.jpg|180px|thumb]]&lt;br /&gt;
&lt;br /&gt;
Check out the [[Colibri Videos]] on Youtube.&lt;br /&gt;
&lt;br /&gt;
Colibri is a low-cost automation system, primarily intended for building automation, home automation, energy supervision, agriculture supervision and similar systems. Main features beside costs are;&lt;br /&gt;
* Flexible I/O system, via MCU modules and I/O modules in M.2 Key E sockets. Many types already developed.&lt;br /&gt;
* Power supply of 9-36 Volt, either AC or DC (some I/O cards won't work with DC supply, and some not with AC supply)&lt;br /&gt;
* Each I/O slot can be powered-up/down individually from the MCU.&lt;br /&gt;
* Each I/O slot is addressable individually.&lt;br /&gt;
* MCU communicates with each I/O slot via I2C and/or SPI. The I2C bus is multiplexed to avoid address collision. SPI uses one Chip Select per I/O slot and 2 additional Chip Select if multi SPI devices are on a single I/O module.&lt;br /&gt;
* Each I/O module has an 1Mbit EEPROM with calibration parameters and a WebAssembly program for the MCU module to execute.&lt;br /&gt;
* Some I/O modules have on-board secondary processors for time-critical or other reasons, for instance RS-485 communication, digital inputs (pulse counting) and PID regulator.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Colibri_Architecture-1.svg|240px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Colors in this view represents who creates the software for each part.&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
The Colibri system is designed around two main external projects, [[Colibri Zephyr|Zephyr]] and WebAssembly ([https://github.com/wasm3/wasm3 wasm3]).&lt;br /&gt;
&lt;br /&gt;
Zephyr provides a lot of ''operating system'' type of features, like task scheduling, concurrency data types, timers, peripheral drivers and cross-platform compatibility to be able to support STM32, RP2354 and possibly other MCU families. And combining that with a WebAssembly environment, we should be able to have a lot of platform independence.&lt;br /&gt;
&lt;br /&gt;
The WebAssembly approach is to allow for;&lt;br /&gt;
* I/O modules that are unknown to the MCU module to be installed without re-flashing the firmware,&lt;br /&gt;
* Uploading of user programs, without flashing the firmware,&lt;br /&gt;
* Sandboxed execution to limit issues that user programs can create,&lt;br /&gt;
* Simplified tool chain,&lt;br /&gt;
* Deferring the choice of programming languages,&lt;br /&gt;
* Future-proofing for programming evolution, option to create our own language.&lt;br /&gt;
&lt;br /&gt;
== Carrier Boards ==&lt;br /&gt;
* ''Colibri 3a'' has 2 I/O slots and one MCU slot, one USB-C port to the MCU slot, Jolt Connect pin header for programming.&lt;br /&gt;
* ''Colibri 8'' is like the ''Colibri 3a'', but with 7 I/O slots and an isolated RS-485 port to the MCU slot.&lt;br /&gt;
* Planned; ''Colibri 8pi'' is like the ''Colibri 8'' but with a full-fledged Raspberry Pi Compute Module 5. 1 Colibri MCU slot and 7 I/O slots,&lt;br /&gt;
* Planned; ''Colibri 16pi'' is like the ''Colibri 8pi'', but with 15 I/O slots rather than 7.&lt;br /&gt;
&lt;br /&gt;
== MCU Modules ==&lt;br /&gt;
There is a choice, and more will follow;&lt;br /&gt;
&lt;br /&gt;
* ''[[Colibri MCU1]]'' - MCU module with a STM32WLE5, 256kB Flash, 64kB RAM, on-chip LoRa and LoraWAN protocol available in STM32CubeMX.&lt;br /&gt;
* ''[[Colibri MCU2]]'' - MCU module with a STM32H562RG, 1024kB Flash, 640kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU3]]'' - MCU module with a STM32F405RG, 1MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU4]]'' - MCU module with a STM32L475RG, 1MB Flash, 128kB RAM and a 16MB external flash memory.&lt;br /&gt;
* ''[[Colibri MCU5]]'' - (deprecated) MCU module with a STM32F103RE, 512kB Flash and 64kB RAM. No external flash memory.&lt;br /&gt;
* ''[[Colibri MCU6]]'' - MCU module with a RP2354B, 2MB Flash, 192kB+4kB RAM and a 16MB external flash memory.&lt;br /&gt;
&lt;br /&gt;
== I/O Modules ==&lt;br /&gt;
The Colibri system is based around the M.2 connector and a non-standard bus for I2C and SPI communications. Each I/O module has an [[Colibri_EEPROM_Layout|EEPROM memory]] available to identify which module is present in each I/O slot, links to documentation, calibration parameters, testing results and (up to) 16kB of WebAssembly for the MCU module to execute.&lt;br /&gt;
&lt;br /&gt;
== [[Colibri Form Factor|Form Factor]] ==&lt;br /&gt;
&lt;br /&gt;
Both Colibri I/O modules and MCU modules are 22x42mm and has an edge connector called M.2 Key E, '''but it doesn't follow the M.2 specification for Key E'''. The distance between the I/O slots are specified to 23.5mm,&lt;br /&gt;
theoretically making it possible for multi-slot I/O modules (none are planned).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF4444&amp;quot;&amp;gt;'''WARNING!!! Do NOT plug Colibri I/O modules nor any MCU module into other equipment. Do NOT plug any M.2 card into a Colibri system, unless that card/board is specifically made for Colibri.'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modules &amp;amp; Carriers ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&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;
| ''[[Colibri 3a]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri carrier board with 2 I/O slots and one MCU slot. MCU slot is to be populated with any of the MCU variants available.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 8]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Colibri carrier board with Colibri MCU slot and 7 Colibri I/O slots. &lt;br /&gt;
| Early Access&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri 1dp]]''&lt;br /&gt;
| Colibri Carrier&lt;br /&gt;
| Minimal Colibri Host with a single MCU slot and 0-500Pa air pressure sensor.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU1]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32WLE5CC, for LoraWAN applications.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU2]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32H562RG and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU3]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32F405RG and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU4]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a STM32L475RGTx and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri MCU6]]''&lt;br /&gt;
| Host MCU&lt;br /&gt;
| MCU module with a Raspberry Pi RP2354B and a 16MB flash memory.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[M.2 E Breakout]]''&lt;br /&gt;
| M.2 breakout board&lt;br /&gt;
| Generic breakout board for M.2 E key boards.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIC]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-20mA inputs&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AIV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V inputs&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri AQV]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two analog 0-10V outputs&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DII]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two ISOLATED digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIO1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| IEC 61131-2 compliant, 4-channels digital inputs and outputs.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DIU]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital inputs, for state, counter, pulsewidth measurement. On-board STM32F030 for ability to count very fast pulses and high accuracy PWM measurements.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri DP1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| A 0-500Pa air pressure sensor mounted on I/O module.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri FET]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four digital outputs, FET outputs sinking to GND. Max 1 Amp per channel.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri PID1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| PID regulator, with a PT1000 input and a 0-10V analog output. On-board STM32F030 for host-independent operation.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri Pt1000]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two PT1000 temperature sensor inputs.&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485I]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Isolated RS-485 port. On-board STM32G431KB to implement protocols, such as Modbus RTU.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri RS485U]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two non-isolated RS-485 ports. On-board STM32F030 implementing Modbus protocol, either as master or slave device.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri SSR]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Two Solid State Relays, ON/OFF.&lt;br /&gt;
| Prototypes&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri TRIAC1]]''&lt;br /&gt;
| I/O module&lt;br /&gt;
| Four Triac outputs, driving 24V AC.&lt;br /&gt;
| Prototyping&lt;br /&gt;
|}&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;
| ''[[Colibri-8pi]]''&lt;br /&gt;
| Carrier board&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 7 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Colibri-16pi]]''&lt;br /&gt;
| Carrier board&lt;br /&gt;
| Colibri carrier board with Raspberry Pi CM5, Colibri MCU slot, 15 Colibri I/O slots, two Ethernet ports, 3 USB ports and SDcard connector.&lt;br /&gt;
| Planned&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
All Schematics are licensed with the GPLv3, meaning that you are free to make your own designs or manufacture devices using these. We expect that if you derive new design, that you publish these, preferably on this website.&lt;br /&gt;
&lt;br /&gt;
The software will also be published with GPLv3, when something is workable.&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7397</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7397"/>
		<updated>2026-04-28T01:32:37Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Setting up Zephyr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Setting up Zephyr development is somewhat confusing. The [https://docs.zephyrproject.org/latest/develop/getting_started/index.html official documentation] is in my opinion somewhat misleading. At least it misled me for quite a while. I have found this to be the most straight forward, although you can probably set up with a single `zephyr/` for multiple projects, but since our target here is for only a single workspace, I am ok to occupy a lot of disk space for this.&lt;br /&gt;
&lt;br /&gt;
    mkdir colibri-zephyr    # or whatever name you want&lt;br /&gt;
    cd colibri-zephyr&lt;br /&gt;
    &lt;br /&gt;
    sudo apt update&lt;br /&gt;
    sudo apt upgrade&lt;br /&gt;
    sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
      ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
      xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
    curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-$(uname -m | sed s/aarch64/arm64/)-linux.tar.gz | tar xz&lt;br /&gt;
    mv * wasi-sdk&lt;br /&gt;
    python3 -m venv .venv&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
    pip install west&lt;br /&gt;
    west init -m https://github.com/currentmakers/colibri-runtime&lt;br /&gt;
    west update&lt;br /&gt;
    west zephyr-export&lt;br /&gt;
    west packages pip --install&lt;br /&gt;
    west sdk install -t arm-zephyr-eabi&lt;br /&gt;
    west config zephyr.toolchain-variant zephyr&lt;br /&gt;
    west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
To build [[Colibri Runtime]], go to the directory created on the first step above (&amp;lt;code&amp;gt;cd colibri-zephyr/&amp;lt;/code&amp;gt;) and run&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 --shield colibri_carrier colibri-runtime&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime development = &lt;br /&gt;
The [[Colibri Runtime]] (if you are only interested in USING the Colibri Runtime, go to that page) project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7396</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7396"/>
		<updated>2026-04-28T01:31:44Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Setting up Zephyr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Setting up Zephyr development is somewhat confusing. The [https://docs.zephyrproject.org/latest/develop/getting_started/index.html official documentation] is in my opinion somewhat misleading. At least it misled me for quite a while. I have found this to be the most straight forward, although you can probably set up with a single `zephyr/` for multiple projects, but since our target here is for only a single binary, I am ok to occupy a lot of disk space for this.&lt;br /&gt;
&lt;br /&gt;
    mkdir colibri-zephyr    # or whatever name you want&lt;br /&gt;
    cd colibri-zephyr&lt;br /&gt;
    &lt;br /&gt;
    sudo apt update&lt;br /&gt;
    sudo apt upgrade&lt;br /&gt;
    sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
      ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
      xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
    curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-$(uname -m | sed s/aarch64/arm64/)-linux.tar.gz | tar xz&lt;br /&gt;
    mv * wasi-sdk&lt;br /&gt;
    python3 -m venv .venv&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
    pip install west&lt;br /&gt;
    west init -m https://github.com/currentmakers/colibri-runtime&lt;br /&gt;
    west update&lt;br /&gt;
    west zephyr-export&lt;br /&gt;
    west packages pip --install&lt;br /&gt;
    west sdk install -t arm-zephyr-eabi&lt;br /&gt;
    west config zephyr.toolchain-variant zephyr&lt;br /&gt;
    west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
To build [[Colibri Runtime]], go to the directory created on the first step above (&amp;lt;code&amp;gt;cd colibri-zephyr/&amp;lt;/code&amp;gt;) and run&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 --shield colibri_carrier colibri-runtime&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime development = &lt;br /&gt;
The [[Colibri Runtime]] (if you are only interested in USING the Colibri Runtime, go to that page) project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7395</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7395"/>
		<updated>2026-04-28T01:26:07Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Developing with Zephyr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Setting up Zephyr development is somewhat confusing. The https://docs.zephyrproject.org/latest/develop/getting_started/index.html official documentation] is in my opinion somewhat misleading. At least it misled me for quite a while. I have found this to be the most straight forward, although you can probably set up with a single `zephyr/` for multiple projects, but since our target here is for only a single binary, I am ok to occupy a lot of disk space for this.&lt;br /&gt;
&lt;br /&gt;
    mkdir colibri-zephyr    # or whatever name you want&lt;br /&gt;
    cd colibri-zephyr&lt;br /&gt;
    &lt;br /&gt;
    sudo apt update&lt;br /&gt;
    sudo apt upgrade&lt;br /&gt;
    sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
      ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
      xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
    curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-$(uname -m | sed s/aarch64/arm64/)-linux.tar.gz | tar xz&lt;br /&gt;
    mv * wasi-sdk&lt;br /&gt;
    python3 -m venv .venv&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
    pip install west&lt;br /&gt;
    west init -m https://github.com/currentmakers/colibri-runtime&lt;br /&gt;
    west update&lt;br /&gt;
    west zephyr-export&lt;br /&gt;
    west packages pip --install&lt;br /&gt;
    west sdk install -t arm-zephyr-eabi&lt;br /&gt;
    west config zephyr.toolchain-variant zephyr&lt;br /&gt;
    west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
To build [[Colibri Runtime]], go to the directory created on the first step above (&amp;lt;code&amp;gt;cd colibri-zephyr/&amp;lt;/code&amp;gt;) and run&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 --shield colibri_carrier colibri-runtime&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime development = &lt;br /&gt;
The [[Colibri Runtime]] (if you are only interested in USING the Colibri Runtime, go to that page) project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7394</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7394"/>
		<updated>2026-04-28T01:22:28Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Setting up Zephyr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Setting up Zephyr development is somewhat confusing. The https://docs.zephyrproject.org/latest/develop/getting_started/index.html official documentation] is in my opinion somewhat misleading. At least it misled me for quite a while. I have found this to be the most straight forward, although you can probably set up with a single `zephyr/` for multiple projects, but since our target here is for only a single binary, I am ok to occupy a lot of disk space for this.&lt;br /&gt;
&lt;br /&gt;
    mkdir colibri-zephyr    # or whatever name you want&lt;br /&gt;
    cd colibri-zephyr&lt;br /&gt;
    &lt;br /&gt;
    sudo apt update&lt;br /&gt;
    sudo apt upgrade&lt;br /&gt;
    sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
      ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
      xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
    curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-$(uname -m | sed s/aarch64/arm64/)-linux.tar.gz | tar xz&lt;br /&gt;
    mv * wasi-sdk&lt;br /&gt;
    python3 -m venv .venv&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
    pip install west&lt;br /&gt;
    west init -m https://github.com/currentmakers/colibri-runtime&lt;br /&gt;
    west update&lt;br /&gt;
    west zephyr-export&lt;br /&gt;
    west packages pip --install&lt;br /&gt;
    west sdk install -t arm-zephyr-eabi&lt;br /&gt;
    west config zephyr.toolchain-variant zephyr&lt;br /&gt;
    west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
For any given Zephyr project, for instance the ones in [https://github.com/currentmakers/zephyr-examples] you build like this&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 -- -DSHIELD=colibri_carrier&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime development = &lt;br /&gt;
The [[Colibri Runtime]] (if you are only interested in USING the Colibri Runtime, go to that page) project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7393</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7393"/>
		<updated>2026-04-28T01:20:21Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Setting up Zephyr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Setting up Zephyr development is somewhat confusing. The https://docs.zephyrproject.org/latest/develop/getting_started/index.html official documentation] is in my opinion somewhat misleading. At least it misled me for quite a while. I have found this to be the most straight forward, although you can probably set up with a single `zephyr/` for multiple projects, but since our target here is for only a single binary, I am ok to occupy a lot of disk space for this.&lt;br /&gt;
&lt;br /&gt;
    mkdir colibri-zephyr    # or whatever name you want&lt;br /&gt;
    cd colibri-zephyr&lt;br /&gt;
&lt;br /&gt;
    sudo apt update&lt;br /&gt;
    sudo apt upgrade&lt;br /&gt;
    sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
      ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
      xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
    curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-$(uname -m | sed s/aarch64/arm64/)-linux.tar.gz | tar xz&lt;br /&gt;
    mv * wasi-sdk&lt;br /&gt;
    python3 -m venv .venv&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
    pip install west&lt;br /&gt;
    west init -m https://github.com/currentmakers/colibri-runtime&lt;br /&gt;
    west update&lt;br /&gt;
    west zephyr-export&lt;br /&gt;
    west packages pip --install&lt;br /&gt;
    west sdk install -t arm-zephyr-eabi&lt;br /&gt;
    west config zephyr.toolchain-variant zephyr&lt;br /&gt;
    west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
For any given Zephyr project, for instance the ones in [https://github.com/currentmakers/zephyr-examples] you build like this&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 -- -DSHIELD=colibri_carrier&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime development = &lt;br /&gt;
The [[Colibri Runtime]] (if you are only interested in USING the Colibri Runtime, go to that page) project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7392</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7392"/>
		<updated>2026-04-27T23:54:06Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Setting up Zephyr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Setting up Zephyr development is somewhat confusing. The https://docs.zephyrproject.org/latest/develop/getting_started/index.html official documentation] is in my opinion somewhat misleading. At least it misled me for quite a while. I have found this to be the most straight forward, although you can probably set up with a single `zephyr/` for multiple projects, but since our target here is for only a single binary, I am ok to occupy a lot of disk space for this.&lt;br /&gt;
&lt;br /&gt;
    mkdir colibri-zephyr    # or whatever name you want&lt;br /&gt;
    cd colibri-zephyr&lt;br /&gt;
&lt;br /&gt;
    sudo apt update&lt;br /&gt;
    sudo apt upgrade&lt;br /&gt;
    sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
      ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
      xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
    curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-$(uname -m | sed s/aarch64/arm64/)-linux.tar.gz | tar xz&lt;br /&gt;
    mv * wasi-sdk&lt;br /&gt;
    python3 -m venv .venv&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    echo &amp;quot;export CMAKE_ASM_COMPILER=$HOME/zephyr-sdk-1.0.1/gnu/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc&amp;quot;  &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
    pip install west&lt;br /&gt;
    west init -m https://github.com/currentmakers/colibri-runtime&lt;br /&gt;
    west update&lt;br /&gt;
    west zephyr-export&lt;br /&gt;
    west packages pip --install&lt;br /&gt;
    west sdk install -t arm-zephyr-eabi&lt;br /&gt;
    west config zephyr.toolchain-variant zephyr&lt;br /&gt;
    west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
For any given Zephyr project, for instance the ones in [https://github.com/currentmakers/zephyr-examples] you build like this&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 -- -DSHIELD=colibri_carrier&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime development = &lt;br /&gt;
The [[Colibri Runtime]] (if you are only interested in USING the Colibri Runtime, go to that page) project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7391</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7391"/>
		<updated>2026-04-27T23:53:38Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Setting up Zephyr development is somewhat confusing. The https://docs.zephyrproject.org/latest/develop/getting_started/index.html official documentation] is in my opinion somewhat misleading. At least it misled me for quite a while. I have found this to be the most straight forward, although you can probably set up with a single `zephyr/` for multiple projects, but since our target here is for only a single binary, I am ok to occupy a lot of disk space for this.&lt;br /&gt;
&lt;br /&gt;
    mkdir colibri-zephyr    # or whatever name you want&lt;br /&gt;
    cd colibri-zephyr&lt;br /&gt;
&lt;br /&gt;
    sudo apt update&lt;br /&gt;
    sudo apt upgrade&lt;br /&gt;
    sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
      ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
      xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
    curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-$(uname -m | sed s/aarch64/arm64/)-linux.tar.gz | tar xz&lt;br /&gt;
    mv * wasi-sdk&lt;br /&gt;
    python3 -m venv .venv&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    echo &amp;quot;export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-1.0.1&amp;quot; &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    echo &amp;quot;export CMAKE_ASM_COMPILER=/home/niclas/zephyr-sdk-1.0.1/gnu/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc&amp;quot;  &amp;gt;&amp;gt;.venv/bin/activate&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
    pip install west&lt;br /&gt;
    west init -m https://github.com/currentmakers/colibri-runtime&lt;br /&gt;
    west update&lt;br /&gt;
    west zephyr-export&lt;br /&gt;
    west packages pip --install&lt;br /&gt;
    west sdk install -t arm-zephyr-eabi&lt;br /&gt;
    west config zephyr.toolchain-variant zephyr&lt;br /&gt;
    west config zephyr.sdk-install-dir $HOME/zephyr-sdk-1.0.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
For any given Zephyr project, for instance the ones in [https://github.com/currentmakers/zephyr-examples] you build like this&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 -- -DSHIELD=colibri_carrier&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime development = &lt;br /&gt;
The [[Colibri Runtime]] (if you are only interested in USING the Colibri Runtime, go to that page) project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7389</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7389"/>
		<updated>2026-04-27T05:47:33Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Setting up Zephyr development is somewhat confusing. The https://docs.zephyrproject.org/latest/develop/getting_started/index.html official documentation] is in my opinion somewhat misleading. At least it misled me for quite a while. I have found this to be the most straight forward, although you can probably set up with a single `zephyr/` for multiple projects, but since our target here is for only a single binary, I am ok to occupy a lot of disk space for this.&lt;br /&gt;
&lt;br /&gt;
    mkdir colibri-zephyr    # or whatever name you want&lt;br /&gt;
    cd colibri-zephyr&lt;br /&gt;
&lt;br /&gt;
    sudo apt update&lt;br /&gt;
    sudo apt upgrade&lt;br /&gt;
    sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
      ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
      xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
    curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-$(uname -m | sed s/aarch64/arm64/)-linux.tar.gz | tar xz&lt;br /&gt;
    mv * wasi-sdk&lt;br /&gt;
    python3 -m venv .venv&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
    pip install west&lt;br /&gt;
    west init -m https://github.com/currentmakers/colibri-runtime&lt;br /&gt;
    west update&lt;br /&gt;
    west zephyr-export&lt;br /&gt;
    west packages pip --install&lt;br /&gt;
    west sdk install -t arm-zephyr-eabi&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
For any given Zephyr project, for instance the ones in [https://github.com/currentmakers/zephyr-examples] you build like this&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 -- -DSHIELD=colibri_carrier&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime development = &lt;br /&gt;
The [[Colibri Runtime]] (if you are only interested in USING the Colibri Runtime, go to that page) project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7388</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7388"/>
		<updated>2026-04-27T05:33:04Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Setting up Zephyr development is somewhat confusing. The https://docs.zephyrproject.org/latest/develop/getting_started/index.html official documentation] is in my opinion somewhat misleading. At least it misled me for quite a while. Do this;&lt;br /&gt;
&lt;br /&gt;
    mkdir colibri-zephyr    # or whatever name you want&lt;br /&gt;
    &lt;br /&gt;
    sudo apt update&lt;br /&gt;
    sudo apt upgrade&lt;br /&gt;
    sudo apt install --no-install-recommends git cmake ninja-build gperf \&lt;br /&gt;
      ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \&lt;br /&gt;
      xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 curl&lt;br /&gt;
    mkdir wasi-sdk&lt;br /&gt;
    curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-$(uname -m | sed s/aarch64/arm64/)-linux.tar.gz | tar xf&lt;br /&gt;
    mv * wasi-sdk&lt;br /&gt;
    python3 -m venv .venv&lt;br /&gt;
    source .venv/bin/activate&lt;br /&gt;
    pip install west&lt;br /&gt;
    west init -m https://github.com/currentmakers/colibri-runtime&lt;br /&gt;
    west update&lt;br /&gt;
    west zephyr-export&lt;br /&gt;
    west packages pip --install&lt;br /&gt;
    west sdk install -t -zephyr-eabi&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
For any given Zephyr project, for instance the ones in [https://github.com/currentmakers/zephyr-examples] you build like this&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 -- -DSHIELD=colibri_carrier&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime development = &lt;br /&gt;
The [[Colibri Runtime]] (if you are only interested in USING the Colibri Runtime, go to that page) project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7383</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7383"/>
		<updated>2026-04-24T05:25:36Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Colibri Runtime */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Follow the installation instructions on [https://docs.zephyrproject.org/latest/develop/getting_started/index.html Zephyr's Getting Started documentation].&lt;br /&gt;
&lt;br /&gt;
You will end up with a &amp;lt;code&amp;gt;${HOME}/zephyrproject&amp;lt;/code&amp;gt; directory. If you chose to place that elsewhere, the instructions below must be adjusted.&lt;br /&gt;
&lt;br /&gt;
Check out [https://github.com/currentmakers/zephyr-cm https://github.com/currentmakers/zephyr-cm]&lt;br /&gt;
&lt;br /&gt;
Create a &amp;lt;code&amp;gt;${HOME}/.zephyrrc&amp;lt;/code&amp;gt; with the following content;&lt;br /&gt;
    export ZEPHYR_BASE=${HOME}/zephyrproject/zephyr/                                                                # Maybe change this&lt;br /&gt;
    export ZEPHYR_EXTRA_MODULES=&amp;quot;${HOME}/dev/currentmakers/zephyr-cm;${HOME}/dev/currentmakers/zephyr-ws2812b-pwm&amp;quot;  # &amp;lt;--- CHANGE THIS&lt;br /&gt;
&lt;br /&gt;
Create a file &amp;lt;code&amp;gt;init-zephyr&amp;lt;/code&amp;gt; and place somewhere you easily remember how to access it. Let's assume it is in &amp;lt;code&amp;gt;${HOME}&amp;lt;/code&amp;gt;. Following content;&lt;br /&gt;
    export ZEPHYR_BASE=${HOME}/zephyrproject/zephyr&lt;br /&gt;
    export ZEPHYR_SDK_INSTALL_DIR=${HOME}/zephyr-sdk-1.0.1&lt;br /&gt;
    export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&lt;br /&gt;
    &lt;br /&gt;
    source ${ZEPHYR_BASE}/../.venv/bin/activate&lt;br /&gt;
    source ${ZEPHYR_BASE}/zephyr-env.sh&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
After opening the terminal to compile, remember to run &lt;br /&gt;
    . ${HOME}/init-zephyr&lt;br /&gt;
to enable the Python environment and set up the paths.&lt;br /&gt;
&lt;br /&gt;
For any given Zephyr project, for instance the ones in [https://github.com/currentmakers/zephyr-examples] you build like this&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 -- -DSHIELD=colibri_carrier&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime development = &lt;br /&gt;
The [[Colibri Runtime]] (if you are only interested in USING the Colibri Runtime, go to that page) project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7382</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7382"/>
		<updated>2026-04-24T05:24:00Z</updated>

		<summary type="html">&lt;p&gt;Niclas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Follow the installation instructions on [https://docs.zephyrproject.org/latest/develop/getting_started/index.html Zephyr's Getting Started documentation].&lt;br /&gt;
&lt;br /&gt;
You will end up with a &amp;lt;code&amp;gt;${HOME}/zephyrproject&amp;lt;/code&amp;gt; directory. If you chose to place that elsewhere, the instructions below must be adjusted.&lt;br /&gt;
&lt;br /&gt;
Check out [https://github.com/currentmakers/zephyr-cm https://github.com/currentmakers/zephyr-cm]&lt;br /&gt;
&lt;br /&gt;
Create a &amp;lt;code&amp;gt;${HOME}/.zephyrrc&amp;lt;/code&amp;gt; with the following content;&lt;br /&gt;
    export ZEPHYR_BASE=${HOME}/zephyrproject/zephyr/                                                                # Maybe change this&lt;br /&gt;
    export ZEPHYR_EXTRA_MODULES=&amp;quot;${HOME}/dev/currentmakers/zephyr-cm;${HOME}/dev/currentmakers/zephyr-ws2812b-pwm&amp;quot;  # &amp;lt;--- CHANGE THIS&lt;br /&gt;
&lt;br /&gt;
Create a file &amp;lt;code&amp;gt;init-zephyr&amp;lt;/code&amp;gt; and place somewhere you easily remember how to access it. Let's assume it is in &amp;lt;code&amp;gt;${HOME}&amp;lt;/code&amp;gt;. Following content;&lt;br /&gt;
    export ZEPHYR_BASE=${HOME}/zephyrproject/zephyr&lt;br /&gt;
    export ZEPHYR_SDK_INSTALL_DIR=${HOME}/zephyr-sdk-1.0.1&lt;br /&gt;
    export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&lt;br /&gt;
    &lt;br /&gt;
    source ${ZEPHYR_BASE}/../.venv/bin/activate&lt;br /&gt;
    source ${ZEPHYR_BASE}/zephyr-env.sh&lt;br /&gt;
&lt;br /&gt;
== Developing with Zephyr ==&lt;br /&gt;
&lt;br /&gt;
After opening the terminal to compile, remember to run &lt;br /&gt;
    . ${HOME}/init-zephyr&lt;br /&gt;
to enable the Python environment and set up the paths.&lt;br /&gt;
&lt;br /&gt;
For any given Zephyr project, for instance the ones in [https://github.com/currentmakers/zephyr-examples] you build like this&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 -- -DSHIELD=colibri_carrier&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
= Colibri Runtime = &lt;br /&gt;
The [[Colibri Runtime]] project is [https://github.com/currentmakers/colibri-runtime available on Github] and after [https://docs.zephyrproject.org/latest/develop/getting_started/index.html setting up Zephyr], checking out the [https://github.com/currentmakers/zephyr-ws2812b-pwm WS2812B PWM driver] and the [https://github.com/currentmakers/zephyr-cm Colibri device tree], with the paths set up correctly as described above, you should be able to build it.&lt;br /&gt;
&lt;br /&gt;
Currently we have the following directory structure of the project, ignoring the build directory(ies).&lt;br /&gt;
&lt;br /&gt;
    ├── app.overlay &lt;br /&gt;
    ├── CMakeLists.txt&lt;br /&gt;
    ├── prj.conf&lt;br /&gt;
    ├── README.md&lt;br /&gt;
    └── src&lt;br /&gt;
        ├── fs&lt;br /&gt;
        │   ├── fs.h&lt;br /&gt;
        │   ├── littlefs.c&lt;br /&gt;
        │   └── nvs.c&lt;br /&gt;
        ├── leds&lt;br /&gt;
        │   ├── leds.c&lt;br /&gt;
        │   ├── leds.h&lt;br /&gt;
        │   └── neopixels.c&lt;br /&gt;
        ├── main.c&lt;br /&gt;
        └── slots&lt;br /&gt;
            ├── slotcount.c&lt;br /&gt;
            ├── slotctrl.c&lt;br /&gt;
            └── slotctrl.h&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7381</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7381"/>
		<updated>2026-04-24T05:16:49Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Developing with Zephyr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Follow the installation instructions on [https://docs.zephyrproject.org/latest/develop/getting_started/index.html Zephyr's Getting Started documentation].&lt;br /&gt;
&lt;br /&gt;
You will end up with a &amp;lt;code&amp;gt;${HOME}/zephyrproject&amp;lt;/code&amp;gt; directory. If you chose to place that elsewhere, the instructions below must be adjusted.&lt;br /&gt;
&lt;br /&gt;
Check out [https://github.com/currentmakers/zephyr-cm https://github.com/currentmakers/zephyr-cm]&lt;br /&gt;
&lt;br /&gt;
Create a &amp;lt;code&amp;gt;${HOME}/.zephyrrc&amp;lt;/code&amp;gt; with the following content;&lt;br /&gt;
    export ZEPHYR_BASE=${HOME}/zephyrproject/zephyr/                                                                # Maybe change this&lt;br /&gt;
    export ZEPHYR_EXTRA_MODULES=&amp;quot;${HOME}/dev/currentmakers/zephyr-cm;${HOME}/dev/currentmakers/zephyr-ws2812b-pwm&amp;quot;  # &amp;lt;--- CHANGE THIS&lt;br /&gt;
&lt;br /&gt;
Create a file &amp;lt;code&amp;gt;init-zephyr&amp;lt;/code&amp;gt; and place somewhere you easily remember how to access it. Let's assume it is in &amp;lt;code&amp;gt;${HOME}&amp;lt;/code&amp;gt;. Following content;&lt;br /&gt;
    export ZEPHYR_BASE=${HOME}/zephyrproject/zephyr&lt;br /&gt;
    export ZEPHYR_SDK_INSTALL_DIR=${HOME}/zephyr-sdk-1.0.1&lt;br /&gt;
    export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&lt;br /&gt;
    &lt;br /&gt;
    source ${ZEPHYR_BASE}/../.venv/bin/activate&lt;br /&gt;
    source ${ZEPHYR_BASE}/zephyr-env.sh&lt;br /&gt;
&lt;br /&gt;
= Developing with Zephyr =&lt;br /&gt;
&lt;br /&gt;
After opening the terminal to compile, remember to run &lt;br /&gt;
    . ${HOME}/init-zephyr&lt;br /&gt;
to enable the Python environment and set up the paths.&lt;br /&gt;
&lt;br /&gt;
For any given Zephyr project, for instance the ones in [https://github.com/currentmakers/zephyr-examples] you build like this&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 -- -DSHIELD=colibri_carrier&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7380</id>
		<title>Colibri Zephyr</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Colibri_Zephyr&amp;diff=7380"/>
		<updated>2026-04-24T05:15:58Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Setting up Zephyr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Colibri]][[Category:Work in progress]]{{metadesc|Colibri Automation System}}&lt;br /&gt;
&lt;br /&gt;
Colibri is intended to be used by systems integrators, makers, automation engineers, home automation enthusiasts and in general people how doesn't necessarily know how to write low-level programs or operate soldering iron. That means that &amp;quot;flashing an image&amp;quot; to the MCU is beyond what is expected by the potential customers.&lt;br /&gt;
&lt;br /&gt;
Instead, we need an &amp;quot;operating system&amp;quot;, where we can deploy user applications without low-level programming skills. With that comes two challenges;&lt;br /&gt;
&lt;br /&gt;
1. How are those applications written?&lt;br /&gt;
&lt;br /&gt;
2. How are they going to be executed on the Colibri MCUs?&lt;br /&gt;
&lt;br /&gt;
TL;DR &lt;br /&gt;
* A ''user application'' will deployed in a so called [https://en.wikipedia.org/wiki/WebAssembly ''Web Assembly''] runtime. The number and size of user applications are dependent on available RAM in the MCU.&lt;br /&gt;
* Each I/O module will contain its own ''Web Assembly'' driver that user applications will be able to interface with. &lt;br /&gt;
* I/O driver is (initially?) limited to 16kB in size and will run inside its own ''Web Assembly'' runtime and given time slots to execute, via a &amp;lt;code&amp;gt;tick(slot_number)&amp;lt;/code&amp;gt; function call at a (per I/O slot) settable interval. I/O modules may also emit '''''events''''' that applications can subscribe to. The exact API is documented for each Colibri I/O module.&lt;br /&gt;
&lt;br /&gt;
It could happen that domain-specific languages are to be developed for this environment. Or perhaps, we will managed to get [https://autonomylogic.com/runtime OpenPLC] running on ''Web Assembly''. It is a little bit too early to tell in which direction this will be going.&lt;br /&gt;
&lt;br /&gt;
= What is Zephyr? =&lt;br /&gt;
From [https://docs.zephyrproject.org/latest/introduction/index.html Zephyr's website];&lt;br /&gt;
&lt;br /&gt;
    The Zephyr OS is based on a small-footprint kernel designed for use on resource-constrained&lt;br /&gt;
    and embedded systems: from simple embedded environmental sensors and LED wearables to sophisticated &lt;br /&gt;
    embedded controllers, smart watches, and IoT wireless applications.&lt;br /&gt;
&lt;br /&gt;
Please read the entire [https://docs.zephyrproject.org/latest/introduction/index.html introduction page].&lt;br /&gt;
&lt;br /&gt;
Additionally to task scheduling, we also get '''cross-platform APIs for SPI and I2C peripherals''', as well as access to many Zephyr libraries, such as '''Modbus/RTU, TCP/IP, MQTT''' and much more.&lt;br /&gt;
&lt;br /&gt;
= Supported Boards =&lt;br /&gt;
* [[Streamline MCU STM32F407]]&lt;br /&gt;
* [[Colibri MCU3]]&lt;br /&gt;
* [[Colibri 3a]]&lt;br /&gt;
* [[Colibri 8]]&lt;br /&gt;
&lt;br /&gt;
= Colibri Integration =&lt;br /&gt;
Colibri carrier boards and Colibri MCU modules are being integrated with Zephyr. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Setting up Zephyr =&lt;br /&gt;
Follow the installation instructions on [https://docs.zephyrproject.org/latest/develop/getting_started/index.html Zephyr's Getting Started documentation].&lt;br /&gt;
&lt;br /&gt;
You will end up with a &amp;lt;code&amp;gt;${HOME}/zephyrproject&amp;lt;/code&amp;gt; directory. If you chose to place that elsewhere, the instructions below must be adjusted.&lt;br /&gt;
&lt;br /&gt;
Check out [https://github.com/currentmakers/zephyr-cm https://github.com/currentmakers/zephyr-cm]&lt;br /&gt;
&lt;br /&gt;
Create a &amp;lt;code&amp;gt;${HOME}/.zephyrrc&amp;lt;/code&amp;gt; with the following content;&lt;br /&gt;
    export ZEPHYR_BASE=${HOME}/zephyrproject/zephyr/                                                                # Maybe change this&lt;br /&gt;
    export ZEPHYR_EXTRA_MODULES=&amp;quot;${HOME}/dev/currentmakers/zephyr-cm;${HOME}/dev/currentmakers/zephyr-ws2812b-pwm&amp;quot;  # &amp;lt;--- CHANGE THIS&lt;br /&gt;
&lt;br /&gt;
Create a file &amp;lt;code&amp;gt;init-zephyr&amp;lt;/code&amp;gt; and place somewhere you easily remember how to access it. Let's assume it is in &amp;lt;code&amp;gt;${HOME}&amp;lt;/code&amp;gt;. Following content;&lt;br /&gt;
    export ZEPHYR_BASE=${HOME}/zephyrproject/zephyr&lt;br /&gt;
    export ZEPHYR_SDK_INSTALL_DIR=${HOME}/zephyr-sdk-1.0.1&lt;br /&gt;
    export ZEPHYR_TOOLCHAIN_VARIANT=zephyr&lt;br /&gt;
    &lt;br /&gt;
    source ${ZEPHYR_BASE}/../.venv/bin/activate&lt;br /&gt;
    source ${ZEPHYR_BASE}/zephyr-env.sh&lt;br /&gt;
&lt;br /&gt;
= Developing with Zephyr =&lt;br /&gt;
&lt;br /&gt;
After opening the terminal to compile, remember to run &lt;br /&gt;
    . ${HOME}/init-zephyr&lt;br /&gt;
to enable the Python environment and set up the paths.&lt;br /&gt;
&lt;br /&gt;
For any given Zephyr project, for instance the ones in [https://github.com/currentmakers/zephyr-examples] you build like this&lt;br /&gt;
&lt;br /&gt;
    west build -b colibri_mcu3 -- -DSHIELD=colibri_8&lt;br /&gt;
&lt;br /&gt;
and the &amp;lt;code&amp;gt;.elf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt; output files are in &amp;lt;code&amp;gt;build/zephyr&amp;lt;/code&amp;gt; and can be flashed as usual with&lt;br /&gt;
&lt;br /&gt;
    st-flash --connect-under-reset write build/zephyr/zephyr.bin 0x8000000&lt;br /&gt;
&lt;br /&gt;
(I have seen the &amp;lt;code&amp;gt;st-flash&amp;lt;/code&amp;gt; failed to access without the &amp;lt;code&amp;gt;connect-under-reset&amp;lt;/code&amp;gt;.)&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
	<entry>
		<id>https://stm32world.com/w/index.php?title=Streamline&amp;diff=7377</id>
		<title>Streamline</title>
		<link rel="alternate" type="text/html" href="https://stm32world.com/w/index.php?title=Streamline&amp;diff=7377"/>
		<updated>2026-04-21T01:59:40Z</updated>

		<summary type="html">&lt;p&gt;Niclas: /* Miscellaneous */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:STM32]][[Category:Streamline]][[Category:CurrentMakers]][[Category:Work in progress]]{{metadesc|Streamline Development Boards Home}}&lt;br /&gt;
[[File:Streamline Backplane with 2 blades - top right 3.jpg|300px|thumb|Streamline Backplane with 2 blades - 1 Connect and 1 MCU]]&lt;br /&gt;
This page documents the new [[CurrentMakers]] [[Streamline]] series of [[Green]] development boards.  If you are looking for the previous series, that is document here: [[STM32World Legacy]].&lt;br /&gt;
&lt;br /&gt;
[[Streamline]] boards are available here: [https://currentmakers.com/products/streamline/ Streamline on CurrentMakers]&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
== Rationale ==&lt;br /&gt;
[[File:3 STM32World Modules stacked.jpg|300px|thumb]]&lt;br /&gt;
A number of [[STM32World Legacy]] boards have been developed, and produced, and in general the &amp;quot;system&amp;quot; worked very well.  It did however have one fatal flaw which was the sole cause of it never being considered for more widespread production.  This flaw was the board to board connector.&lt;br /&gt;
&lt;br /&gt;
The original boards used a 2x20 standard pin header on each side giving a result of 80 pins.  In terms of connectivity this was a pretty good solution.  It did however present some issues:&lt;br /&gt;
&lt;br /&gt;
# Cost - the long pin 2x20 connectors are fairly expensive - around $0.80 each - so $1.60 per board.  This may not sound that high but when producing a lot it becomes a serious cost.&lt;br /&gt;
# Manufacturing -  the headers can not be manufactured with traditional SMD technologies but require a manual step or hand soldering.&lt;br /&gt;
# Fragile - when shipping or disconnecting boards it is hard not to bend one or more pins and once bend it becomes extremely difficult to reconnect them.&lt;br /&gt;
&lt;br /&gt;
To get around this flaw a new &amp;quot;connector&amp;quot; was considered and after a long search the best solution was the standard PCI-E X8 connector.&lt;br /&gt;
&lt;br /&gt;
== Videos ==&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|5xQqV7BhYxM}}&lt;br /&gt;
&lt;br /&gt;
Receiving the first prototypes ever:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|YS1w_8ghCf4}}&lt;br /&gt;
&lt;br /&gt;
== Backplane ==&lt;br /&gt;
&lt;br /&gt;
The overall idea is to base [[StreamLine]] around a passive backplane.  The backplane contains a number of PCI connectors with 2 x 49 pins (98) that is simply connected in a parallel bus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Sl bp 5 top left.png|1000px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In each end of the bus all the A and B signals are broken out into regular pin headers.&lt;br /&gt;
&lt;br /&gt;
=== Backplane rendering ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Backplane top render.png&lt;br /&gt;
File:Backplane front render.png&lt;br /&gt;
File:Backplane front left render.png&lt;br /&gt;
File:Sl bp 5 top.png&lt;br /&gt;
File:Sl bp 5 top left.png&lt;br /&gt;
File:Sl bp 5 top right.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modules ==&lt;br /&gt;
&lt;br /&gt;
=== [[Backplane]]s === &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Image&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| [[Streamline Backplane 5]]&lt;br /&gt;
| [[File:sl_bp_5_top_left.png|80px]]&lt;br /&gt;
| Basic 5 position backplane&lt;br /&gt;
| [https://currentmakers.com/products/streamline/streamline_backplane_5/ Available]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== [[Blade]]s ===&lt;br /&gt;
&lt;br /&gt;
==== STM32 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Image&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| [[Streamline Connect]]&lt;br /&gt;
| [[File:Sl prog top left render.png|80px]]&lt;br /&gt;
| Streamline Programmer &amp;amp; Debugger.  This module is essentially identical to [[Jolt Connect]]&lt;br /&gt;
| [https://currentmakers.com/products/streamline/streamline_connect/ Available]&lt;br /&gt;
|- &lt;br /&gt;
| [[Streamline MCU STM32F407]]&lt;br /&gt;
| [[File:Sl mcu stm32f407 top left render.png|80px]]&lt;br /&gt;
| Streamline MCU board including a [[STM32F407]]&lt;br /&gt;
| [https://currentmakers.com/products/streamline/streamline_mcu_stm32f407/ Available]&lt;br /&gt;
|- &lt;br /&gt;
| [[Streamline MCU STM32H562]]&lt;br /&gt;
| [[File:Sl mcu stm32h562 top left render.png|80px]]&lt;br /&gt;
| Streamline MCU board including a [[STM32H562]]&lt;br /&gt;
| [https://currentmakers.com/products/streamline/streamline_mcu_stm32h562/ Available]&lt;br /&gt;
|- &lt;br /&gt;
| [[Streamline MCU STM32L475]]&lt;br /&gt;
| [[File:Sl mcu stm32l475 top left render.png|80px]]&lt;br /&gt;
| Streamline MCU board including a [[STM32L475]]&lt;br /&gt;
| [https://currentmakers.com/products/streamline/streamline_mcu_stm32l475/ Available]&lt;br /&gt;
|- &lt;br /&gt;
| [[Streamline MCU STM32C511]]&lt;br /&gt;
| [[File:Sl_mcu_stm32c551_top_left_render.png|80px]]&lt;br /&gt;
| Streamline MCU board including a [[STM32C511]]&lt;br /&gt;
| [https://currentmakers.com/products/streamline/streamline_mcu_stm32c511/ Available]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Miscellaneous ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Image&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| [[Streamline Neopixel 8x8]]&lt;br /&gt;
| [[File:Sl neopixel 8x8 top left render.png|80px]]&lt;br /&gt;
| Module with an 8x8 matrix of Neopixel WS2812 LEDs&lt;br /&gt;
| [https://currentmakers.com/products/streamline/streamline_neopixel_8x8/ Available]&lt;br /&gt;
|-&lt;br /&gt;
| [[Streamline Storage SD]]&lt;br /&gt;
| [[File:Sl storage sd top left render rev A.png|80px]]&lt;br /&gt;
| Module with Micro-SD slot&lt;br /&gt;
| [https://currentmakers.com/products/streamline/streamline_sd/ Available]&lt;br /&gt;
|-&lt;br /&gt;
| [[Streamline Storage Flash]]&lt;br /&gt;
| [[File:Sl storage flash top left render.png|80px]]&lt;br /&gt;
| Module with 16 MB Flash storage ([[W25q128]])&lt;br /&gt;
| [https://currentmakers.com/products/streamline/streamline_flash/ Available]&lt;br /&gt;
|-&lt;br /&gt;
| [[Streamline Storage EEPROM]]&lt;br /&gt;
| [[File:Sl storage eeprom top left render.png|80px]]&lt;br /&gt;
| Module with 512kB EEPROM storage ([[M24M01]])&lt;br /&gt;
| [https://currentmakers.com/products/streamline/streamline_eeprom/ Available]&lt;br /&gt;
|-&lt;br /&gt;
| Streamline Real Time Clock&lt;br /&gt;
| &lt;br /&gt;
| Real time clock with on board coin cell battery (or supercap) backup&lt;br /&gt;
| Idea&lt;br /&gt;
|-&lt;br /&gt;
| Streamline ESC&lt;br /&gt;
| &lt;br /&gt;
| Electronic speed control for BLDC motors&lt;br /&gt;
| Idea&lt;br /&gt;
|-&lt;br /&gt;
| Streamline HS USB&lt;br /&gt;
| &lt;br /&gt;
| HS USB blade using [[USB3300]]&lt;br /&gt;
| Idea&lt;br /&gt;
|-&lt;br /&gt;
| Streamline CAN-FD&lt;br /&gt;
| &lt;br /&gt;
| CAN-FD bus interface&lt;br /&gt;
| Idea&lt;br /&gt;
|-&lt;br /&gt;
| Streamline Ethernet&lt;br /&gt;
| &lt;br /&gt;
| Ethernet interface for STM32F407&lt;br /&gt;
| Prototype&lt;br /&gt;
|-&lt;br /&gt;
| Streamline RS485&lt;br /&gt;
| &lt;br /&gt;
| Non-isolated RS485 interface&lt;br /&gt;
| Prototype&lt;br /&gt;
|-&lt;br /&gt;
| Streamline WiFi&lt;br /&gt;
| &lt;br /&gt;
| WiFi interface&lt;br /&gt;
| Idea&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Standard Pinout ==&lt;br /&gt;
&lt;br /&gt;
The pinout table is based on a [[MCU]] board with a 100 pin STM32F407.  Boards using [[STM32]] [[MCU]]s with less pins will leave some of the pins unused.&lt;br /&gt;
&lt;br /&gt;
{{Streamline Pinout}}&lt;br /&gt;
&lt;br /&gt;
== Prototype Photos == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Streamline Backplane with 2 blades - top right 3.jpg&lt;br /&gt;
File:Streamline Backplane with 2 blades - top right 2.jpg&lt;br /&gt;
File:Streamline Backplane with 2 blades - top right.jpg&lt;br /&gt;
File:Streamline Backplane with 2 blades - top left.jpg&lt;br /&gt;
File:Streamline Backplane with 2 blades - front.jpg&lt;br /&gt;
File:Streamline Multiple Blades.jpg&lt;br /&gt;
File:Streamline MCU STM32L475 - top view.jpg&lt;br /&gt;
File:Streamline MCU STM32L475 - bottom view.jpg&lt;br /&gt;
File:Streamline MCU STM32H562 - top view.jpg&lt;br /&gt;
File:Streamline MCU STM32H562 - bottom view.jpg&lt;br /&gt;
File:Streamline MCU STM32F407 - top view.jpg&lt;br /&gt;
File:Streamline MCU STM32F407 - bottom view.jpg&lt;br /&gt;
File:Streamline Connect - top view.jpg&lt;br /&gt;
File:Streamline Connect - bottom view.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous Links ==&lt;br /&gt;
&lt;br /&gt;
[https://currentmakers.com CurrentMakers main site]&lt;/div&gt;</summary>
		<author><name>Niclas</name></author>
	</entry>
</feed>