STM32进不了外部中断的一个可能原因

发布者:a407895356最新更新时间:2022-04-20 来源: eefocus关键字:STM3  外部中断 手机看文章 扫描二维码
随时随地手机看文章

近期在使用一块STM32的板子的时候,用库函数和外部中断来接收霍尔传感器信号,配置了很久,就是进不去外部中断。


IO口的初始化函数如下:


void Hall_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;  

EXTI_InitTypeDef EXTI_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能HALL所在的外部中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0; //抢占优先级0

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x1; //子优先级0 

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

NVIC_Init(&NVIC_InitStructure);    //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  /* 配置Hall接口IO */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//HALL信号检测端口

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

//清空中断标志

    EXTI_ClearITPendingBit(EXTI_Line7);     //清除中断标志位

    EXTI_ClearITPendingBit(EXTI_Line8);     //清除中断标志位

    EXTI_ClearITPendingBit(EXTI_Line9);     //清除中断标志位

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7 | GPIO_PinSource8 | GPIO_PinSource9 );


EXTI_InitStructure.EXTI_Line=EXTI_Line7 | EXTI_Line8 | EXTI_Line9;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);  

}

/* I/O线中断,中断线为PC7、PC8、PC9 */

void EXTI9_5_IRQHandler(void)

{

  if(EXTI_GetITStatus(EXTI_Line7) != RESET) //确保是否产生了EXTI Line中断

  {

    EXTI_ClearITPendingBit(EXTI_Line7);     //清除中断标志位

  } 

  if(EXTI_GetITStatus(EXTI_Line8) != RESET) //确保是否产生了EXTI Line中断

  {

    EXTI_ClearITPendingBit(EXTI_Line8);     //清除中断标志位

  }

  if(EXTI_GetITStatus(EXTI_Line9) != RESET) //确保是否产生了EXTI Line中断

  {

    EXTI_ClearITPendingBit(EXTI_Line9);     //清除中断标志位

  }

  LED1=!LED1;//每进一次外部中断,LED1切换一次

}


上述初始化代码,咋一看,没发现啥问题,可就是进不了中断。

后来发现是这一语句的问题:


GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7 | GPIO_PinSource8 | GPIO_PinSource9 );


通过GPIO_PinSource的定义,我们可以看到:


#define GPIO_PinSource0            ((uint8_t)0x00)

#define GPIO_PinSource1            ((uint8_t)0x01)

#define GPIO_PinSource2            ((uint8_t)0x02)

#define GPIO_PinSource3            ((uint8_t)0x03)

#define GPIO_PinSource4            ((uint8_t)0x04)

#define GPIO_PinSource5            ((uint8_t)0x05)

#define GPIO_PinSource6            ((uint8_t)0x06)

#define GPIO_PinSource7            ((uint8_t)0x07)

#define GPIO_PinSource8            ((uint8_t)0x08)

#define GPIO_PinSource9            ((uint8_t)0x09)

#define GPIO_PinSource10           ((uint8_t)0x0A)

#define GPIO_PinSource11           ((uint8_t)0x0B)

#define GPIO_PinSource12           ((uint8_t)0x0C)

#define GPIO_PinSource13           ((uint8_t)0x0D)

#define GPIO_PinSource14           ((uint8_t)0x0E)

#define GPIO_PinSource15           ((uint8_t)0x0F)


这里跟GPIO口的初始化就很大不同了,GPIO口初始化,你可以取或后进行赋值,但是现在:


GPIO_PinSource7 | GPIO_PinSource8 | GPIO_PinSource9 =0x07|0x08|0x09=0x0F


所以,你能还初始化到正确的外部中断吗?!

正确的初始化函数如下:


void Hall_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;  

EXTI_InitTypeDef EXTI_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能HALL所在的外部中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0; //抢占优先级0

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x1; //子优先级0 

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

NVIC_Init(&NVIC_InitStructure);    //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  /* 配置Hall接口IO */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//HALL信号检测端口

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

//清空中断标志

    EXTI_ClearITPendingBit(EXTI_Line7);     //清除中断标志位

    EXTI_ClearITPendingBit(EXTI_Line8);     //清除中断标志位

    EXTI_ClearITPendingBit(EXTI_Line9);     //清除中断标志位

//老老实实一行一行来

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7 );

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8 );

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource9 );

    

EXTI_InitStructure.EXTI_Line=EXTI_Line7 | EXTI_Line8 | EXTI_Line9;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);  

}


这样初始化就能正常进入外部中断了。

关键字:STM3  外部中断 引用地址:STM32进不了外部中断的一个可能原因

上一篇:STM32基础之串口通信
下一篇:通过CAN总线控制VESC驱动直流无刷电机

推荐阅读最新更新时间:2024-11-11 23:39

51单片机~定时器和外部中断(各个位控制作用详解)
(一)中断 (二)定时器,计数器中断 TL0低八位先进行存储,达到0XF,向上进一,直到高低八位都满时就可以产生中断或者控制TF0口。 (1). TMOD低四位控制T0,高四位控制T1。 GATE:(门控位) (2)控制寄存器TCON:(低四位控制外部中断,高四位控制计数器启动和中断申请) (3)定时器的四种工作方式: 定时器开启工作原理: 四种工作方式:(机器周期(脉冲)和T0引脚来绝定电路触发) 区别在于TH0和TL0的位数和输出) 常用1和2 1. 2.用于比较精确的脉冲信号发射器: 3. 程序化步奏: 计算:初值==2^n-N(公式要根据你使用那种方式0.1
[单片机]
51单片机~定时器和<font color='red'>外部中断</font>(各个位控制作用详解)
NVIC寄存器组中的中断挂起SETPEND与消除CLRPEND,与外部中断挂起寄存器EXTI_PR
STM32的中断控制是分级管理的,CM3内核中的NVIC是顶层,对每个通道都设有1BIT的中断挂起位, 但每个通道可能不止一个中断源,比如EXTI5_9_IRQn,对NVIC而言,只算一个通道,但实际包含有5个中断源, 因此,下层就必须实现对这多个中断源的独立监控,这就是EXTI- PR中的挂起位了。 STM32的中断系统可以理解为分两级管理, 顶层当然是CM3内核强大的NVIC,下层就是形形色色的片上外设了, 对于NVIC来说,它最大可以管理256个不同的中断通道, 这256个中断,内核自留了16个,剩下的通称为外部中断(注意与EXTI不要混淆,EXTI是外部中断中的一小部分,全称为外部线中断),外部中断可以多达240个(具
[单片机]
STM32外部中断解决方法
01 单片机外部中断简介 所谓外部中断,就是通过外部信号所引起的中断,如单片机引脚上的电平变化(高电平、低电平)、边沿变化(上升沿、下降沿)等。51单片机有5个中断源,其中有两个是外部中断,分别为INT0和INT1,INT0被分配在P3.2引脚,INT1被分配在P3.2引脚,也即是说如果使用51单片机的外部中断0,则必须将信号接在P3.2上,否则无效。 02 举例说明什么是中断 单片机在执行程序时有两种方式: 查询方式 中断方式 所谓查询方式就是单片机一遍一遍的扫描,查看所监视的目标有没有发生变化,是一种主动式的监视方法,用一个成语可以很客观的描述:守株待兔。 所谓中断方式就是单片机不主动去监视目标,而是目标主动通知单片机状态
[单片机]
STM32<font color='red'>外部中断</font>解决方法
STM32F103学习笔记(五) 外部中断
首先是外部中断基本的概念:STM32 的每个 IO 都可以作为外部中断 的中断输入口,这点也是 STM32 的强大之处。 STM32F103 的中断控制器支持 19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 STM32F103 的 19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断。 线 16:连接到 PVD 输出。 线 17:连接到 RTC 闹钟事件。 线 18:连接到 USB 唤醒事件。 线16~18还没有学到只看了线0~15。 每个中断线对应着7个GPIO口,形成映射关系,以线 0 为例:它对应了 GPIOA.0、 GPIOB.0、 GPIOC.0、 GPIOD.0
[单片机]
STM32F103学习笔记(五) <font color='red'>外部中断</font>
STM32库函数EXTI_GetFlagStatus和EXTI_GetIT
一个是获取状态的,一个是获取中断的。 EXTI_GetFlagStatus只是纯粹读取中断标志位的状态,但是不一定会响应中断(EXT_IMR寄存器对该中断进行屏蔽);而EXTI_GetITStatus除了读取中断标志位,还查看EXT_IMR寄存器是否对该中断进行屏蔽,在中断挂起&没有屏蔽的情况下就会响应中断。仔细看看代码就知道区别了 FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) { FlagStatus bitstatus = RESET; assert_param(IS_GET_EXTI_LINE(EXTI_Line)); if ((EXTI- PR &
[单片机]
重构外部中断回调函数来区分外部中断具体引脚做具体任务
1.STM32CubeMX配置如下: 这里GPIO mode一共有六种分别是: (1)上升沿触发外部中断 (2)下降沿触发外部中断 (3)边沿触发外部中断 (4)上升沿触发外部事件 (5)下降沿触发外部事件 (6)边沿触发外部事件 2.CubeMX生成的代码: /** Configure pins as * EXTI */ void MX_GPIO_Init(void) { __HAL_RCC_GPIOD_CLK_ENABLE(); //使能GPIO时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = DATA_433M_Pi
[单片机]
重构<font color='red'>外部中断</font>回调函数来区分<font color='red'>外部中断</font>具体引脚做具体任务
STM32F1外部中断实例
使用外部中断的基本步骤如下: 1. 设置好相应的时钟; 2. 设置相应的中断; 3. IO口初始化; 4. 把相应的IO口设置为中断线路(要在设置外部中断之前)并初始化; 5. 在选择的中断通道的响应函数中中断函数。 1、开启时钟 void RCC_Config(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE)| RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); } 设置相应的时钟所需要的RCC函数在stm32f10x
[单片机]
stm32中断服务函数c语言,STM32 外部中断详解
本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 1 前言 打算写一下中断,又忍不住想说一下中断的概念,去书上翻一翻,或者自己在搜索引擎上搜一下,都可以找到一大堆,包括本文写的这个外部中断也不例外。如果要写光是中断就可以单独写一篇了,所以本文直入主题,对于STM32的外部中断进行详细的剖析。 2 STM32的外部中断 下图来自《STM32参考手册》,从整个架构图可以知道,外部中断的功能可以配置六个寄存器; 中断屏蔽寄存器(EXTI_IMR) 事件屏蔽寄存器(EXTI_EMR) 上升沿触发选择寄存器(EXTI_RTSR) 下降沿触发选择寄存器(EXTI_FTSR) 软件中断事件寄存
[单片机]
stm32中断服务函数c语言,STM32 <font color='red'>外部中断</font>详解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved