我知道我的问题具体是关于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 没有提供任何接近编译的东西。
找到答案(在大使馆的示例文件夹中) 此代码使计时器工作:
#![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;
}
}