如何在embassy rust中执行中断

问题描述 投票:0回答:1

我知道我的问题具体是关于1个定时器中断,但我更愿意了解将来我可以在哪里找到有关此信息的信息。

我正在使用 rust 与 embassy、stm32l0 芯片和定制板。我对 rust 也很陌生(现在已经两周了)

我试图用伪代码做的是:

repeat{
    set timer interrupt1 at 5 miliseconds;
    set timer interrupt2 at 10 miliseconds;
    wait 100 miliseconds;
}
interrupt1: set pin high
interrupt2: set pin low

这相对简单,可以使用其他方法来完成,更重要的是弄清楚中断如何工作,以便我以后可以在更大的项目中使用它们。

但我一直无法找到如何做到这一点。这是我到目前为止的代码:

#![no_std]
#![no_main]

use cortex_m::interrupt as cortex_interrupt;
use embassy_executor::Spawner;
use embassy_stm32::gpio::{Level, Output, Speed};
use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _};
use embassy_stm32::interrupt;

#[interrupt]
unsafe fn TIM2(){
    let pin = embassy_stm32::peripherals::PB0::steal();
    let mut pin2 = Output::new(pin, Level::High, Speed::Low);
    pin2.set_high();
}
#[interrupt]
unsafe fn TIM21(){
    let pin = embassy_stm32::peripherals::PB0::steal();
    let mut pin2 = Output::new(pin, Level::High, Speed::Low);
    pin2.set_low();
}

#[embassy_executor::main]
async fn main(_spawner: Spawner) {
    let p: embassy_stm32::Peripherals = embassy_stm32::init(Default::default());
    unsafe {cortex_interrupt::enable();}
    loop{
        Timer::after_millis(1000).await;
    
    }
}

rust 嵌入书没有描述如何安排/获取中断

https://docs.rust-embedded.org/book/start/interrupts.html
(第 2.7 章)(他们给出了一般步骤,但我无法弄清楚如何让它工作。)

似乎存在这个问题,但我认为这与这里无关。 https://github.com/embassy-rs/embassy/issues/2603也使用他们的代码对我不起作用,因为“InterruptExecutor”给出了“未解析的导入”。他们的 UART4 也提供“未解决的导入”,但我知道这是特定于硬件的,但我希望 InterruptExecutor 适用于所有大使馆,因为它位于 embassy_executor 板条箱中。

或大使馆文档之类的地方:https://docs.embassy.dev/embassy-stm32/git/stm32f107rb/interrupt/enum.Interrupt.html也不提供答案。

这个问题类似,但没有回应在 STM32 微控制器上使用嵌入式 Rust 和大使馆等待 ADC 中断

chatgpt 没有提供任何接近编译的东西。

rust embedded stm32 interrupt
1个回答
0
投票

找到答案(在大使馆的示例文件夹中) 此代码使计时器工作:

#![no_std]
#![no_main]

use core::u8;
use defmt::*;
use embassy_executor::Spawner;
use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _};

use embassy_stm32::{gpio::{Output, Level, Speed}, interrupt, pac};
use embassy_stm32::time::hz;
use embassy_stm32::timer::low_level::{Timer as LLTimer, CountingMode};


#[interrupt]
fn TIM2() {
    // reset interrupt flag
    unsafe {
        let pin = embassy_stm32::peripherals::PB0::steal();
        let mut pin = Output::new(pin, Level::High, Speed::Low);
        pin.set_high();
    }
    pac::TIM2.sr().modify(|r| r.set_uif(false));
    info!("interrupt happens 2");
}
#[interrupt]
fn TIM21() {
    // reset interrupt flag
    unsafe {
        let pin = embassy_stm32::peripherals::PB0::steal();
        let mut pin = Output::new(pin, Level::High, Speed::Low);
        pin.set_low();
    }
    pac::TIM21.sr().modify(|r| r.set_uif(false));
    info!("interrupt happens 3");
}

#[embassy_executor::main]
async fn main(_spawner: Spawner) {
    let p: embassy_stm32::Peripherals =     embassy_stm32::init(Default::default());

    let timer21 = LLTimer::new(p.TIM21);
    timer21.set_counting_mode(CountingMode::EdgeAlignedUp);
    timer21.set_frequency(hz(2));
    timer21.start();
    timer21.set_autoreload_preload(true);
    timer21.enable_update_interrupt(true);
    unsafe { cortex_m::peripheral::NVIC::unmask(interrupt::TIM21) };

    let timer2 = LLTimer::new(p.TIM2);
    timer2.set_counting_mode(CountingMode::EdgeAlignedUp);
    timer2.set_frequency(hz(1));
    timer2.start();
    timer2.enable_update_interrupt(true);
    unsafe { cortex_m::peripheral::NVIC::unmask(interrupt::TIM2) };

    loop{
        Timer::after_millis(100).await;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.