微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我的 EXTI0 中断处理程序没有被覆盖/正常工作STM32F3Discovery

如何解决我的 EXTI0 中断处理程序没有被覆盖/正常工作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,_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()

解包将在第二次函数调用时发生恐慌,从而跳转到程序将停留的恐慌处理程序。

为此加分的功劳。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?