RP2040 Rust开发:借检查器下适配故障组件的UART引脚复用问题
解决RP2040 Rust UART预热故障组件的引脚所有权问题
方案1:先执行预热操作再移交引脚给UART
这是最贴合Rust所有权规则的解决方案——在引脚所有权移交UART之前完成所有预热操作,从根源上避免所有权冲突。修改后的代码如下:
let mut gpio0 = pins.gpio0; let mut gpio1 = pins.gpio1; // 先完成预热脉冲操作 let mut tx_pin = gpio0.into_push_pull_output(); tx_pin.set_high().unwrap(); delay.delay_us(10); tx_pin.set_low().unwrap(); delay.delay_us(10); // 将引脚转为UART功能并初始化外设 let uart_pins_0 = ( tx_pin.into_function(), // 所有权从输出引脚转移至UART引脚结构体 gpio1.into_function(), ); let mut uart0 = UartPeripheral::new(peripherals.UART0, uart_pins_0, &mut peripherals.RESETS) .enable( UartConfig::new(baud.Hz(), DataBits::Eight, None, StopBits::One), clocks.peripheral_clock.freq(), ).unwrap(); uart0.write_str("test\n").unwrap();
方案2:利用UART硬件发送同步脉冲(无需手动GPIO操作)
如果不想提前操作引脚,可以借助UART硬件发送无效信号完成预热。比如发送空字节,时序由波特率决定,适合对脉冲精度要求不高的场景:
let mut gpio0 = pins.gpio0; let mut gpio1 = pins.gpio1; let uart_pins_0 = ( gpio0.into_function(), gpio1.into_function(), ); let mut uart0 = UartPeripheral::new(peripherals.UART0, uart_pins_0, &mut peripherals.RESETS) .enable( UartConfig::new(baud.Hz(), DataBits::Eight, None, StopBits::One), clocks.peripheral_clock.freq(), ).unwrap(); // 发送两个空字节作为预热信号 uart0.write(&[0x00, 0x00]).unwrap(); uart0.write_str("test\n").unwrap();
原代码报错原因
gpio0.into_function()调用后,gpio0的所有权已完全转移给UART引脚结构体,Rust的所有权机制禁止访问已转移所有权的变量,因此出现编译错误。方案1通过调整操作顺序,在所有权转移前完成GPIO操作,彻底解决了这个问题。
内容的提问来源于stack exchange,提问作者Erhannis
相关产品推荐
相关产品推荐

