背景: 我正在使用 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/