stm32如何在中断服务程序里关闭EXTI中断?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32如何在中断服务程序里关闭EXTI中断?相关的知识,希望对你有一定的参考价值。

那个中断已经被触发了,你要做的只有是清中断标志位:
EXTI_ClearITPendingBit(EXTI_Line14);
EXTI_ClearFlag(EXTI_Line14);
非要关的话,我觉得这样就关了
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = DISABLE; //ENABLE
EXTI_Init(&EXTI_InitStructure);
参考技术A 注意外部中断信号的响应速度,最好在退出时清中断,以免重复响应

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

【中文标题】我的 EXTI0 中断处理程序没有被覆盖/工作正常(STM32F3Discovery)【英文标题】:My EXTI0 interrupt handler is not overwritten/working properly (STM32F3Discovery) 【发布时间】:2021-04-17 22:50:35 【问题描述】:

我正在尝试学习嵌入式设备的编码并希望实现中断。为此,我编写了一个程序,其中主要功能只是一个循环,使一个 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 会产生相同的结果,这导致我认为处理程序没有被正确覆盖。

我很感激任何建议:)

【问题讨论】:

【参考方案1】:

原因是线路

let (mut leds, _rcc, _tim6) = aux9::init();

在 EXTI0 函数中。函数aux9::init() 包含这一行

let p = stm32f0x::Peripherals::take().unwrap()

并且展开将在第二个函数调用时发生恐慌,从而跳转到程序将停留的恐慌处理程序。

这要归功于 agg。

【讨论】:

以上是关于stm32如何在中断服务程序里关闭EXTI中断?的主要内容,如果未能解决你的问题,请参考以下文章

STM32 进入不了中断

STM32中断函数

STM32的外部中断问题

stm32程序执行完main函数然后去干嘛了?之后的中断为何不能响应???

STM32 EXTI(外部中断)

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