slint/examples/mcu-board-support
Simon Hausmann 8ed35eded1 Remove the std feature from the mcu bsp crate
The example can use the std feature of slint directly
2022-08-25 12:54:52 +02:00
..
LICENSES Move the mcu backend to become a board support helper crate for examples 2022-08-25 12:54:52 +02:00
pico_st7789 Move the mcu backend to become a board support helper crate for examples 2022-08-25 12:54:52 +02:00
stm32h735g Move the mcu backend to become a board support helper crate for examples 2022-08-25 12:54:52 +02:00
build.rs Move the mcu backend to become a board support helper crate for examples 2022-08-25 12:54:52 +02:00
Cargo.toml Remove the std feature from the mcu bsp crate 2022-08-25 12:54:52 +02:00
lib.rs Move the mcu backend to become a board support helper crate for examples 2022-08-25 12:54:52 +02:00
pico_st7789.rs Remove the use of i_slint_core in the pico and stm32 bsp modules 2022-08-25 12:54:52 +02:00
profiler.rs Move the mcu backend to become a board support helper crate for examples 2022-08-25 12:54:52 +02:00
README.md Move the mcu backend to become a board support helper crate for examples 2022-08-25 12:54:52 +02:00
stm32h735g.rs Remove the use of i_slint_core in the pico and stm32 bsp modules 2022-08-25 12:54:52 +02:00

NOTE: This library is an internal crate of the Slint project. This crate should not be used directly by applications using Slint. You should use the slint crate instead.

WARNING: This crate does not follow the semver convention for versioning and can only be used with version = "=x.y.z" in Cargo.toml.

Slint MCU backend

The MCU backend is still a work in progress.

We currently have in-tree backend for

  • the Raspberry Pi Pico and ST7789 based screen:

    The Raspberry Pi Pico uses a RP2040 micro-controller which has 264KB of RAM and 2MB of flash memory.

  • STM32H735G-DK

  • Simulator, which is a way to test the software rendering backend on desktop.

We will make some backend API public so any board supported by rust can easily be supported

How to use

In order to use this backend, the final program must depend on both slint and i_slint_backend_mcu. The main.rs will look something like this

#![no_std]
#![cfg_attr(not(feature = "simulator"), no_main)]
slint::include_modules!();

#[i_slint_backend_mcu::entry]
fn main() -> ! {
    i_slint_backend_mcu::init();
    MainWindow::new().run();
    panic!("The event loop should not return");
}

Since i_slint_backend_mcu is at the moment an internal crate not uploaded to crates.io, you must use the git version of slint, slint-build, and i_slint_backend_mcu

[dependencies]
slint = { git = "https://github.com/slint-ui/slint" }
i_slint_backend_mcu = { git = "https://github.com/slint-ui/slint" }
# ...
[build-dependencies]
slint-build = { git = "https://github.com/slint-ui/slint" }

Run the demo:

The simulator

cargo run -p printerdemo_mcu --features=mcu-simulator --release

On the Raspberry Pi Pico

You need nightly rust because that's the only way to get an allocator.

Build the demo with:

cargo +nightly build -p printerdemo_mcu --features=mcu-pico-st7789 --target=thumbv6m-none-eabi --release

You should process the file with elf2uf2-rs

cargo install elf2uf2-rs
elf2uf2-rs target/thumbv6m-none-eabi/release/printerdemo_mcu

Then upload the demo to the raspberry pi: push the "bootsel" white button on the device while connecting the micro-usb cable to the device, this connect some storage where you can store the binary.

Or from the command on linux: (connect the device while pressing the "bootsel" button.

# mount the device
udisksctl mount -b /dev/sda1
# upload
elf2uf2-rs -d target/thumbv6m-none-eabi/release/printerdemo_mcu

Using probe-run

This require probe-run (cargo install probe-run) and to connect the pico via a probe (for example another pico running the probe)

Then you can simply run with cargo run

CARGO_TARGET_THUMBV6M_NONE_EABI_LINKER="flip-link" CARGO_TARGET_THUMBV6M_NONE_EABI_RUNNER="probe-run --chip RP2040" cargo +nightly run -p printerdemo_mcu --features=mcu-pico-st7789 --target=thumbv6m-none-eabi --release

STM32H735G-DK

Using probe-run (cargo install probe-run)

CARGO_TARGET_THUMBV7EM_NONE_EABIHF_RUNNER="probe-run --chip STM32H735IGKx" cargo +nightly run -p printerdemo_mcu --features=mcu-board-support/stm32h735g --target=thumbv7em-none-eabihf --release

Flashing and Debugging the Pico with probe-rs's VSCode Plugin

Install probe-rs-debugger and the VSCode plugin as described here.

Add this build task to your .vscode/tasks.json:

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "cargo",
			"command": "build",
			"env": {
				"RUSTUP_TOOLCHAIN": "nightly"
			},
			"args": [
				"--package=printerdemo_mcu",
				"--features=mcu-pico-st7789",
				"--target=thumbv6m-none-eabi",
				"--profile=release-with-debug"
			],
			"problemMatcher": [
				"$rustc"
			],
			"group": "build",
			"label": "build mcu demo for pico"
		},
	]
}

The release-with-debug profile is needed, because the debug build does not fit into flash.

You can define it like this in your top level Cargo.toml:

[profile.release-with-debug]
inherits = "release"
debug = true

Now you can add the launch configuration to .vscode/launch.json:

{
    "version": "0.2.0",
    "configurations": [
        {
            "preLaunchTask": "build mcu demo for pico",
            "type": "probe-rs-debug",
            "request": "launch",
            "name": "Flash and Debug MCU Demo",
            "cwd": "${workspaceFolder}",
            "connectUnderReset": false,
            "chip": "RP2040",
            "flashingConfig": {
                "flashingEnabled": true,
                "resetAfterFlashing": true,
                "haltAfterReset": true
            },
            "coreConfigs": [
                {
                    "coreIndex": 0,
                    "rttEnabled": true,
                    "programBinary": "./target/thumbv6m-none-eabi/release-with-debug/printerdemo_mcu"
                }
            ]
        },
    ]
}

This was tested using a second Raspberry Pi Pico programmed as a probe with DapperMime.