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

3

背景: 我正在使用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外设的波特率?

(省略重复错误)。

1个回答

3
我得到了这行代码:
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());
    }
}

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

#[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());
    }
}

3
你可以添加你的导入吗? - Tarion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接