我的 EXTI0 中断处理程序不正确 overwritten/working (STM32F3Discovery)
My EXTI0 interrupt handler is not overwritten/working properly (STM32F3Discovery)
我正在尝试学习嵌入式设备的编码,并想实现中断。为此,我编写了一个程序,其中主要功能只是一个循环,使一个 LED 闪烁,中断应点亮另一个 LED 以测试是否一切正常。
我的代码如下所示:
#![no_main]
#![no_std]
use f3discovery::{Tim6, set_high};
use cortex_m;
use cortex_m_rt::entry;
use stm32f30x::interrupt;
#[inline(never)]
fn delay_ms(ms: u16) {
Tim6::new_ms(ms).setup();
Tim6::start();
while Tim6::check_finish() {}
Tim6::reset();
}
const RCC_AHBENR: u32 = 0x4002_1014;
const RCC_APB2ENR: u32 = 0x4002_1018;
const _GPIOA_MODER: u32 = 0x4800_0000;
const GPIOA_PUPDR: u32 = 0x4800_000C;
const _GPIOA_BSRR: u32 = 0x4800_0018;
const _SYSCFG_EXTICR1 : u32 = 0x4001_0008;
const EXTI_IMR1 : u32 = 0x4001_0400;
const EXTI_RTSR1 : u32 = 0x4001_0408;
const EXTI_PR1 : u32 = 0x4001_0414;
const NVIC_ISER0 : u32 = 0xE000_E100;
#[entry]
fn main() -> ! {
let (mut leds, _rcc, _tim6) = aux9::init();
Tim6::enable();
set_high(RCC_AHBENR, 1 << 17);
set_high(RCC_APB2ENR, 1);
set_high(GPIOA_PUPDR, 1 << 1);
set_high(EXTI_IMR1, 1);
set_high(EXTI_RTSR1, 1);
set_high(NVIC_ISER0, 1 << 6);
loop {
leds[0].on();
delay_ms(500);
leds[0].off();
delay_ms(500);
}
}
#[interrupt]
fn EXTI0() {
let (mut leds, _rcc, _tim6) = aux9::init();
leds[4].on();
// delay_ms(500);
// leds[4].off();
// delay_ms(500);
set_high(EXTI_PR1, 1);
}
我正在使用我自己为定时器编写的 f3discovery 模块和另一个用于 LED 的模块 (aux9)。当我 运行 程序时,第一个 LED 闪烁,直到按下导致中断的按钮。但是第二个 LED 永远不会亮起。删除 EXTI0 会产生相同的结果,这让我认为处理程序没有被正确覆盖。
非常感谢任何建议:)
原因是行
let (mut leds, _rcc, _tim6) = aux9::init();
在 EXTI0 函数中。函数 aux9::init()
包含行
let p = stm32f0x::Peripherals::take().unwrap()
并且 unwrap 将在第二次函数调用时出现 panic,从而跳转到程序将停留的 panic 处理程序。
为此加分。
我正在尝试学习嵌入式设备的编码,并想实现中断。为此,我编写了一个程序,其中主要功能只是一个循环,使一个 LED 闪烁,中断应点亮另一个 LED 以测试是否一切正常。
我的代码如下所示:
#![no_main]
#![no_std]
use f3discovery::{Tim6, set_high};
use cortex_m;
use cortex_m_rt::entry;
use stm32f30x::interrupt;
#[inline(never)]
fn delay_ms(ms: u16) {
Tim6::new_ms(ms).setup();
Tim6::start();
while Tim6::check_finish() {}
Tim6::reset();
}
const RCC_AHBENR: u32 = 0x4002_1014;
const RCC_APB2ENR: u32 = 0x4002_1018;
const _GPIOA_MODER: u32 = 0x4800_0000;
const GPIOA_PUPDR: u32 = 0x4800_000C;
const _GPIOA_BSRR: u32 = 0x4800_0018;
const _SYSCFG_EXTICR1 : u32 = 0x4001_0008;
const EXTI_IMR1 : u32 = 0x4001_0400;
const EXTI_RTSR1 : u32 = 0x4001_0408;
const EXTI_PR1 : u32 = 0x4001_0414;
const NVIC_ISER0 : u32 = 0xE000_E100;
#[entry]
fn main() -> ! {
let (mut leds, _rcc, _tim6) = aux9::init();
Tim6::enable();
set_high(RCC_AHBENR, 1 << 17);
set_high(RCC_APB2ENR, 1);
set_high(GPIOA_PUPDR, 1 << 1);
set_high(EXTI_IMR1, 1);
set_high(EXTI_RTSR1, 1);
set_high(NVIC_ISER0, 1 << 6);
loop {
leds[0].on();
delay_ms(500);
leds[0].off();
delay_ms(500);
}
}
#[interrupt]
fn EXTI0() {
let (mut leds, _rcc, _tim6) = aux9::init();
leds[4].on();
// delay_ms(500);
// leds[4].off();
// delay_ms(500);
set_high(EXTI_PR1, 1);
}
我正在使用我自己为定时器编写的 f3discovery 模块和另一个用于 LED 的模块 (aux9)。当我 运行 程序时,第一个 LED 闪烁,直到按下导致中断的按钮。但是第二个 LED 永远不会亮起。删除 EXTI0 会产生相同的结果,这让我认为处理程序没有被正确覆盖。
非常感谢任何建议:)
原因是行
let (mut leds, _rcc, _tim6) = aux9::init();
在 EXTI0 函数中。函数 aux9::init()
包含行
let p = stm32f0x::Peripherals::take().unwrap()
并且 unwrap 将在第二次函数调用时出现 panic,从而跳转到程序将停留的 panic 处理程序。
为此加分。