You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F303VC开发板使用Embassy框架读取ADC时程序挂起的问题求助

STM32F303VC开发板使用Embassy框架读取ADC时程序挂起的问题求助

我之前用STM32F3xx HAL库写了一个读取光敏传感器的嵌入式Rust项目,运行完全正常——能在终端里看到ADC读取的数值。代码是这样的:

#![no_main]
#![no_std]
extern crate panic_halt;

use cortex_m::asm;
use cortex_m_rt::entry;
use rtt_target::rtt_init_defmt;
use stm32f3xx_hal::{
    adc::{Adc, CommonAdc, config::Config},
    pac, prelude::*,
};

#[entry]
fn main() -> ! {
    rtt_init_defmt!();
    defmt::info!("Starting light sensor application");

    let dp = pac::Peripherals::take().unwrap();

    let mut flash = dp.FLASH.constrain();
    let mut rcc = dp.RCC.constrain();

    let clocks = rcc.cfgr.use_hse(8.MHz()).freeze(&mut flash.acr);

    let mut gpioa = dp.GPIOA.split(&mut rcc.ahb);
    let mut light_pin = gpioa.pa0.into_analog(&mut gpioa.moder, &mut gpioa.pupdr);

    let mut adc = Adc::new(
        dp.ADC1,
        Config::default(),
        &clocks,
        &CommonAdc::new(dp.ADC1_2, &clocks, &mut rcc.ahb),
    );

    loop {
        let data: u16 = adc.read(&mut light_pin).unwrap();
        defmt::info!("{}", data);
        // Wait 100ms for next conversion
        asm::delay(800_000);
    }
}

这个版本没问题,终端里能实时看到传感器的数值变化。但我想换成Embassy框架重写,结果怎么都跑不起来——程序卡在创建ADC之后的步骤,终端只打印出Creating adc...就没下文了。

我写的Embassy版本代码如下:

#![no_main]
#![no_std]
extern crate panic_halt;

use embassy_executor::Spawner;
use embassy_stm32::Config;
use embassy_stm32::rcc::{Hse, Sysclk};
use embassy_stm32::time::Hertz;
use embassy_stm32::{
    adc::{self, Adc, AdcChannel},
    bind_interrupts, peripherals,
};
use embassy_time::Timer;
use rtt_target::rtt_init_defmt;

bind_interrupts!(struct Irqs {
    ADC1_2 => adc::InterruptHandler<peripherals::ADC1>;
});

#[embassy_executor::main]
async fn main(_spawner: Spawner) {
    rtt_init_defmt!();
    defmt::info!("Starting light sensor application");

    let mut rcc_config = embassy_stm32::rcc::Config::default();
    rcc_config.hsi = false;
    rcc_config.hse = Some(Hse {
        freq: Hertz::mhz(8),
        mode: embassy_stm32::rcc::HseMode::Oscillator,
    });
    rcc_config.sys = Sysclk::HSE;

    let mut config = Config::default();
    config.rcc = rcc_config;

    let p = embassy_stm32::init(config);

    defmt::info!("Creating adc...");
    let mut adc = Adc::new(p.ADC1, Irqs);
    defmt::info!("Creating pin...");

    let mut adc_pin0 = p.PA0.degrade_adc();

    loop {
        let val = adc.read(&mut adc_pin0).await;
        defmt::info!("{}", val);
        Timer::after_millis(500).await;
    }
}

对应的Cargo.toml配置:

[package]
name = "blinky"
version = "0.1.0"
edition = "2024"

[dependencies]
embassy-executor = { version = "0.7.0", features = [
    "arch-cortex-m",
    "executor-thread",
] }
embassy-time = { version = "0.4.0", features = [
    "defmt",
    "defmt-timestamp-uptime",
    "tick-hz-32_768",
] }
embassy-stm32 = { version = "0.2.0", features = [
    "defmt",
    "exti",
    "time",
    "time-driver-any",
    "stm32f303vc",
    "unstable-pac",
] }
cortex-m = { version = "0.7.7", features = ["critical-section-single-core"] }
cortex-m-rt = "0.7.3"
panic-halt = "0.2.0"
defmt = { version = "0.3" }
rtt-target = { version = "0.6", features = ["defmt"] }

[profile.dev]
debug = true

[profile.release]
debug = true

我是嵌入式Rust的新手,也不太清楚该怎么调试这个问题。有没有大佬能帮我看看哪里错了或者漏了什么配置?我想让Embassy版本也能正常读取传感器数值并输出到终端里。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 13:14:34