Как настроить UART в Rust, используя встроенный HAL? - PullRequest
0 голосов
/ 11 марта 2020

Справочная информация: я использую плату разработчика Nucleo-G071RB. Я новичок в ржавчине и работаю с некоторыми примерами из встроенного HAL.

Я смог запустить этот пример и запустить его, но столкнулся с некоторыми трудностями при попытке изменить скорость передачи данных (ссылки для фиксации во главе мастера на момент написания этой статьи): 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 Ответ

1 голос
/ 11 марта 2020

Я закончил с этой строкой:

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

И использовал ее в моем привет мире:

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