Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/rust-embedded/msp430-quickstart

Template to develop bare metal applications for MSP430 microcontrollers
https://github.com/rust-embedded/msp430-quickstart

Last synced: 27 days ago
JSON representation

Template to develop bare metal applications for MSP430 microcontrollers

Awesome Lists containing this project

README

        

# `msp430-quickstart`

> A template for building applications for TI MSP430 microcontrollers.

This project is developed and maintained by the [MSP430 team][team].

## Dependencies

- Rust nightly-2022-01-24 or a newer toolchain. _Only nightly compilers work
for now._

The [`rust-toolchain.toml`](./rust-toolchain.toml) file makes sure this step
is done for you. This file tells [`rustup`](https://rustup.rs/) to download
and use nightly compiler for this crate, as well as download the compiler
source to build `libcore`.

You can manually set up a nightly compiler as the default for all MSP430
projects by running:

``` console
$ rustup default nightly
$ rustup component add rust-src
```

Alternatively, you can manually set up overrides on a project basis using:

```console
$ rustup override set --path /path/to/crate nightly-YYYY-MM-DD`.
$ rustup component add --toolchain nightly-YYYY-MM-DD rust-src
```

- The `cargo generate` subcommand ([Installation instructions](https://github.com/ashleygwilliams/cargo-generate#installation)).

- TI's [MSP430 GCC Compiler](http://www.ti.com/tool/MSP430-GCC-OPENSOURCE),
version 8.3.0 or greater. `msp430-elf-gcc` should be visible on the path.

The following dependencies are required in order to generate a peripheral access crate (see *Using this template* below)

- [`svd2rust`](https://github.com/rust-embedded/svd2rust), version 0.20.0 or
a newer commit.

- [`msp430_svd`](https://github.com/pftbest/msp430_svd), version 0.3.0 or a
newer commit. Cloning the repo and following the directions in README.md is
sufficient.

## Using this template

0. 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](https://rust-embedded.github.io/book/start/registers.html) (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 the [`MSP430x2xx` family](https://www.ti.com/lit/ug/slau144j/slau144j.pdf).

The linked family manual and [datasheet](http://www.ti.com/lit/ds/slas735j/slas735j.pdf)
can be used to answer the remaining questions:

- The `msp430g2553` PAC exists already and can be found on [crates.io](https://crates.io/crates/msp430g2553).

- `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.

1. If your particular device does not have a PAC crate, you will need to
generate one using `svd2rust` and possibly [publish](https://doc.rust-lang.org/cargo/reference/publishing.html)
the crate to https://crates.io. To generate an SVD file, follow the directions
in the `msp430_svd` [README.md](https://github.com/pftbest/msp430_svd#msp430_svd)
for your device.

In some cases like [`msp430fr2355`](https://github.com/YuhanLiin/msp430fr2355-quickstart/issues/4#issuecomment-569178043),
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](https://github.com/YuhanLiin/msp430fr2355-quickstart#issuecomment-569320608)
the linker script to determine where to start the `VECTORS` section in
`memory.x`._ Copies of many linker scripts are kept in the
[`msp430_svd`](https://github.com/pftbest/msp430_svd/tree/master/msp430-gcc-support-files)
repository.

2. Instantiate the template and follow the prompts.

``` console
$ 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
```

3. If not targeting `msp430g2553`, replace the PAC entry for `msp430g2553` in
`Cargo.toml` with that of your device, e.g.:

``` toml
# [dependencies.msp430g2553]
# version = "0.3.0"
# features = ["rt"]
[dependencies.msp430fr2355]
version = "0.4.0"
features = ["rt"]
```

4. 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!_

``` console
$ 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
}
```

5. Build the template application or one of the examples. Some examples
(such as `timer` or `temp-hal`) may not compile due to size
constraints when building using the `dev` profile (the default). Pass the
`--release` option to `cargo build` in these cases.

``` console
$ cargo build
$ cargo build --examples
```

Note that due to [`.cargo/config`](.cargo/config) and [`rust-toolchain.toml`](./rust-toolchain.toml),
the above is shorthand for:

``` console
$ cargo +nightly build --target=msp430-none-elf -Zbuild-std=core
$ cargo +nightly build --target=msp430-none-elf -Zbuild-std=core --examples
```

You may wish to experiment with other commented options in `.cargo/config`.

6. Once you have an ELF binary built, flash it to your microcontroller. Use [`mspdebug`](https://github.com/dlbeer/mspdebug) to launch a debug session and `msp430-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
```console
$ mspdebug -C mspdebug.cfg rf2500
```

In another terminal session
```console
$ 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.

# License

Licensed under either of

- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or
http://www.apache.org/licenses/LICENSE-2.0)

- MIT license ([LICENSE-MIT](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.

[team]: https://github.com/rust-embedded/wg#the-msp430-team