rust - 如何使用嵌入式 HAL 在 Rust 中配置 UART?

标签 rust embedded stm32

背景: 我正在使用 Nucleo-G071RB 开发板。我是 Rust 的新手,正在研究嵌入式 HAL 中的一些示例。

我能够启动并运行这个示例,但是在尝试更改波特率时遇到了一些困难(在撰写本文时链接将提交给 master 负责人): https://github.com/stm32-rs/stm32g0xx-hal/blob/116ac758cc50f4e1bfb9270d41403eac462cd791/examples/uart.rs

我找到了示例中引用的默认函数: https://github.com/stm32-rs/stm32g0xx-hal/blob/116ac758cc50f4e1bfb9270d41403eac462cd791/src/serial.rs#L112

所以我试着做了类似的东西:

fn uart_cfg() -> serial::Config {
    let baudrate = 115_200.bps();
    serial::Config {
        baudrate,
        wordlength: serial::WordLength::DataBits8,
        parity: serial::Parity::ParityNone,
        stopbits: serial::StopBits::STOP1,
    }
}

这给了我:

error[E0451]: field `baudrate` of struct `hal::serial::Config` is private
  --> src/main.rs:22:9
   |
22 |         baudrate,
   |         ^^^^^^^^ field `baudrate` is private

(省略重复错误)

如何在 UART 外设上干净地设置波特率?

最佳答案

我结束了这一行:

let cfg = serial::Config::default().baudrate(115_200.bps());

并在我的 hello world 中使用它:

#[entry]
fn main() -> ! {
    let dp = stm32::Peripherals::take().expect("cannot take peripherals");
    let mut rcc = dp.RCC.constrain();

    let gpioa = dp.GPIOA.split(&mut rcc);
    let cfg = serial::Config::default().baudrate(115_200.bps());
    let mut usart2 = dp
        .USART2
        .usart(gpioa.pa2, gpioa.pa3, cfg, &mut rcc)
        .unwrap();

    let mut delay = dp.TIM15.delay(&mut rcc);

    loop {
        writeln!(usart2, "Hello, World!").unwrap();
        delay.delay(50.ms());
    }
}

如果您想一次定义配置并将其用于多个 UART,这就会遇到麻烦。例如:

#[entry]
fn main() -> ! {
    let dp = stm32::Peripherals::take().expect("cannot take peripherals");
    let mut rcc = dp.RCC.constrain();

    let cfg = serial::Config::default().baudrate(115_200.bps());

    let gpioa = dp.GPIOA.split(&mut rcc);
    let mut usart2 = dp
        .USART2
        .usart(gpioa.pa2, gpioa.pa3, cfg, &mut rcc)
        .unwrap();

    let gpiob = dp.GPIOB.split(&mut rcc);
    let mut usart3 = dp
        .USART3
        .usart(gpiob.pb10, gpiob.pb11, cfg, &mut rcc)
        .unwrap();

    let mut delay = dp.TIM15.delay(&mut rcc);

    loop {
        writeln!(usart2, "Hello, World!").unwrap();
        writeln!(usart3, "Hello, again!").unwrap();
        delay.delay(50.ms());
    }
}

关于rust - 如何使用嵌入式 HAL 在 Rust 中配置 UART?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60626086/

相关文章:

reference - 如何创建带有引用向量的结构?

c - 相同的输入和指令但不同的延迟,怎么办?

c - 使用 AVR 红外传感器发光 LED 的这段代码有什么问题?

c - 在STM32上直接使用ODR寄存器

c - 链接库中的函数在可执行文件中看不到

rust - "does not live long enough"相同函数错误

string - 如何连接Rust Vector的两个 `&str`类型元素并将其添加到零索引

rust - 如何从嵌套目录访问嵌套模块/文件

c++ - G++ 不使用 -O0 编译我的源代码,但它使用 -O2 -DNDEBUG,我该如何解决?

c++ - gcc 如何决定隐式包含哪些库?