STM32f103之外部中断

发布者:Shuangfei最新更新时间:2016-12-26 来源: eefocus关键字:STM32f103  外部中断 手机看文章 扫描二维码
随时随地手机看文章
一、背景
        有个需求,IO口检测上升沿,然后做相应的动作。在此记录STM32F103的外部中断结构及配置方法,
    以备下次快速上手使用。
        有许多不太明白,又是老司机(:-D)帮忙,真的是站在别人的肩膀上会让你看的更远,走的更快,
    感谢老司机。 

二、正文
        STM32f103有68个可屏蔽中断。(但是,真正能用的其实远没有这么多,原因下面会详述。)
        有16个可编程的优先等级,优先等级的概念可详见我的另外一篇博客《STM32 之 NVIC(中断向量、
    优先级)简述》,链接:"http://www.cnblogs.com/ChYQ/p/5859974.html",接着看中断向量表,
   如下图:

        该中断向量表从高到低按照默认的中断优先级排序将所有可用的中断以表的形式列出来。仔细来看
    每一列代表的意义:        "优先级":无需多言,默认的中断优先级次序。        "优先级类型":即表明,这个对应的默认优先级是否可被配置更改,以使其优先级升高或者降低。        "名称":外部中断名称简写        "说明":通过这个我们就可以清楚知道前一列的"名称"代表的是哪个具体的外设中断。        "地址":这个地址即当对应的外部中断来时,若是使能了该外部中断,则MCU会将PC指针跳转到该
                地址,编译器一般会在该地址内保存对应的中断处理函数指针,进而可进入到相应的中断
                处理函数做相应的处理。
        然后说说外部中断事件(EXTI),外部中断事件由20个(互联型)/19个产生事件/中断的边沿检测器组
    成,白话说,即GPIO口可检测到对应IO口的上升沿/下降沿/双边沿事件,进而产生相应中断。
     接着看外部中断/时间框图,如下图:

        从最右来看,输入线连接至GPIO口,检测外部引脚的电平信号,上升沿/下降沿触发器与软件中断
    事件触发器,经过"或"器件传入下一级,意味着,这两类信号可独立引起中断/事件。经过"或"后,信
    号出现了分支,信号一路进入请求挂起寄存器,若是中断屏蔽寄存器设置为允许该信号,则一起"与"使
    能对应的中断。另一路则是同事件屏蔽寄存器信号相"与",通过则产生对应的事件。
        说到这,中断和事件又有什么不同呢?
        中断既是正常理解的中断,中断信号通过后,会让MCU的PC值跳转到相应的中断入口,找到对应的
    中断处理函数,然后进行中断处理。
        事件则用来向其他外设模块发送脉冲事件,通知外设去做相应的事情,就以ADC接收到脉冲事件后自动
   开始ADC转换为例进行说明。
        在ADC中,初始化ADC的结构体如下:
        typedef struct
        {
          uint32_t ADC_Mode;                     
          FunctionalState ADC_ScanConvMode;       
          FunctionalState ADC_ContinuousConvMode;
          uint32_t ADC_ExternalTrigConv;        
          uint32_t ADC_DataAlign;              
          uint8_t ADC_NbrOfChannel;           
        }ADC_InitTypeDef;
        选项"ADC_ExternalTrigConv",即是设置ADC的触发启动方式,可配置为软件触发启动,当该值配置为    "ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO"的时候,则ADC会在EXT产生脉冲事件的同时,开始自动
    触发ADC转换,与软件触发启动不同的是,这种方式是硬件自动完成,不需要软件参与。当然,不限定
    只能为EXT,还可以是定时器等等。
        最后说说上文提及的,为什么明明有68个可屏蔽中断,可实际却远没有这么多。
        上图提及,GPIO口通过连接到外部中断/事件线上来完成相应的中断请求,然后看看外部中断通用
    I/O口映像,如下图:

        外部中断/事件线只有16个,IO口却有A~G(7)组,每组有16个引脚,从上图可看出,实际上一次性
    可用的外部中断/事件也只能有16个,并不是IO口有多少,就能有多少个外部中断/事件。
     譬如说若是第一组PA0用了第一个中断/事件线,那么P(x)0就不能再被用作外部中断输入口了。(x
   为B~G)。
        外部中断结构大致就介绍到此。接下来说说,结合库函数,如何让外部中断配置成功并工作。一
    一般步骤为:        --> 初始化对应IO口为输入;        --> 使能对应IO口时钟,并设定IO口与外部中断/事件线的联系;
        注意:由于此处用了外部中断,所以对应的复用时钟要打开!
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能GPIO时钟复用
        // 设定GPIO口与中断/事件线联系库函数
            void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);            "GPIO_PortSource":选择对应的GPIO口。            "GPIO_PinSource" :选择对应的外部中断/事件线。        --> 初始化外部中断/事件线,并配置触发模式(上边沿/下边沿/双边沿);            void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
            结构体"EXTI_InitStruct"如下:
            typedef struct
            {                // 外部中断/事件线是否被使能                // "EXTI_Line0"->"EXTI_Line15"                uint32_t EXTI_Line;              
                // 中断模式/事件模式                EXTIMode_TypeDef EXTI_Mode;       
                // 触发模式(上边沿/下边沿/双边沿)                EXTITrigger_TypeDef EXTI_Trigger;                // "Enable"或"Disable"                FunctionalState EXTI_LineCmd;     
            }EXTI_InitTypeDef;        --> 设置NVIC,并使能中断;
            详见NVIC博客,不再详述        --> 写中断处理函数。
            STM32F103外部中断函数共有6个:
                EXTI0_IRQHandler          
                EXTI1_IRQHandler       
                EXTI2_IRQHandler         
                EXTI3_IRQHandler        
                EXTI4_IRQHandler          
                EXTI9_5_IRQHandler        
                EXTI15_10_IRQHandler   
            外部中断"0"->"4"有独立的中断处理函数;
            外部中断"5"->"9"共用中断函数"EXTI9_5_IRQHandler";
            外部中断"10"->"15"共用中断函数"EXTI15_10_IRQHandler";
            中断函数示例如下:            void EXTI9_5_IRQHandler(void)
            {    
                // 获取中断状态
                if(EXTI_GetITStatus(EXTI_IMR_MR8) != RESET)
                {    
                  // 清除挂起位                  EXTI_ClearITPendingBit(EXTI_IMR_MR8);    
                }
            } 


三、参考链接
    STM32 external interrupt
        http://www.programering.com/a/MDM4kzMwATg.html
   
  STM32 外部中断学习笔记
     http://blog.csdn.net/zzwdkxx/article/details/9036679        
    至此,记录完毕。


关键字:STM32f103  外部中断 引用地址:STM32f103之外部中断

上一篇:stm32启动文件 startup_stm32f10x_hd.s
下一篇:如何快速上手使用STM32库函数

推荐阅读最新更新时间:2024-03-16 15:27

stm32f103系列单片机串口初始化
这篇文章是本人从小白到熟悉这个单片机的过程,本在使用过程中主要是针对的64为单片机,但是其它引脚位数的单片机应该也是比较实用,由于篇幅较长, 废话不多说,开始单片机学习之旅吧!(本文章比较适用于对硬件知识有一定基础,如果有51系列单片机开发或者学习经验者。) 最开始笔者是从串口初始化开始,串口是个很好用的东西。不光可以用来通信而且还可以用来调试调试程序。下面这段程序是对串口1-3的初始化函数。这三段函数基本上没有什么区别只是引脚不同,所以后面的程序没加注释。 /* ******串口1初始化***************************************** * 函数名称:Usart1_Init * *
[单片机]
51单片机外部中断点亮LED
外部中断软件设计原理 中断发生的三个条件 ①中断源有中断请求; ②此中断源的中断允许位为 1; ③CPU 开中断(即 EA=1)。 比如我们配置外部中断 0,对应的配置程序如下: EA=1;//打开总中断开关 EX0=1;//开外部中断 0 IT0=0/1;//设置外部中断的触发方式(下降沿触发) 如果要配置的是外部中断 1,只需将 EX0 改为 EX1,IT0 改为 IT1 在编写程序时通常我们会将外部中断的配置放到一个自定义函数内便于管 理维护。如下伪代码所示: void Int0Init() { //设置 INT0 IT0=1;//边沿触发方式(下降沿) EX0=1;//打开 INT0 的中断允许。 EA=1;//打开总
[单片机]
MSP432(Keil5)——2.按键及外部中断驱动
本次按键实验是采用了板载的两个按键分别对应的P1.1与P1.4口,具体迁移到其他IO口的外部中断请移步原理图。 实验现象:按下按键会翻转板载LED灯状态。 key.c #include key.h void Key_Init(void) { /* Configuring P1.1 as an input and enabling interrupts */ /*配置1.1口为上拉输入*/ MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1); /*清除IO口的中断标志位*/ MAP_GPIO_clearInt
[单片机]
MSP432(Keil5)——2.按键及<font color='red'>外部中断</font>驱动
STM32F103攻城笔记】PWM功能实战
系统时钟是默认的HSI的8MHz频率!这个会影响计时器的计数频率,所以要知道要这个频率,以保证以后自己可以根据分频来控制PWM输出波形的频率大小!这个对于实际项目中的开发很重要,大都电机对于频率都会有要求,这里先不纠结这个,我们先来产生不同占空比的波形!系统时钟默认为8MHz。 第一步:初始化相关寄存器。定时器选择TIM3,通道选择CH2,即PA7端口。(这里注意,PA7口和TIM3_CH3是同一端口的复用功能,所以必须要对应,如果不想不对应的话就要设置映射,这里不对这个进行设置说明)。 代码如下(库函数实现): 第二步:写入参数,我要一个以周期为800个计数值,不分频的定时器, 代码就是 TIM3_PWM_Init(
[单片机]
【STM32】外部中断概述、寄存器、库函数(EXTI一般步骤)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第9章 中断和事件 外部中断概述 外部中断(EXTI),和在【STM32】NVIC中断优先级管理(中断向量表) 中讲述的CM3内核的外部中断不同。特指的是,在中断向量表中的EXTI的外部中断。STM32的每个IO都可以作为外部中断输入。 外部中断线 STM32的中断控制器支持19个外部中断、事件请求(也就是19条外部中断线): 线0~15:对应外部IO口的输入中断; 线16:连接到PVD输出; 线17:连接到RTC闹钟事件; 线18:连接到USB唤醒事件。 每条外部中断线可以独立的配置触发方式(上升沿、下降沿或者双边沿触发)、使能/失能
[单片机]
【STM32】<font color='red'>外部中断</font>概述、寄存器、库函数(<font color='red'>EXTI</font>一般步骤)
STM32F103的时钟配置源码学习记录
本文记录下看完正点原子战舰版的时钟配置视频后的理解,仅用作备忘。 时钟的配置源码在文件system_stm32f10x.c中。程序先通过判断使用的f10芯片的种类,选择你要的系统时钟频率SYSCLK。我用的芯片系统频率最高为72Mhz,芯片容量为大容量型,所以预编译后选择的是SYSCLK_FREQ_72MHz 72000000。 下面这段代码在时钟配置中没什么用,只是在以后的程序中可以通过SystemCoreClock来读出系统时钟的频率。 下面代码通过宏定义来选择配置系统时钟的函数,上边函数定义了SYSCLK_FREQ_72MHz,所以程序执行void SetSysClockTo72(void
[单片机]
<font color='red'>STM32F103</font>的时钟配置源码学习记录
STM32F10x外部中断EXTI
一、EXTI是什么? EXTI(External interrupt/event controller)外部中断事件控制器,在单片机中占有非常重要的地位。代码默认地从上向下执行,遇到条件或者其他语句,会按照指定的地方跳转。而在单片机执行代码的过程中,难免会有一些突发的情况需要处理,这样就会打断当前的代码,待处理完突发情况之后,程序会回到被打断的地方继续执行。 二、使用方法 1.功能框图及寄存器 20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程: ● 配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR) ● 设置软件中断寄存器的请求位(EXTI_SWIER) 当配置好软件中断事件寄
[单片机]
STM32F10x<font color='red'>外部中断</font><font color='red'>EXTI</font>
STM32F4 EXTI外部中断(一)
STM32中共有23根中断总线 外部中断配置步骤 1.使能IO时钟,初始化IO为输入 详见 2.开启SYSCFG时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟 3.设置IO口与中断线映射关系 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); 参数1:端口组 EXTI_PortSourceGPIOA, EXTI_PortSourceGPIOB, EXTI_PortSourceGPIOC ~~~ 参数2:中断线:EXTI_PinSource0 ~ EXTI_
[单片机]
STM32F4 <font color='red'>EXTI</font><font color='red'>外部中断</font>(一)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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