关于中断的,例如在主程序中开启了外部时钟下降沿沿触发中断,...

STM32外部中断学习笔记
STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18:
线0~15:对应外部 IO口的输入中断。线16:连接到 PVD 输出。线17:连接到 RTC 闹钟事件。线18:连接到 USB 唤醒事件。
&触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。&
外部中断分组:STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。
EXTICR寄存器组,总共有4 个,因为编译器的寄存器组都是从0 开始编号的,所以EXTICR[0]~ EXTICR[3],对应《STM32参考手册》里的 EXTICR1~ EXTICR 4(查了好久才搞明白这个数组的含义!!)。每个 EXTICR只用了其低16 位。
EXTICR[0] ~EXTICR[3]的分配如下:
EXTI寄存器的结构体:
typedef struct
vu32 RTSR;
vu32 FTSR;
vu32 SWIER;
} EXTI_TypeD
& & & &IMR:中断屏蔽寄存器
这是一个 32 寄存器。但是只有前 19 位有效。当位 x 设置为1 时,则开启这个线上的中断,否则关闭该线上的中断。
EMR:事件屏蔽寄存器
同IMR ,只是该寄存器是针对事件的屏蔽和开启。
RTSR:上升沿触发选择寄存器
该寄存器同IMR ,也是一个32为的寄存器,只有前 19位有效。位 x 对应线x 上的上升沿触发,如果设置为 1 ,则是允许上升沿触发中断/ 事件。否则,不允许。
FTSR:下降沿触发选择寄存器
同 PTSR,不过这个寄存器是设置下降沿的。下降沿和上升沿可以被同时设置,这样就变成了任意电平触发了。
SWIER:软件中断事件寄存器
通过向该寄存器的位x 写入 1 ,在未设置 IMR 和EMR的时候,将设置PR中相应位挂起。如果设置了IMR 和EMR时将产生一次中断。被设置的SWIER位,将会在PR中的对应位清除后清除。
PR:挂起寄存器
0 ,表示对应线上没有发生触发请求。
1,表示外部中断线上发生了选择的边沿事件。通过向该寄存器的对应位写入 1 可以清除该位。
在中断服务函数里面经常会要向该寄存器的对应位写1 来清除中断请求。
Ex_NVIC_Config基本是按照这个结构来编写的
中断配置步骤
STM32的每个IO口都可以作为中断输入,这点很好用。要把IO口作为外部中断输入,有以下几个步骤:
1)初始化IO口为输入。
这一步设置你要作为外部中断输入的IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。
2)开启IO口复用时钟,设置IO口与中断线的映射关系。
STM32的IO口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO口与中断线的对应关系。才能把外部中断与中断线连接起来。3)开启与该IO口相对的线上中断/事件,设置触发条件。这一步,我们要配置中断产生的条件,STM32可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。4)配置中断分组(NVIC),并使能中断。这一步,我们就是配置中断的分组,以及使能,对STM32的中断来说,只有配置了NVIC的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。关于NVIC的详细介绍,请参考前面章节。5)编写中断服务函数。
这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃!所以在开启了某个中断后,一定要记得为该中断编写服务函数。在中断服务函数里面编写你要执行的中断后的操作。
实验4--外部中断实验exit.c函数如下:
#include&"exti.h"&&
#include&"led.h"&&
#include&"key.h"&&
#include&"delay.h"&&
#include&"usart.h"&&
void&EXTI0_IRQHandler(void)&&
&&&&delay_ms(10);
&&&&if(KEY2==1)&&
&&&&&&&&LED0=!LED0;&&
&&&&&&&&LED1=!LED1;&&&
&&&&}&&&&&&&&&&
&&&&EXTI-&PR=1&&0;&&
void&EXTI15_10_IRQHandler(void)&&
{&&&&&&&&&&&&&
&&&&delay_ms(10);&&&&
&&&&if(KEY0==0)&&&&&&
&&&&&&&&LED0=!LED0;&&
&&&&}else&if(KEY1==0)
&&&&&&&&LED1=!LED1;&&
&&&&EXTI-&PR=1&&13;&&&&&
&&&&EXTI-&PR=1&&15;&&&&&
void&EXTIX_Init(void)&&
&&&&RCC-&APB2ENR=1&&2;&&&&&
&&&&JTAG_Set(JTAG_SWD_DISABLE);
&&&&GPIOA-&CRL&=0XFFFFFFF0;
&&&&GPIOA-&CRL=0X08;&&&&&
&&&&GPIOA-&CRH&=0X0F0FFFFF;
&&&&GPIOA-&CRH=0X80800;&&&&&&&&&&&&&&&&&&&
&&&&GPIOA-&ODR=1&&13;&&&&
&&&&GPIOA-&ODR=1&&15;&&&&
&&&&Ex_NVIC_Config(GPIO_A,0,RTIR);&
&&&&Ex_NVIC_Config(GPIO_A,13,FTIR);
&&&&Ex_NVIC_Config(GPIO_A,15,FTIR);
&&&&MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);&&&&
&&&&MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);
其中的两个函数:Ex_NVIC_Config(GPIO_A,0,RTIR);和MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);这两个函数都是在sys.c里定义,分别完成了步骤2、3、4.函数原型如下:
void&Ex_NVIC_Config(u8&GPIOx,u8&BITx,u8&TRIM)&&&
&&&&u8&EXTADDR;&&
&&&&u8&EXTOFFSET;&&
&&&&EXTADDR=BITx/4;
&&&&EXTOFFSET=(BITx%4)*4;&&
&&&&RCC-&APB2ENR=0x01;
&&&&AFIO-&EXTICR[EXTADDR]&=~(0xF&&EXTOFFSET);
&&&&AFIO-&EXTICR[EXTADDR]=GPIOx&&EXTOFFSET;
&&&&EXTI-&IMR=1&&BITx;
&&&&if(TRIM&0x01)EXTI-&FTSR=1&&BITx;
&&&&if(TRIM&0x02)EXTI-&RTSR=1&&BITx;
& & & & & & & &这个函数完成了两个步骤:
& & & & & & & &2、开启IO口复用时钟,设置IO口与中断线的映射关系
& & & & & & & &3、开启与该IO口相对的线上的中断/时间,设置触发条件
void&MY_NVIC_Init(u8&NVIC_PreemptionPriority,u8&NVIC_SubPriority,u8&NVIC_Channel,u8&NVIC_Group)&&&&
&&&&u32&&&&&&
&&&&u8&IPRADDR=NVIC_Channel/4;&&
&&&&u8&IPROFFSET=NVIC_Channel%4;
&&&&IPROFFSET=IPROFFSET*8+4;&&&&
&&&&MY_NVIC_PriorityGroupConfig(NVIC_Group);
&&&&temp=NVIC_PreemptionPriority&&(4-NVIC_Group);&&&&&
&&&&temp=NVIC_SubPriority&(0x0f&&NVIC_Group);&&
&&&&temp&=0
&&&&if(NVIC_Channel&32)NVIC-&ISER[0]=1&&NVIC_C
&&&&else&NVIC-&ISER[1]=1&&(NVIC_Channel-32);&&&&&&
&&&&NVIC-&IPR[IPRADDR]=temp&&IPROFFSET;
这个函数完成了:
4、配置中断分组(NVIC),并使能中断
补充&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &&&
在实验18--触摸屏实验中,中断初始化没有调用这个函数,它是这样配置的:
&&&&&&&MY_NVIC_Init(2,0,EXTI1_IRQChannel,2);&&&&&&&
RCC-&APB2ENR=0x01;&&&&
&&&&&&&AFIO-&EXTICR[0]=0X0020;&
EXTI-&IMR=1&&1;&&&&&&&&
EXTI-&EMR=1&&1;&&&&&&&&
EXTI-&FTSR=1&&1;&&&&&&&
& & & & RCC-&APB2ENR=0x01;&&这一句是开启复用时钟,什么时候需要开启复用时钟?手册有这样一段:&
& & & &也就是说只要操作EVCR、EXTICRX、MAPR的时候,就必须开启复用功能时钟,即当你要配置stm32的事件输出、外部中断、重映射的时候.就必须开启复用时钟。
& & & & &AFIO-&EXTICR[0]=0X0020; //EXTI1映射到PC1
& & & & &这一句设置中断映射,如上文所说EXTICR[0]~ EXTICR[3] 对应 EXTICR1~ EXTICR4,举例:
& & & & &AFIO-&EXTICR[3] &= 0xFFFFFF0F;&
& & & & &AFIO-&EXTICR[3] = 0xFFFFFF0F; //EXTI13映射到PA13,0(即0x00)代表A口,1(即0x01)代表B口,依次类推,6(即0x0110)代表G口.
& & & & &AFIO-&EXTICR[3] &= 0xFFFFFF0F;&
& & & & &AFIO-&EXTICR[3] = 0xFFFFFF2F; //EXIT13映射到PC13,2(0x0010)代表C口
外部中断函数不能进入的原因分析分析,可能为以下几个方面:&
1)GPIO或者AFIO的时钟没有开启;&
2)GPIO和配置的中断线路不匹配;&
3)中断触发方式和实际不相符合;
4)中断处理函数用库函数时,写错,经常可能出现数字和字母之间没有下划线;&
5)外部中断是沿触发,有可能检测不到沿,比如中断线是低电平(浮空输入),触发是下降沿触发,可能会出现一直是低电平,高电平的时候是一样的情况,电平持续 & & & & 为高电平;&
6)没有用软件中断来触发外部中断,调用函数EXTI_GenerateSWInterrupt;,因为软件中断先于边沿中断处理。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
&嵌入式linux应用程序开发完全手册&中断控制器操作(外部中断)学习笔记
一.ARM中断体系 当一个“异常”发生时,或者说当收到一个中断触发信号时,ARM9将会自动完成如下一些工作: (1)
在异常工作模式的连接寄存器R14中保存前一个工作模式的下一条指令地址,即是pc+4或者pc+8. (2)
将CPSR的值到异 ...
原文地址:转:STM32外部中断的使用作者:崖壁苍松 日 外部中断 中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加复杂.今天就将来探讨一下关于STM32中的中断系统. ARM Coete ...
STM32外部中断--转 一,中断优先级: 为什么中断要有优先级 何为占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行- -抢断式优先响应,俗称中断嵌套. 何为副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应: 在占先式优先级相同的情况下,如果有低副优 ...
一.基本概念
ARM Coetex-M3内核共支持256个中断,当中16个内部中断,240个外部中断和可编程的256级中断优先级的设置.STM32眼下支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位.
STM32可支持68个中断通道,已经固定分配给对应的外部设备,每一个 ...
一.基本概念
ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置.STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位.
STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个 ...
文章来源:http://blog.chinaunix.net/uid--id-4088004.html STM32
IO 口中断的一些基础概念.STM32 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 的强大之处.STM32F103 的中断控制器支持 19 个外部中断/事件请求.每个中断设有状态位,每个中断/事件都有独 ...
一.相关概念 中断按来源分为内部中断和外部中断 按中断入口的跳转方法可以分为向量中断和非向量中断.向量中断,不同的中断有不同的中断号,中断到来自动跳转:非向量中断,多个中断共享一个入口地址.进入中断后由软件判断是哪个中断.
linux中断处理机制:linux将中断分解为顶半部和底半部.顶半部完成尽可能少的比较紧急的功能,底半部完成相对来说并不是非常紧 ...
转自:http://blog.csdn.net/yskcg/article/details/8201505 前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark. 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 STM32 的每一个GPIO都能配置成一个外部中断触发源 ...EXTI中断程序范例 - 编程当前位置:& &&&EXTI中断程序范例EXTI中断程序范例&&网友分享于:&&浏览:0次EXTI中断程序实例程序功能:使用EXTI中断实现按键点亮LED。按键一次,LED状态翻转一次。在程序中开启GPIOE.2的中断线2。并设置为下降沿触发中断。//exti.h1234567891011#ifndef&__EXTI_H__#define&__EXTI_H__&#include&&stm32f10x.h&#include&&MyTime.h&#include&&bitband.h&&void&EXTI_Configuration(void);void&EXTI2_IRQHandler(void)&;&#endif//exti.c12345678910111213141516171819202122232425262728293031323334353637383940414243#include&&exti.h&#include&&key.h&&void&EXTI_Configuration(void){&&&&EXTI_InitTypeDef&EXTI_InitS&&&&NVIC_InitTypeDef&NVIC_InitS&&&&&&&&KEY_Configuration();&&&&&&&&&&&&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);&&&&&&&&&GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);&&&&&&&&&&&&&EXTI_InitStruct.EXTI_Line&=&EXTI_Line2;&&&&EXTI_InitStruct.EXTI_Mode&=&EXTI_Mode_I&&&&EXTI_InitStruct.EXTI_Trigger&=&EXTI_Trigger_F&&&&EXTI_InitStruct.EXTI_LineCmd&=&ENABLE;&&&&&&&&&EXTI_Init(&EXTI_InitStruct);&&&&&&&&&&&NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);&&&&&&&&&NVIC_InitStruct.NVIC_IRQChannel&=&EXTI2_IRQn;&&&&&NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority&=&2;&&&&NVIC_InitStruct.NVIC_IRQChannelSubPriority&=&2;&&&&NVIC_InitStruct.NVIC_IRQChannelCmd&=&ENABLE;&&&&&&&&&NVIC_Init(&NVIC_InitStruct);}&&&&&void&EXTI2_IRQHandler(void)&{&&&&&&&&&MyDelay_ms(10);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(KEY2==0)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&LED0=!LED0;&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&EXTI_ClearITPendingBit(EXTI_Line2);&&&&}//main.c1234567891011121314#include&&MyTime.h&#include&&exti.h&&int&main(void){&&&&MySysTick_Init();&&&&&&&&GPIO_Configuration();&&&&&&&&&EXTI_Configuration();&&&&&&&&&&&while(1);&&&&&}注:使用IO 口外部中断的一般步骤:&123451)初始化&IO&口为输入。&2)开启&IO&口复用时钟,设置&IO&口与中断线的映射关系。&3)初始化线上中断,设置触发条件等。&4)配置中断分组(NVIC),并使能中断。&5)编写中断服务函数。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有单片机:用C51编写他们响应并处理中断的程序:设请求源的输入已接好,外部中断0用低电平触发方式_百度知道单片机 关于外部中断 和 按键的处理_百度知道}

我要回帖

更多关于 时钟下降沿 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信