A template for building applications for TI MSP430 microcontrollers.
This project is developed and maintained by the MSP430 team.
-
Rust nightly-2019-03-27 or a newer toolchain. Only nightly compilers work for now.
You can set up a nightly compiler as the default compiler using
rustup default nightly
. Alternatively, you can set up overrides on a project basis usingrustup override set --path /path/to/crate nightly-YYYY-MM-DD
-
The
cargo generate
subcommand (Installation instructions). -
TI's MSP430 GCC Compiler, version 8.3.0 or greater.
msp430-elf-gcc
should be visible on the path. -
svd2rust
, commit 783fbd0 or newer. -
msp430_svd
, commit e1eb730 or newer. Cloning the repo and following the directions in README.md is sufficient.
-
Before instantiating a project, you need to know some characteristics about your specific MSP430 device that will be used to fill in the template. In particular:
-
What is the exact part number of your device? Which MSP430 family does your part belong to?
-
Does your part have an already-existing peripheral access crate (PAC)?
-
How much flash memory, RAM, and how many interrupt vectors does your device have?
-
Where does flash memory, RAM, and interrupt vectors begin in the address space?
msp430g2553
is used for the examples in this crate. Answering the first question above:msp430g2553
belongs to theMSP430x2xx
family.
The linked family manual and datasheet can be used to answer the remaining questions:
-
The
msp430g2553
PAC exists already and can be found on crates.io. -
msp430g2553
has 16kB of flash memory, 512 bytes of RAM, and 16 vectors. -
Flash memory begins at address 0xC000. RAM begins at address 0x0200. The interrupt vectors begin at 0xFFE0.
-
-
If your particular device does not have a PAC crate, you will need to generate one using
svd2rust
and possibly publish the crate to https://crates.io. To generate an SVD file, follow the directions in themsp430_svd
README.md for your device.In some cases like
msp430fr2355
, TI's linker files are not consistent with datasheets on where interrupt vectors begin and how many interrupt vectors there are for a given device. In case of a conflict, examine the linker script to determine where to start theVECTORS
section inmemory.x
. Copies of many linker scripts are kept in themsp430_svd
repository. -
Instantiate the template.
$ cargo generate --git https://github.com/rust-embedded/msp430-quickstart Project Name: app Creating project called `app`... Done! New project created /tmp/app $ cd app
-
If not targeting
msp430g2553
, replace the PAC entry formsp430g2553
inCargo.toml
with that of your device, e.g.:# [dependencies.msp430g2553] # version = "0.2.0" # features = ["rt"] [dependencies.msp430fr2355] version = "0.4.0" features = ["rt"]
-
Populate the
memory.x
file with address space layout information of your device. Note: As mentioned above, in case of a conflict between the datasheet and linker script on where interrupt vectors begin, use the linker script!$ cat memory.x MEMORY { /* These values are correct for the msp430g2553 device. You will need to modify these values if using a different device. Room must be reserved for interrupt vectors plus reset vector and the end of the first 64kB of address space. */ RAM : ORIGIN = 0x0200, LENGTH = 0x0200 ROM : ORIGIN = 0xC000, LENGTH = 0x3FE0 VECTORS : ORIGIN = 0xFFE0, LENGTH = 0x20 }
-
Build the template application or one of the examples. If building
timer-oncecell
, don't forget to uncomment theonce_cell
dependency inCargo.toml
! Some examples (such astimer
) may not compile due to size constraints when building using thedev
profile (the default).$ cargo build -Zbuild-std=core $ cargo build -Zbuild-std=core --examples
-
Once you have an ELF binary built, flash it to your microcontroller. Use
mspdebug
to launch a debug session andmsp430-elf-gdb
with the linked gdb script. For the msp430g2553 and the MSP-EXP430G2 launchpad board this looks like the following:In one terminal session
$ mspdebug -C mspdebug.cfg rf2500
In another terminal session
$ msp430-elf-gdb -x mspdebug.gdb target/msp430-none-elf/debug/app
This will flash your Rust code to the microcontroller and open a gdb debugging session to step through it.
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.
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.