我正在将一个玩具应用程序移植到RTFM框架上,但是很难弄清楚如何通过GPIO触发中断。
fn init(p: init::Peripherals, _r: init::Resources) -> init::LateResources {
let dp: stm32f103xx::Peripherals = p.device;
let mut rcc = dp.RCC.constrain();
let mut gpioa = dp.GPIOA.split(&mut rcc.apb2);
let int = gpioa.pa0.into_floating_input(&mut gpioa.crl);
dp.EXTI.imr.write(|w| w.mr0().set_bit()); // unmask the interrupt (EXTI)
dp.EXTI.ftsr.write(|w| w.tr0().set_bit()); // trigger interrupt on falling edge
init::LateResources {
EXTI: dp.EXTI,
INT: int
}
}
fn idle(t: &mut Threshold, mut r: idle::Resources) -> ! {
loop { rtfm::wfi(); }
}
fn exti0(_t: &mut Threshold, mut r: EXTI0::Resources) {
// never called
}
这个设置使我能够触发中断,但是当处理程序应该被调用时,却出现了SEGV错误。我转储了二进制文件,在INTERRUPTS部分,ext0中断8000058指向地址080024e7。我在二进制文件中找不到对应的函数,所以可能是链接器错误?
我曾经认为RTFM将中断映射到任务名称,而我确实有一个名为"EXTI0"的任务。