STM32学习笔记——外部中断的初步了解

发布者:自由梦想最新更新时间:2016-09-19 来源: eefocus关键字:STM32  外部中断 手机看文章 扫描二维码
随时随地手机看文章
STM32F103有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级16级可编程的中断优先级。

理解STM32的中断,要从中断优先级哦分组开始。而理解中断优先级分组,就要理解什么是抢占优先级,什么是响应优先级。
所谓:
抢占优先级:如果有两中断先后出发,已经在执行的中断优先级如果没有后出发的中断优先级高,就会先处理抢占优先级高的中断,也就是说有较高的抢占优先级的中断可以打断抢占优先级较低的中断,这是实现中断嵌套的基础。
响应优先级:只在同一抢占优先级的中断同时触发时起作用。抢占优先级相同,则优先执行响应优先级较高的中断。响应优先级不会造成中断的嵌套,如果中断的两个优先级都一致,那么优先执行位于中断向量表中位置较高的中断。
STM32通过中断向量控制器(NVIC)来分配抢占优先级和响应优先级的数量。
ARM cortex-m3内核中有一个3位宽度的PRIGROUP数据区,用来指示一个8位数据序列中的小数点的位置从而表示中断优先级的分组。
如果PRIGROUP数据位为000,即为0,说明8位数据序列中小数位置在第1位的左边,为xxxxxxx.y 。用于表示中断优先级的分组的含义就是:用7位的数据宽度来表示抢占优先级的数量,即为128,用1位的数据宽度来表示响应优先级的数量即为2。
STM32中只有5个优先级分组,表示方法略有不同:

000


MDK中定义的中断相关的寄存器结构体为:

typedef struct
{
  vu32 ISER[2];
  u32  RESERVED0[30];
  vu32 ICER[2];
  u32  RSERVED1[30];
  vu32 ISPR[2];
  u32  RESERVED2[30];
  vu32 ICPR[2];
  u32  RESERVED3[30];
  vu32 IABR[2];
  u32  RESERVED4[62];
  vu32 IPR[15];
} NVIC_TypeDef;

其中:
ISER 全称是interupt set-Enable Registers,这是以讹中断使能寄存器组。ISER[0]的bit0~bit31分别对应中断0~31.ISER[1]的bit0~bit27对应中断32~59,要是能某个中断,必须设置相应的ISER位为1,使该中断被使能。
ICER全称是Interrupt clear-Enable Registers中断清除寄存器组。该寄存器组的功能与ISER的作用恰好相反,是用来清除某个走红段的使能的。
ISPR全称是Interrupt set-Enable Registers,中断挂起控制寄存器。通过置1,可以将正在进行的中断挂起,而执行同级或更高级别的中断,写0无效。
ICPR全称是Interrupt clear-Enable Registers,中断解挂控制寄存器,通过设置1,可以将挂起的中断解挂,置0无效。
IABR全称是Active Bit Registers,是中断激活标志位寄存器组。对应位所代表的中断和ISER一样,如果为1,则表示该位所对应的中断正在被执行。
IPR[15]全称是Interrupt Priority Registers,是中断优先级控制的寄存器。IPR寄存器由15个32bit的寄存器组成,每个可屏蔽中断用8bit,IPR[0]的 [31~24],[23~16],[15~8],[7~0]分别对应中断3~0。
每个可屏蔽中断占用的8bit并没有全部使用,只用了高4位,这4位又分为抢占优先级和响应优先级。
一般把IO口作为外部中断输入的步骤:
1.初始化IO口为输入
2.开启IO口服用时钟,设置IO口与中断线的映射关系
3.开启与该IO口相对应的线上中断/事件,设置触发条件
4.配置中断分组(NVIC),并使能中断
5.编写中断服务函数
分享一下中断程序:

void EXTIX_Init(void)
{
GPIO_InitTypeDef   GPIO_InitStructure;                     //定义端口结构初始化
EXTI_InitTypeDef   EXTI_InitStructure;             //定义中断结构初始化
NVIC_InitTypeDef   NVIC_InitStructure;                    //定义中断优先级结构初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);     //改变指定管脚的映射 GPIO_Remap_SWJ_Disable SWJ完全禁用澹(JTAG+SW-DP)
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);     //改变指定管脚的映射GPIO_Remap_SWJ_JTAGDisable,JTAG-DP 禁用?SW-DP使能

//初始化KEY01-> PB5,  KEY00->PB4  设置为输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

KEY01 = 1;
KEY00 = 0;

//初始化KEY13->PB3 设置为输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);

//初始化KEY12->PC12, KEY11->PC11, KEY10->PC10,设置为输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);

//设置KEY12->PC12, KEY11->PC11, KEY10->PC10中断
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);         //开启肞B3与中断线的映射

EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource12);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource11);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource10);

EXTI_InitStructure.EXTI_Line = EXTI_Line12;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

EXTI_InitStructure.EXTI_Line = EXTI_Line11;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

EXTI_InitStructure.EXTI_Line = EXTI_Line10;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
  
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
  }

void EXTI3_IRQHandler(void)
{
//delay_ms(10);
if(EXTI_GetITStatus(EXTI_Line3) !=RESET)
{
  LED4 =!LED4;
        }
EXTI_ClearITPendingBit(EXTI_Line3);
}


void EXTI15_10_IRQHandler(void)
{
//delay_ms(10);

if (EXTI_GetITStatus(EXTI_Line12) !=RESET)
{
  LED3 =!LED3;
        }
else if (EXTI_GetITStatus(EXTI_Line11) !=RESET)
{
  LED2 =!LED2;  
         }
else if (EXTI_GetITStatus(EXTI_Line10) !=RESET)
{
  LED1 =!LED1;
         }
EXTI_ClearITPendingBit(EXTI_Line12);      //清除EXTI线路挂起位
EXTI_ClearITPendingBit(EXTI_Line11);      //清除EXTI线路挂起位
EXTI_ClearITPendingBit(EXTI_Line10);      //清除EXTI线路挂起位
}

关键字:STM32  外部中断 引用地址:STM32学习笔记——外部中断的初步了解

上一篇:基于STM32的TCP/IP协议栈代码之UDP分析
下一篇:如何利用STM32代码进行读保护功能

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

STM32通过DMA采集多通道AD
环境: 主机:XP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 通过脚PA1,PA2采集AD。每路AD采集10次。 #include ad_driver.h //全局变量 //AD采样存放空间 __IO uint16_t ADCConvertedValue ; //函数 //初始化AD void init_ad(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //----
[单片机]
stm32中AT发送可变短信
/******************** (C) COPYRIGHT 2015 ************************** * 文件名 :main.c * 描述 :使用方法: p为要发送的短信内容 * center为手机卡的短信中心 * tel为要发送的手机号的号码 * 串口会打印AT操作的内容 **********************************************************************************/ #include stm32f10x.h #include usart1.h #include wchar.h #include wc
[单片机]
STM32 JTAG失效恢复
昨天调试一块STM32L151的板子,用的是JlinkOB,调试时,出现下面的错误: JLink Error:could not start CPU core. JLink Warning:CPU could not be halted 这个错误出现的原因是,程序中有修改JTAG端口(PA13,PA14)的语句,当把JTAG当做普通IO口时,JLink就不能返回调试信息,JLink就读不回相应寄存器的值了。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_S
[单片机]
STM32笔记(五)---中断应用
一、异常类型 1-1 定义说明 F103 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。其中系统异常有 8 个(如果把 Reset 和 HardFault 也算上的话就是 10 个) ,外部中断有 60个。除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。有关具体的系统异常和外部中断可在标准库文件 stm32f10x.h 这个头文件查询到,在 IRQn_Type 这个结构体里面包含了 F103 系列全部的异常声明。 表格 1 系统异常清单 二、NVIC简介 2-1 定义说明 NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯
[单片机]
<font color='red'>STM32</font>笔记(五)---中断应用
STM32F030C6外部中断问题
使用STM32F030C6外部中断的时候碰到一个很奇怪的问题: 1、中断线13一直响应(没有外部触发的这个中断); 2、在debug的时候,按下按键触发中断可以进入中断; 3、但下载到单片机中运行,发现中断没有被触发。 4、debug过程中看到中断触发请求寄存器PR13一直是1; 5、如果把延时函数去掉,debug界面看到中断触发请求寄存器PR13一直是0,其实中断还是一直响应,设置一个断点便知道; 根源问题:打开中断复位时钟函数用错了。这个函数RCC_AHBPeriphResetCmd(RCC_APB2Periph_SYSCFG,ENABLE);改为 RCC_APB2PeriphCl
[单片机]
STM32F030C6<font color='red'>外部中断</font>问题
基于STM32的嵌入式以太网门禁系统设计
  引言   当前,有很多的企业是采用佩戴工作证来完成门禁管理,而且还是采用传统的人工方式完成,不仅容易被人混入,且没有记录,存在各种人为的失误。同时,市场上门禁系统存在传输距离受限制、性能不佳等问题。   随着嵌入式技术日新月异的发展,以及以太网技术的普及,使得基于以太网的嵌入式产品越来越多,发展也越来越快。本文研究的就是采用以太网传输数据和射频芯片识别智能卡相结合的门禁系统,相对于传统的门禁系统,以太网解决了传输距离上的问题。其次,采用了基于80C51内核的射频芯片PN532,使得性能更加稳定。其工作的基本原理是先将智能卡放在门禁系统上,系统读取数据并传送给主芯片STM32进行处理,主芯片处理后再通过以太网协议LwIP将数
[单片机]
基于<font color='red'>STM32</font>的嵌入式以太网门禁系统设计
详解STM32单片机的堆栈
学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。 对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区: 栈区(stack) 堆区(Heap) 全局区(static) 文字常亮区程序代码区 程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。 栈是从高到低分配,堆是从低到高分配。 普通单片机与STM32单片机中堆栈的区别 普通单片机启动时,不需要用bootl
[单片机]
STM32如何高效接收串口数据?
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 DMA,直接内存存取,可以用它的双手释放CPU的灵魂,所以,本文通过USART3进行串口收发,接受使用DMA的方式,无需CPU进行干预,当接受完成之后,数据可以直接从内存的缓冲区读取,从而减少了CPU的压力。 具体的代码实现如下: usart_driver.h 封装了接口,数据接收回调函数类型,基本数据结构等; usart_driver.c 函数原型实现,中断服务函数实现等; 拷贝这两个文件即可,可以根据目录下的参考用例,进行初始化。 头文件usart_driver.h已经声明了外部函数可能用到的接口; USART3_DR的地
[单片机]
<font color='red'>STM32</font>如何高效接收串口数据?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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