4 releases
new 0.11.1 | Nov 24, 2024 |
---|---|
0.11.0 | Nov 23, 2024 |
0.10.3 | Sep 29, 2024 |
#121 in Embedded development
525KB
12K
SLoC
n32g4xx-hal
This HAL is very unpolished and much of its functionality Does Not Work or may require hacks accessing the PAC.
APIs are subject to change quickly and rapidly.
HAL for the N32g4xx family of microcontrollers
Quick start guide
Embedded Rust development requires a bit more setup than ordinary development.
You will also need a debug probe, for example an ST-Link V2 for programming and debugging. (There are many different STLink probes out there, all of them should work fine with the instructions given here, other JTAG or SWD debug probes will work as well but will need different software or configuration).
Anecdotally, ST-Link V2 seems to be more reliable than other options.
Installing software
To program your microcontroller, you need to install:
- openocd or stlink
gdb-multiarch
(on some platforms you may need to usegdb-arm-none-eabi
instead, make sure to update.cargo/config
to reflect this change)
Finally, you need to install arm target support for the Rust compiler. To do so, run
rustup target install thumbv7em-none-eabihf
Setting up your project
Create a new Rust project as you usually do with cargo init
. The hello world
of embedded development is usually to blink an LED and code to do so is
available in examples/blinky.rs. Copy that file to the
main.rs
of your project.
You also need to add some dependencies to your Cargo.toml
:
[dependencies]
embedded-hal = "1.0.0"
nb = "1.1.0"
cortex-m = { version = "0.7.7", features = ["critical-section-single-core"] }
cortex-m-rt = "0.7.3"
# Panic behaviour, see https://crates.io/keywords/panic-impl for alternatives
panic-halt = "0.2.0"
n32g4xx-hal = { version = "0.1.0", features = ["rt", "gd32c103"] }
If you build your project now, you should get a single error:
error: language item required, but not found: eh_personality
. This unhelpful error message is
fixed by compiling for the right target.
We also need to tell Rust how to link our executable, and how to lay out the result in memory. To accomplish all this, copy .cargo/config and memory.x from the n32g4xx-hal repo to your project.
cargo build
If everything went well, your project should have built without errors.
Programming the microcontroller
It is now time to actually run the code on the hardware. To do so plug your
debug probe into your board and start openocd
using
openocd -f interface/stlink-v3.cfg -f target/stm32f1x.cfg
If you are not using an stlink V3, change the interface accordingly. For more information, see the embeddonomicon.
If all went well, it should detect your microcontroller and say
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
. Keep it running in the background.
We will use gdb for uploading the compiled binary to the microcontroller and
for debugging. Cargo will automatically start gdb
thanks to the
.cargo/config you added earlier. gdb
also needs to be told
to connect to openocd which is done by copying .gdbinit to the root
of your project.
You may also need to tell gdb
that it is safe to load .gdbinit
from the
working directory.
- Linux
echo "set auto-load safe-path $(pwd)" >> ~/.gdbinit
- Windows
echo set auto-load safe-path %CD% >> %USERPROFILE%\.gdbinit
If everything was successful, cargo should compile your project, start GDB, load your program and
give you a prompt. If you type continue
in the GDB prompt, your program should start and an LED
attached to PC13 should start blinking.
Going further
From here on, you can start adding more code to your project to make it do something more interesting. For crate documentation, see docs.rs/n32g4xx-hal. There are also a lot more examples available. If something is unclear in the docs or examples, please, open an issue and we will try to improve it.
Selecting a microcontroller
This crate supports multiple microcontrollers in the n32g4xx family. Which specific microcontroller
you want to build for has to be specified with a feature, for example gd32c103
.
If no microcontroller is specified, the crate will not compile.
Supported Microcontrollers
gd32c103xx
(e.g. GD32C103TB, GD32C103CB, GD32C103RB, GD32C103VB)gd32c113xx
(e.g. GD32C113TB, GD32C113CB, GD32C113RB, GD32C113VB)
Trying out the examples
You may need to give cargo
permission to call gdb
from the working directory.
- Linux
echo "set auto-load safe-path $(pwd)" >> ~/.gdbinit
- Windows
echo set auto-load safe-path %CD% >> %USERPROFILE%\.gdbinit
Compile, load, and launch the hardware debugger.
$ rustup target add thumbv7em-none-eabihf
# on another terminal
$ openocd -f interface/$INTERFACE.cfg -f target/stm32f1x.cfg
# flash and debug the "Hello, world" example. Change gd32c103 to match your hardware
$ cargo run --features gd32c103 --example hello
$INTERFACE
should be set based on your debugging hardware. If you are using
an stlink V2, use stlink-v2.cfg
. For more information, see the
embeddonomicon.
Using as a Dependency
When using this crate as a dependency in your project, the microcontroller can
be specified as part of the Cargo.toml
definition.
n32g4xx-hal = { version = "0.1.0", features = ["gd32c103", "rt"] }
Documentation
The documentation can be found at docs.rs.
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
See the contributing guide for more details.
Dependencies
~23MB
~453K SLoC