精华内容
下载资源
问答
  • STM32中断

    千次阅读 2016-08-24 16:11:49
    一、 用程序来解释STM32中断系统  使用外部中断的步骤: 1,、设置好相应的时钟(打开相应GPIO的端口时钟,而且要打开复用功能) 2、设置好相应的中断(实质就是设置中断控制器NVIC,包括中断分组,通道,优先级)...

    一、 用程序来解释STM32中断系统

                 使用外部中断的步骤:

    1,、设置好相应的时钟(打开相应GPIO的端口时钟,而且要打开复用功能)

    2、设置好相应的中断(实质就是设置中断控制器NVIC,包括中断分组,通道,优先级)

    3、I/O初始化(GPIO设置,包括模式,输出、输入,相应引脚)

    4,、将相应的IO口设置成中断线路(要在设置外部中断之前)并初始化;(因为GPIO不是专用的中断引脚,所以在用GPIO来触发外部中断的时候需要设置将GPIO相应的引脚和中断线连接起来,具体代码如下,)

    5、在选择的 中断通道的响应函数来写中断函数;(void EXTI9_5_IRQHandler(void)例如在这个中断函数里面写用户自己中断程序,比如我们要实现的功能就是要在进入中断函数的时候讲某个引脚置位

         假设有三个按键,用按键来触发相应的中断。K1/K2/K3连接的是PC5/PC2/PC3,因此我将用EXTI5/EXTI2/EXTI3三个外部中断。PB5/PD6/PD3分别连接了三个LED灯。中断的效果是按下按键,相应的LED灯将会被点亮。

    1.       设置相应的时钟
         首先需要打开GPIOB、GPIOC和GPIOE(因为按键另外一端连接的是PE口)。然后由于是要用于触发中断,所以还需要打开GPIO复用的时钟。相应的函数在GPIO的学习笔记中有了详细了解释。详细代码如下:
    void RCC_cfg()
    {
           //打开PE PD PC PB端口时钟,并且打开复用时钟
           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
    }
        设置相应的时钟所需要的RCC函数在stm32f10x_rcc.c中,所以要在工程中添加此文件。
     
    2.       设置好相应的中断
    设置相应的中断实际上就是设置NVIC,在STM32的固件库中有一个结构体NVIC_InitTypeDef,里面有相应的标志位设置,然后再用NVIC_Init()函数进行初始化。详细代码如下:
    void NVIC_cfg()
    {
            NVIC_InitTypeDef NVIC_InitStructure;                                              //第一结构体
            NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                          //选择中断分组2
            
            
    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQChannel;     //选择中断通道2
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为0
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //响应式中断优先级设置为0
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                   //使能中断
            NVIC_Init(&NVIC_InitStructure);
     
            
            NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;            //选择中断通道3
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占式中断优先级设置为1
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //响应式中断优先级设置为1
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                   //使能中断
            NVIC_Init(&NVIC_InitStructure);
     
            
            NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;  //选择中断通道5
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占式中断优先级设置为2
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //响应式中断优先级设置为2
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                   //使能中断
            NVIC_Init(&NVIC_InitStructure);
    }
     
    由于有3个中断,因此根据前文所述,需要有3个bit来指定抢占优先级,所以选择第2组。又由于EXTI5-9共用一个中断响应函数,所以EXTI5选择的中断通道是EXTI9_5_IRQChannel,详细信息可以在头文件中查询得到。用到的NVIC相关的库函数在stm32f10x_nivc.c中,需要将此文件复制并添加到工程中。具体位置可以查看关于GPIO的笔记。这段代码编译起来没有任何问题,但是在链接的时候就会报错,需要把STM32F10xR.LIB加入工程中,具体位置在…KeilARMRV31LIBSTSTM32F10xR.LIB。
     
    3.       IO口初始化
    void IO_cfg()
    {
           GPIO_InitTypeDef GPIO_InitStructure;
     
          
           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                             //选择引脚2
           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //输出频率最大50MHz
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //带上拉电阻输出
           GPIO_Init(GPIOE,&GPIO_InitStructure);
           GPIO_ResetBits(GPIOE,GPIO_Pin_2);                              //将PE.2引脚设置为低电平输出
     
          
           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5; //选择引脚2 3 5
           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //选择输入模式为浮空输入
           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //输出频率最大50MHz
           GPIO_Init(GPIOC,&GPIO_InitStructure);                                 //设置PC.2/PC.3/PC.5
          
          
           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6;                  //选择引脚3 6
           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //输出频率最大50MHz
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //带上拉电阻输出
           GPIO_Init(GPIOD,&GPIO_InitStructure);
          
          
           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                         //选择引脚5
           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //输出频率最大50MHz
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //带上拉电阻输出
           GPIO_Init(GPIOB,&GPIO_InitStructure);        
    }
    其中连接外部中断的引脚需要设置为输入状态,而连接LED的引脚需要设置为输出状态,初始化PE.2是为了使得按键的另外一端输出低电平。GPIO中的函数在stm32f10x_gpio.c中。
     
    4.       把相应的IO口设置为中断线路
    由于GPIO并不是专用的中断引脚,因此在用GPIO来触发外部中断的时候需要设置将GPIO相应的引脚和中断线连接起来,具体代码如下:
    void EXTI_cfg()
    {
           EXTI_InitTypeDef EXTI_InitStructure;
           //清空中断标志
           EXTI_ClearITPendingBit(EXTI_Line2);
           EXTI_ClearITPendingBit(EXTI_Line3);
           EXTI_ClearITPendingBit(EXTI_Line5);
     
           //选择中断管脚PC.2 PC.3 PC.5
           GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);
           GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3);
           GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);
     
           EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3 | EXTI_Line5; //选择中断线路2 3 5
           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置为中断请求,非事件请求
           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //设置中断触发方式为上下降沿触发
           EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                          //外部中断使能
          EXTI_Init(&EXTI_InitStructure);
    }
    EXTI_cfg中需要调用到的函数都在stm32f10x_exti.c。
     
    5.       写中断响应函数
    STM32不像C51单片机那样,可以用过interrupt关键字来定义中断响应函数,STM32的中断响应函数接口存在中断向量表中,是由启动代码给出的。默认的中断响应函数在stm32f10x_it.c中。因此我们需要把这个文件加入到工程中来。
    在这个文件中,我们发现,很多函数都是只有一个函数名,并没有函数体。我们找到EXTI2_IRQHandler()这个函数,这就是EXTI2中断响应的函数。我的目标是将LED灯点亮,所以函数体其实很简单:
    void EXTI2_IRQHandler(void)
    {
           //点亮LED灯
           GPIO_SetBits(GPIOD,GPIO_Pin_6);
           //清空中断标志位,防止持续进入中断
           EXTI_ClearITPendingBit(EXTI_Line2);
    }
     
    void EXTI3_IRQHandler(void)
    {
           GPIO_SetBits(GPIOD,GPIO_Pin_3);
           EXTI_ClearITPendingBit(EXTI_Line3);
    }
     
    void EXTI9_5_IRQHandler(void)
    {
           GPIO_SetBits(GPIOB,GPIO_Pin_5);
     
           EXTI_ClearITPendingBit(EXTI_Line5);
    }
    由于EXTI5-9是共用一个中断响应函数,因此所有的EXTI5 – EXTI9的响应函数都写在这个里面。
     
    6.       写主函数
    #include "stm32f10x_lib.h"
     
    void RCC_cfg();
    void IO_cfg();
    void EXTI_cfg();
    void NVIC_cfg();
     
    int main()
    {
              RCC_cfg();
              IO_cfg();
              NVIC_cfg();
              EXTI_cfg();
     
              while(1);            
    }
     

     

     

    阅读(15243)| 评论(3)
    推荐转载
    marginwidth="0" marginheight="0" id="lmid_iframe" width="590" height="100" frameborder="0" scrolling="no" allowtransparency="true" src="http://g.163.com/r?site=netease&affiliate=blog&cat=article&type=column590x100&location=1" style="margin: 0px; padding: 0px; border-width: 0px; border-style: initial; display: block;">
    关闭
    玩LOFTER,免费冲印20张照片,人人有奖!     我要抢>

    评论

      登录后你可以发表评论,请先登录。登录>>
    2014-01-06 20:41
    路过
    想问下STM32对外部中断滤波等级能设置吗

    2014-11-08 18:42
    路过 回复 路过

    没有所谓的滤波的,ti的cm3系列就有。

    2014-05-01 09:51
    外部中断里面可不可以嵌套串口接收中断呢?
     
     

    网易公司版权所有 ©1997-2016

    marginwidth="0" marginheight="0" class="ztag adv-iframe" width="300" height="250" frameborder="0" scrolling="no" allowtransparency="true" src="http://g.163.com/r?site=netease&affiliate=blog&cat=homepage&type=logo300x250&location=10" style="margin: 0px; padding: 0px; border-width: 0px; border-style: initial; display: block;">

    展开全文
  • stm32中断

    2017-03-13 14:46:21
    stm32支持19个外部中断/事件请求。 stm32的每个io都可以作为外部中断中断输入口。 线0-15对应外部IO口的输入中断; 线16:连接到PVD输出; 线17:连接到闹钟事件; 线18:连接到USB 唤醒事件。

    stm32支持19个外部中断/事件请求。
    stm32的每个io都可以作为外部中断的中断输入口。
    线0-15对应外部IO口的输入中断;
    线16:连接到PVD输出;
    线17:连接到闹钟事件;
    线18:连接到USB 唤醒事件。

    展开全文
  • STM32 中断

    2014-05-12 10:33:35
    STM32支持19个外部中断。 中断线0~15

    STM32支持19个外部中断。

    中断线0~15:对应外部IO口的输入中断;

    中断线16:连接到PVD输出;(可编程电压检测器)

    中断线17:连接到RTC闹钟事件;

    中断线18:连接到USB唤醒事件。

    STM32的IO口有很多,相应的中断线却只有16个,如何将IO口与中断线对应呢?STM32是这样解决的:

    GPIOA~GPIOG的[0:15]分别对应中断线的0~15。这样每条中断线最多可以对应7个IO口。

    例如,GPIOA_Pin_0,GPIOB_Pin_0,GPIOC_Pin_0,GPIOD_Pin_0,GPIOE_Pin_0,GPIOF_Pin_0,GPIOG_Pin_0,这7个IO口都对应中断线0。

    中断线每次只能连接一个IO口,STM32使用EXTICR来决定中断线配置到哪个GPIO上。

    配置完中断,还有一个重要的部分是中断响应函数。

    STM32的中断响应函数与51的中断响应函数不同,51中通过关键字interrupt来识别中断,STM32通过查找中断向量表来识别。

    STM32在中断向量表中有关于外部中断的函数。

    EXTI0_IRQHandler() ;line0

    EXTI1_IRQHandler() ;line1

    EXTI2_IRQHandler() ;line2

    EXTI3_IRQHandler() ;line3

    EXTI4_IRQHandler() ;line4

    EXTI9_5_IRQHandler() ;line9~5

    EXTI15_10_IRQHandler() ;line15~10

    PVD_IRQHandler() ;PVD through EXTI Line detect

    RTCAlarm_IRQHandler() ;RTC Alarm through EXTI Line

    USBWakeUp_IRQHandler() ;USB

    当外部中断线上发生了选择的边沿事件,挂起寄存器PR的对应位会被置为1。要想重复使用中断,要记得清除挂起标志。





    展开全文
  • STM32中断优先级

    2017-03-27 17:56:26
    STM32中断

    高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和15级嵌套。

    每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级

    1个人SPI1_IRQChannel,设定如下
    NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0,可取0-15

     

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别1,可取0-7
    还需要指定他的阶层:
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0,可取0-1

     

    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别0,可取0-7
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1

     

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别2,可取0-7
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1

     

    先比较抢占优先级别(阶级),如果相同再比较响应优先级(阶层),这些中断里SPI1优先级别最高,可以在其他事情代码的嵌套里,其次为USART1、EXTI0、EXTI9-5所以最外层的是EXTI9-5,最先处理的是USART1。

    抢断优先级,顾名思义,能再别人中断是抢占别人中断,实现中断嵌套。响应优先级则只能排队,不能抢在前面插别人的对,即不能嵌套。

    展开全文
  • STM32中断应用总结

    千次阅读 2019-07-26 14:10:37
    STM32中断应用总结 STM32中断很强大,STM32中断可以嵌套,任何外设都可以产生中断,其中中断和异常是等价的. 中断执行流程: 主程序执行过程可以产生中断去执行中断的内容(保护现场),然后在返回继续执行中断. 中断...
  • STM32中断系统

    千次阅读 2019-01-20 21:53:56
    第三篇文章——STM32中断系统异常类型NMI异常向量表 异常类型 编号0 ~ 15中,除去编号为0和7 ~ 10这5个未用的异常编号,共10个系统异常。 编号16 ~ 255,共240个外部中断,简称IRQ。外部中断的编号为IRQ#0 ~ IRQ#239...
  • stm32中断优先级分组

    千次阅读 2016-12-27 08:29:06
    STM32中断优先级和开关总中断一,中断优先级:STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要...
  • STM32中断相关知识总结 一:中断是什么? 中断是指处理器运行过程中,出现某些意外情况,CPU能自动停止正在运行的程序并转入处理新情况的程序(中断服务函数),处理完毕后又返回原被暂停的程序继续运行。 CM3和CM7 ...
  • STM32 中断初识

    千次阅读 2015-09-15 14:00:59
    STM32 中断初识前段时间经常用stm32f4 discovery,但是因为对NVIC , EXTI不是很了解,所以使用的过程中一直都在避免使用中断,这两天没什么事决定来学习一下stm32中断,写一下自己的心得,如有谬误之处,欢迎...
  • STM32中断函数名

    千次阅读 2017-01-04 12:47:22
    STM32中断函数名和普通的ARm裸板开发不同。使用stm32库函数编程时,中断函数名是固定死的。 具体函数名可以在启动文件startup_stm32fxxx_xd.s的Vector Table Mapped(中断函数向量表)中查看。 启动文件 startup_...
  • STM32中断进行分组

    千次阅读 2018-03-30 10:43:25
    STM32F103系列上面,又只有60个可屏蔽中断(在107系列才有68个) 中断管理方法 首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。 分组配置是在寄存器SCB->...
  • STM32 中断使用

    2016-11-01 14:53:07
    STM32中断有时候用多了容易乱,特此记录一下,因为之前一直是M3 M0交叉用,固件库有些区别容易弄混,这里说一下M3外部中断的配置 步骤: 1.将对应的IO配置为输入 2.将IO对应的中断的优先等级用NVIC配置好 3.设置好...
  • STM32中断管理

    2016-06-20 17:00:53
    首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。 抢占优先级&响应优先级 1.高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。 2.抢占优先级相同的中断...
  • STM32中断向量表的偏移量设置方法

    千次阅读 2020-09-28 09:35:13
    STM32中断向量偏移 总结一下在IAP升级中APP程序的中断向量表的偏移 讲解中断偏移之前先看一下程序的启动流程 STM32F4 的内部闪存(FLASH)地址起始于 0x08000000,一般情况下,程序文件就从此 地址开始写入。...
  • STM32中断处理名和中断处理函数名

    千次阅读 2018-06-22 09:40:54
    STM32中断名和中断处理函数名在库函数中有固定命名。 中断名其所在位置为stm32fxxx.h中的IRQn_Type枚举中,比如/** * @brief STM32F4XX Interrupt Number Definition, according to the selected device * in @...
  • STM32F103XXX 中断优先级设置或配置 STM32 中断系统系统是非常复杂的。如果是搞不清楚计算机底层硬件或计算机工作原理的人,是很难搞懂中断系统。作为普通程序员只要会使用也未尝不可呀!我认为会使用就很好了,因为...
  • STM32 中断详解

    万次阅读 2017-09-13 13:34:22
    先说EXTI吧,EXTI 控制器的主要特性如下:● 每个中断/事件线上都具有独立的触发和屏蔽● 每个中断线都具有专用的状态位● 支持多达 23 个软件事件/中断请求● 检测脉冲宽度低于 APB2 时钟宽度的外部信号下图是ST207...
  • STM32中断与轮询笔记

    2019-06-19 17:35:06
    STM32中断与轮询笔记 中断 VS 轮询 轮询: 周期/连续的检查外部事件是否发生 消耗大量CPU的处理时间 轮询过程需要和其他功能代码结合 由于CPU需要处理其他事件(可能是无关紧要的),可能丢失关键事件 中断:...
  • STM32中断非常强大,每个外设都可以产生中断 提示:以下是本篇文章正文内容 一、NVIC 简介 NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。 1.NVIC 寄存器...
  • STM32中断优先级彻底讲解

    千次阅读 2017-05-15 10:53:14
    STM32中断优先级彻底讲解 一:综述 STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以...
  • STM32中断 抢占优先级 响应优先级

    千次阅读 2019-06-21 17:54:22
    STM32中断有0-4 5个分组,对每个中断设置一个抢占优先级和响应优先级。 分组配置是在寄存器SCB->AIRCR中配置: AIRCR[10:8] IP[7:4]分配情况 分配结果 0 111 0:4 0位抢占优先级,4位响应优先级 1 ...
  • 关于STM32中断分组及优先顺序的学习

    千次阅读 2019-02-02 18:15:17
    关于STM32中断分组及优先顺序的学习 最近在搞STM32中断的事情,起因是程序里面有冲突,总是搞不懂优先顺序,查了不少资料,结合实际的程序做了测试,现总结如下: 1、STM32中断的分类 实际就是大家常说的0-4 的分组...
  • stm32 中断架构

    千次阅读 2018-12-12 23:15:29
    1. 初步了解 stm32F4有两种CPU模式:特权模式和用户模式。当发生异常或中断时会进入到特权模式中 ...stm32F4的中断架构分为:不可屏蔽异常和可屏蔽异常(将中断看作是一种特殊的异常),不可屏蔽异常是stm32F4的...
  • STM32中断优先级--学习心得

    千次阅读 2016-05-22 02:14:14
    刚开始学习STM32单片机时,对中断优先级的规则不是很明白,通过今天的学习,对这方面的内容有了新的了解,记录下来以便日后查看。 首先说一下STM32的中断: STM32有84个中断,包括...1.首先,对STM32中断进行分组,组
  • STM32中断(外部中断和定时器中断)

    千次阅读 2019-05-27 17:22:00
    spi,iic的中断和51单片机不一样,这些在stm32属于外设,是外部中断。 因为STM32中断非常多,因此必须设置中断优先级 STM32有两个优先级的概念:抢占式优先级和响应式优先级(亚优先级,副优先级) 抢占式优先级:...
  • STM32中断设置以及中断优先级设置

    万次阅读 多人点赞 2018-09-13 15:26:45
    最近,在做一个智能锁的项目,由于,今天碰到了一个关于中断的问题,因此,又...本项目使用到的是STM32F030C8型号的MCU,我们可以从官方下载到的标准库文件中的启动汇编文件中,查看到本型号单片机的外部中断向量表...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,821
精华内容 5,128
关键字:

stm32中断