STM32无法正常进入外部中断的问题

这篇具有很好参考价值的文章主要介绍了STM32无法正常进入外部中断的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       本人在使用外部中断读取键值的时候遇见了无法进入外部中断的问题,我的问题是这样的:一开始想用STM32F103C8T6的PB12和PB14读取两个按键的状态,并且是使用外部中断读取,但是总是遇到一个按键的状态可以读取(即按键按下,GPIO口的电平发生跳变,然后进入对应的中断服务函数),但是另一个按键的状态并不能读取(即按键按下,但无法进入对应的中断服务函数)。下面是无法正常进入中断的程序,如图1所示。

#include "stm32f10x.h"                  // Device header
uint8_t KeyNum;
void Key_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
       GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12|GPIO_PinSource14);
    
    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line12 | EXTI_Line14;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStructure);
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
        
}

uint8_t KeyNum_Get(void)
{
    return KeyNum;
}

void EXTI15_10_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line12) == SET)
    {
        KeyNum = 3;//红色按键按下
    }
    else if(EXTI_GetITStatus(EXTI_Line14) == SET)
    {
        KeyNum = 4;//绿色按键按下
    }
    EXTI_ClearITPendingBit(EXTI_Line12 | EXTI_Line14);
}
 

 图1

       然后我又换了另外两个GPIO口(PA4和PA6)来测试是否可以正常进入外部中断,程序的思想和结构与图1的基本一致,但是没想到竟然可以正常进入中断读取两个按键的状态,代码如下图2所示。

#include "stm32f10x.h"                  // Device header
uint8_t KeyNum;
void Key_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4|GPIO_PinSource6);

    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line4 | EXTI_Line6;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStructure);
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
    
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
        
}

uint8_t KeyNum_Get(void)
{
    return KeyNum;
}

void EXTI4_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line4) == SET)
    {
        KeyNum = 3;//红色按键按下
    }
    EXTI_ClearITPendingBit(EXTI_Line4); //清除外部中断4标志位
}

void EXTI9_5_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line6) == SET)
    {
        KeyNum = 4;//绿色按键按下
    }    
    EXTI_ClearITPendingBit(EXTI_Line6); //清除外部中断6标志位
}

图2 

       对比图1和图2,我们可以发现图1程序中的PB12和PB14共用一个中断服务函数,但图2中的PA4和PA6分别用的两个中断服务函数,猜测图1是外部中断线配置得有问题,所以导致不能正常进入外部中断,然后我就开始调整图1外部中断线的配置(GPIO_EXTILineConfig函数)。

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12|GPIO_PinSource14);

改为:

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14); 

        此时程序就可以正常进入外部中断,至于为什么出现这种情况,本人暂时还没有找到原因。 文章来源地址https://www.toymoban.com/news/detail-679080.html

到了这里,关于STM32无法正常进入外部中断的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GD32(STM32)因为中断问题,导致不能进行程序 正常运行

    项目中,之前定时器中断就用了个TIM2,但后来程序优化需要再加一个计数定时器TIM6,     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;                      // 开启定时器时钟,即内部时钟CK_INT=72M     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);             // 自动重装载寄存器

    2024年02月07日
    浏览(34)
  • STM32F407的CAN2无法进入can接收中断的解决办法

    这个问题困扰了我两天,今天偶然看到一篇文章有讲这个:STM32 CAN1 CAN2 不能同时工作,最后原因竟然是。。。。 看了之后恍然大悟。下面贴上我的初始化代码: 主函数进行中断优先级分组和CAN初始化调用及使能 初始化代码: 中断服务函数: 效果展示:  CAN逻辑分析仪数据

    2024年02月13日
    浏览(45)
  • STM32 hal库编程定时器清除中断标志位,开启定时器中断会立即进入中断的问题

    1、如果不清除中断标志位,开启定时器中断的话,不能完成相应的计时,会立即进入中断。 2、如果在开启定时器中断前清除了中断标志位,就会等待计时完成再出发中断。 3、主要是针对单次计时使用,尤其是对第一次计时有要求的程序。

    2024年02月01日
    浏览(54)
  • STM32系列单片机“中断触发时间、最小中断周期、指令周期、平均执行速度、和单条指令执行时间”的问题研究

    查阅相关资料书籍和博客总结了一下知识点,以便学习巩固复习。 在学习《ARM Cortex-M3与Cortex-M4权威指南(第3版)》 这本书具体说明了触发中断需要多长时间。 在权威指南的第74页提到, Cortex-M3和Cortex-M4的中断等待非常小,只有12个周期 。也就是说触发中断后,需要12个时钟

    2024年04月10日
    浏览(41)
  • (STM32)中断系统和外部中断

    中断系统:是执行和管理中断的逻辑结构 外部中断:是众多能产生中断的外设之一 中断:指的是中断源(中断通道),中断产生CPU暂停正在执行程序,去执行中断程序,然后返回。提高效率 F1系列的STM32有68个中断源,不同系列需要看手册 EXTI(外部中断)、TIM、ADC、USART、SPI、

    2024年02月06日
    浏览(37)
  • 外部中断实验(stm32)

    说明:以下内容参考正点原子资料 中断服务函数名称默认 参考前面的文章实验代码 参考前面的文章实验代码 参考前面的文章实验代码 GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 0~15,这样每个中 断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、

    2024年02月13日
    浏览(38)
  • 【STM32】STM32学习笔记-EXTI外部中断(11)

    中断 :在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 中断优先级 :当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加

    2024年02月04日
    浏览(37)
  • STM32 HAL库 STM32CubeMx -- 外部中断

    中断,是指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序

    2024年02月08日
    浏览(42)
  • STM32--EXTI外部中断

    前文回顾---STM32--GPIO 相关回顾--有关中断系统简介 目录 STM32中断 NVIC  EXTI外部中断 AFIO EXTI框图 旋转编码器简介 对射式红外传感器工程 代码: 旋转编码器工程 代码: 先说一下 基本原理 : 1. 中断请求发生 :外部事件(如按键触发,定时器溢出等)引起中断请求信号; 2. 中

    2024年02月12日
    浏览(38)
  • 【STM32教程】第四章 STM32的外部中断EXTI

    案例代码及相关资料下载链接: 链接:https://pan.baidu.com/s/1hsIibEmsB91xFclJd-YTYA?pwd=jauj  提取码:jauj   中断系统的定义:中断是指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包