Не удается получить прерывание на PE0 STM32 - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь получить простые прерывания на моем STM32F407G-DISC1, и я не могу настроить канал прерываний EXTI0 для приема от PE0, и вместо этого он, кажется, срабатывает только при изменении PA0.

Когда я закорачиваю вывод 3.3 В на PA0, он печатает «Interrupt Received», но когда я закорачиваю 3.3V на PE0, ничего не происходит.?

Сценарии сборки и другие файлы конфигурации основаны на быстром запуске cortex-m с небольшими изменениями.Если они уместны, я также могу опубликовать их.

Вот мой код:

# Cargo.toml
[package]
name = "embedded-interrupt"
version = "0.1.0"
edition = "2018"

[dependencies]
cortex-m = "0.6.0"
cortex-m-rt = "0.6.8"
cortex-m-semihosting = "0.3.3"
panic-semihosting = "0.5"
hal = {package = "stm32f4xx-hal", features = ["stm32f407", "rt"], version = "0.5" }
// main.rs
#![no_std]
#![no_main]

extern crate panic_semihosting;

use cortex_m_rt::entry;
use cortex_m::interrupt::{Mutex, free};
use cortex_m_semihosting::hprintln;
use hal::prelude::*;
use hal::stm32::{interrupt, Interrupt, EXTI};
use hal::gpio::{ExtiPin, Edge, gpioe, Input, PullDown};

use core::cell::RefCell;

static PE0: Mutex<RefCell<Option<gpioe::PE0<Input<PullDown>>>>> = Mutex::new(RefCell::new(None));
static EXT_INTER: Mutex<RefCell<Option<EXTI>>> = Mutex::new(RefCell::new(None));

#[entry]
fn start() -> ! {

    let p = hal::stm32::Peripherals::take().unwrap();
    let c = cortex_m::Peripherals::take().unwrap();

    let gpioe = p.GPIOE.split();
    let mut syscfg = p.SYSCFG;
    let mut exti = p.EXTI;
    let mut nvic = c.NVIC;

    nvic.enable(Interrupt::EXTI0);

    let mut pe0 = gpioe.pe0.into_pull_down_input();
    pe0.make_interrupt_source(&mut syscfg);
    pe0.enable_interrupt(&mut exti);
    pe0.trigger_on_edge(&mut exti, Edge::FALLING);

    free(|cs| {
        let cell = PE0.borrow(&cs);
        *cell.borrow_mut() = Some(pe0);

        let cell = EXT_INTER.borrow(&cs);
        *cell.borrow_mut() = Some(exti);
    });

    loop{}
}

#[interrupt]
fn EXTI0() {
    hprintln!("Interrupt received").unwrap();

    // clear the interrupt
    free(|cs| {
        let pe0 = PE0.borrow(&cs);
        let exti = EXT_INTER.borrow(&cs);

        if let (Some(pe0), Some(mut exti)) = (pe0.borrow_mut().as_mut(), exti.borrow_mut().as_mut()) {
            pe0.clear_interrupt_pending_bit(&mut exti);
        }
    });

}

1 Ответ

0 голосов
/ 19 мая 2019

Очевидно, что часы контроллера конфигурации системы должны быть включены для изменения регистров syscfg. Добавление rcc.apb2enr.modify(|_, w| w.syscfgen().enabled()); заставляет его работать. Полный источник:

#![no_std]
#![no_main]

extern crate panic_semihosting;

use cortex_m::interrupt::{free, Mutex};
use cortex_m_rt::entry;
use cortex_m_semihosting::hprintln;
use hal::gpio::{gpioe, Edge, ExtiPin, Input, PullDown};
use hal::prelude::*;
use hal::stm32::{interrupt, Interrupt, EXTI};

use core::cell::RefCell;

static PE0: Mutex<RefCell<Option<gpioe::PE0<Input<PullDown>>>>> = Mutex::new(RefCell::new(None));
static EXT_INTER: Mutex<RefCell<Option<EXTI>>> = Mutex::new(RefCell::new(None));

#[entry]
fn start() -> ! {
    let p = hal::stm32::Peripherals::take().unwrap();
    let c = cortex_m::Peripherals::take().unwrap();

    let gpioe = p.GPIOE.split();
    let rcc = p.RCC;
    let mut syscfg = p.SYSCFG;
    let mut exti = p.EXTI;
    let mut nvic = c.NVIC;

    rcc.apb2enr.modify(|_, w| w.syscfgen().enabled()); // important

    nvic.enable(Interrupt::EXTI0);

    let mut pe0 = gpioe.pe0.into_pull_down_input();
    pe0.make_interrupt_source(&mut syscfg);
    pe0.enable_interrupt(&mut exti);
    pe0.trigger_on_edge(&mut exti, Edge::FALLING);

    free(|cs| {
        let cell = PE0.borrow(&cs);
        *cell.borrow_mut() = Some(pe0);

        let cell = EXT_INTER.borrow(&cs);
        *cell.borrow_mut() = Some(exti);
    });

    loop {}
}

#[interrupt]
fn EXTI0() {
    hprintln!("Interrupt received").unwrap();

    // clear the interrupt
    free(|cs| {
        let pe0 = PE0.borrow(&cs);
        let exti = EXT_INTER.borrow(&cs);

        if let (Some(pe0), Some(mut exti)) = (pe0.borrow_mut().as_mut(), exti.borrow_mut().as_mut())
        {
            pe0.clear_interrupt_pending_bit(&mut exti);
        }
    });
}
...