gpt4 book ai didi

rust - 使用 STM32f1xx_hal crate 时借用移动值错误

转载 作者:行者123 更新时间:2023-11-29 08:28:39 24 4
gpt4 key购买 nike

我正在尝试在我的 STM32 bluepill 上启用 DMA 外设,但出现以下错误:

error[E0382]: borrow of moved value: `dp.RCC`
--> src/main.rs:74:5
|
36 | let mut rcc = dp.RCC.constrain(); // RCC = Reset and Clock Control
| ------ value moved here
...
74 | dp.RCC.ahbenr.modify(|_, w| w.dma2en().set_bit());
| ^^^^^^ value borrowed here after move
|
= note: move occurs because `dp.RCC` has type `stm32f1::stm32f103::RCC`, which does not implement the `Copy` trait

我知道这是开始学习 Rust 时的常见问题。我已经阅读了这方面的文档,但对于我需要在这里做什么才能使这项工作仍然有些困惑。

代码如下:

#![no_std]
#![no_main]

extern crate panic_halt; // you can put a breakpoint on `rust_begin_unwind` to catch panics

use cortex_m::asm;
use cortex_m_rt::entry;
use cortex_m_semihosting::hprintln;
use embedded_hal::spi::{Mode, Phase, Polarity};
use stm32f1xx_hal::{
prelude::*,
pac,
spi::Spi,
dma,
stm32
};


#[entry]
fn main() -> ! {
let dp = pac::Peripherals::take().unwrap();
let mut rcc = dp.RCC.constrain(); // RCC = Reset and Clock Control
dp.RCC.ahbenr.modify(|_, w| w.dma2en().set_bit());
}

我还尝试使用 rcc.ahbenr.modify.... 但是失败了,因为 RCC.constrain 方法的返回不是完整的 AHBENR 结构。再一次,我知道这很简单,我只是误解了。任何人都可以为此指出正确的方向吗?谢谢。

最佳答案

这里的问题是 dp.RCC 指的是外设访问包 (PAC) 中的 RCC API,基本上是原始寄存器接口(interface)。通过调用 dp.RCC.constrain(),您可以获取原始 API 并将其转换为硬件抽象层 (HAL) API,该 API 旨在提供更安全、更方便的 API 层原始寄存器接口(interface)。

这样做会移动 PAC 级别的 API,从而使其无法使用。这是有意为之,因为如果允许用户随意修改位,HAL API 将无法维护其正确性保证。

据我所知,您有三种解决此问题的选择:

  1. 永远不要调用 dp.RCC.constrain()
  2. 为 DMA 使用 HAL API。
  3. 在调用 dp.RCC.constrain() 后取回 PAC 级别的 RCC API。

如果您选择选项 1,则需要手动执行 HAL API 为您执行的时钟设置。也许这就是您想要的,但这肯定需要更多工作,并且根据微 Controller 的复杂性,可能容易出错。我会选择另一种选择。

选项 2,将 HAL API 用于 DMA:这是否是一个选项取决于您使用的 HAL 是否支持该功能。你似乎在使用 stm32f1xx-hal ,它确实有一个 DMA API .有各种examples that use it在项目的存储库中。

至于选项 3,许多 HAL API 提供了取回 PAC 级 API 的方法(在此过程中破坏 HAL API)。因此,您可以使用 HAL API 进行初始化,然后取回 PAC API 以进行较低级别的访问。不幸的是,stm32f1xx-hal 似乎不支持这一点。如果你知道自己在做什么,你可以使用不安全的方式,比如 transmute取回该 PAC API,但最好只向 HAL 发送拉取请求,添加一个返回 PAC API 的方法。

关于rust - 使用 STM32f1xx_hal crate 时借用移动值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57232061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com