11个版本

0.3.2 2024年8月4日
0.3.0 2022年12月29日
0.2.4 2021年10月5日
0.2.3 2021年5月25日
0.2.1 2020年11月7日

147嵌入式开发

Download history 932/week @ 2024-05-01 1353/week @ 2024-05-08 1383/week @ 2024-05-15 1456/week @ 2024-05-22 1650/week @ 2024-05-29 1740/week @ 2024-06-05 1488/week @ 2024-06-12 1375/week @ 2024-06-19 1564/week @ 2024-06-26 1606/week @ 2024-07-03 2052/week @ 2024-07-10 1255/week @ 2024-07-17 1388/week @ 2024-07-24 2139/week @ 2024-07-31 1739/week @ 2024-08-07 1834/week @ 2024-08-14

7,294 每月下载量
用于 13 个crates(5个直接使用)

MIT/Apache

170KB
2.5K SLoC

文档

stm32-fmc

docs.rs Crates.io

STM32内存控制器(FMC/FSMC)的硬件抽象层

目前仅实现了SDRAM功能。

这个crate还在开发中!非常欢迎贡献

实现

(如果你的HAL已经实现了FMC,你可以跳过这一步)

查看文档

用法

SDRAM

FMC外设支持最多2个外部SDRAM设备。这个crate目前只支持1个,尽管它可能在1号或2号银行。

外部存储器由SdramChip实现定义。在devices文件夹中有几个示例,或者你可以自己创建。

要将引脚传递给构造函数,创建一个以下顺序的元组

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

你可以省略未使用存储器的地址/数据引脚。

构建

如果你使用HAL,请参阅HAL文档。

否则,你可以自己实现FmcPeripheral,然后直接使用Sdram::new / Sdram::new_unchecked

初始化

一旦你有了Sdram实例,你可以

  • 通过调用init来初始化它。这会返回一个原始指针
  • 使用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)
};

NAND闪存

FMC外设支持1个外部并行NAND闪存设备。

外部存储器由NandChip实现定义。在devices文件夹中有示例,或者你可以自己创建。

要将引脚传递给构造函数,创建一个以下顺序的元组

let pins = (
    // A17/ALE
    // A16/CLE
    pa0, ...
    // D0-D7
    // NCE/#CE
    // NOE/#RE
    // NWE/#WE
    // NWAIT/R/#B
);

构建

如果你使用HAL,请参阅HAL文档。

否则,您可以自己实现FmcPeripheral,然后直接使用Nand::new / Nand::new_unchecked

初始化

一旦您有了Nand实例,您应该通过调用init来初始化它。这将返回一个NandDevice实例。

let mut nand_device = nand.init(&mut delay);

// Read device identifier
let id = nand_device.read_id();

NOR闪存/PSRAM

待办事项

故障排除

该库自动通过logdefmt进行一些跟踪级别的日志记录。要启用此类日志记录,请启用您的Cargo.toml中的logdefmt功能。

为了调试SDRAM寄存器内容,该库提供额外的功能trace-register-values,启用后,将导致初始化函数将寄存器内容记录到跟踪级别。这在您想要比较stm32-fmc和CubeMX代码中的寄存器值时非常有用。请注意,必须启用其中一个日志功能(log/defmt)才能使其工作。

实现新设备

如果您最终依赖于比HAL crate更新的crate版本或分支,您可以使用您的Cargo.toml中的[patch]部分覆盖外部crate拉入的版本,如Cargo Book中所述。

发布

  • 更新Cargo.toml
  • 更新CHANGELOG.md
git commit -am 'v0.2.0'
git push --set-upstream origin v0.2.0

创建PR并检查CI是否通过

git push --set-upstream origin v0.2.0:master
git tag -a 'v0.2.0' -m 'v0.2.0'
git push origin refs/tags/v0.2.0
cargo publish

许可证

根据您的选择,许可为以下之一

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献都将根据上述方式双重许可,而不附加任何额外条款或条件。

依赖项

~69-255KB