#stm32 #memory #fmc #sdram

no-std stm32-fmc

Hardware Abstraction Layer for STM32 Memory Controllers (FMC/FSMC)

5 releases

0.2.1 Nov 7, 2020
0.2.0 Aug 28, 2020
0.1.2 Aug 5, 2020
0.1.1 Aug 5, 2020
0.1.0 Aug 1, 2020

#58 in Embedded development

Download history 31/week @ 2020-08-07 13/week @ 2020-08-14 4/week @ 2020-08-21 152/week @ 2020-08-28 130/week @ 2020-09-04 3/week @ 2020-09-11 98/week @ 2020-09-18 225/week @ 2020-09-25 194/week @ 2020-10-02 155/week @ 2020-10-09 233/week @ 2020-10-16 469/week @ 2020-10-23 335/week @ 2020-10-30 355/week @ 2020-11-06 176/week @ 2020-11-13 258/week @ 2020-11-20

680 downloads per month
Used in stm32h7xx-hal

MIT/Apache

130KB
2K SLoC

Documentation

stm32-fmc

docs.rs Crates.io

Hardware Abstraction Layer for STM32 Memory Controllers (FMC/FSMC)

Currently only SDRAM functions are implemented.

This crate is a work in progress! Contributions very welcome

Implementing

(If your HAL already implements FMC, you can skip this)

See the docs

Usage

SDRAM

The FMC peripheral supports up to 2 external SDRAM devices. This crate currently only supports 1, although it may be on either bank 1 or 2.

External memories are defined by SdramChip implementations. There are several examples in the devices folder, or you can make your own.

To pass pins to a constructor, create a tuple with the following ordering:

let pins = (
    // A0-A12
    pa0, ...
    // BA0-BA1
    // D0-D31
    // NBL0 - NBL3
    // SDCKE
    // SDCLK
    // SDNCAS
    // SDNE
    // SDRAS
    // SDNWE
);

You can leave out address/data pins not used by your memory.

Constructing

If you are using a HAL, see the HAL documentation.

Otherwise you can implement FmcPeripheral yourself then use Sdram::new / Sdram::new_unchecked directly.

Initialising

Once you have an Sdram type, you can:

  • Initialise it by calling init. This returns a raw pointer
  • Convert the raw pointer to a sized slice using from_raw_parts_mut
let ram = unsafe {
    // Initialise controller and SDRAM
    let ram_ptr: *mut u32 = sdram.init(&mut delay);

    // 32 MByte = 256Mbit SDRAM = 8M u32 words
    slice::from_raw_parts_mut(ram_ptr, 8 * 1024 * 1024)
};

NOR Flash/PSRAM

TODO

NAND Flash

TODO

Implementing a new device

If you end up depending on a fork or a newer version of this crate than the HAL crate for your device, you can override the version pulled in by the external crate using a [patch] section in your Cargo.toml, as described in the Cargo Book.

Releasing

  • Update Cargo.toml
  • Update CHANGELOG.md
git commit -am 'v0.2.0'
git push origin
git tag -a 'v0.2.0' -m 'v0.2.0'
git push origin v0.2.0
cargo publish

License

Licensed under either of

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.

Dependencies

~105KB