stm32stm32f0 外部中断断实验

【图文】STM32外部中断实验_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32外部中断实验
&&STM32外部中断实验
大小:1.28MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢STM32学习笔记:外部中断的使用 - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 17008|回复: 11
STM32学习笔记:外部中断的使用
在线时间24 小时
主题帖子好友
中级会员, 积分 350, 距离下一级还需 150 积分
中级会员, 积分 350, 距离下一级还需 150 积分
STM32中,每一个GPIO都可以触发一个外部,但是,GPIO的中断是以组位一个单位的,同组间的外部同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。
对于中断的控制,STM32有一个专用的管理机构:NVIC。对于NVIC的详细解释,可以参考《ARM Cortex-M3权威指南》,Joseph Yiu著,宋岩译,北京航空航天大学出版社出版,第8章NVIC与中断控制。中断的使能,挂起,优先级,活动等等部都是NVIC在管理的。因为我学习STM32重点在于如何开发程序,所以内部的一些东西,在此我就不详细说明了,有感兴趣的可以参看上面提到的那本数。
程序开发其实上面那些基本概念和知识只是对STM32的中断系统有一个大概的认识,用程序说话将会更能够加深如何使用中断。使用的基本步骤如下:<font color="#.设置好相应的时钟;<font color="#.设置相应的中断;<font color="#.IO口初始化;<font color="#.把相应的IO口设置为中断线路(要在设置外部中断之前)并初始化;<font color="#.在选择的中断通道的响应函数中中断函数。
由于我用的奋斗开发板没有引出相应的芯片引脚,所以只能用按键来触发相应的中断。根据原理图,K1/K2/K3连接的是PC5/PC2/PC3,因此我将用EXTI5/EXTI2/EXTI3三个外部中断。PB5/PD6/PD3分别连接了三个LED灯。中断的效果是按下按键,相应的LED灯将会被点亮。 <font color="#.设置相应的时钟首先需要打开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中,所以要在工程中添加此文件。
<font color="#.设置好相应的中断设置相应的中断实际上就是设置NVIC,在STM32的固件库中有一个结构体NVIC_InitTypeDef,里面有相应的标志位设置,然后再用NVIC_Init()函数进行初始化。详细代码如下:void NVIC_cfg()
{
& && &&&NVIC_InitTypeDef NVIC_InitS
& && &&&NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);& && && && && && && && &&&//选择中断分组2
& && &&&
& && &&&
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQC& &&&//选择中断通道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_IRQC& && && && &//选择中断通道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_IRQC&&//选择中断通道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。
<font color="#.IO口初始化void IO_cfg()
{
& && & GPIO_InitTypeDef GPIO_InitS
& && &
& && & 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中。
<font color="#.把相应的IO口设置为中断线路由于GPIO并不是专用的中断引脚,因此在用GPIO来触发外部中断的时候需要设置将GPIO相应的引脚和中断线连接起来,具体代码如下:void EXTI_cfg()
{
& && & EXTI_InitTypeDef EXTI_InitS
& && & //清空中断标志
& && & 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_I //设置为中断请求,非事件请求
& && & EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_F //设置中断触发方式为上下降沿触发
& && & EXTI_InitStructure.EXTI_LineCmd = ENABLE;& && && && && && && && && &//外部中断使能
& && &EXTI_Init(&EXTI_InitStructure);
}复制代码
EXTI_cfg中需要调用到的函数都在stm32f10x_exti.c。
<font color="#.写中断响应函数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的响应函数都写在这个里面。
<font color="#.写主函数#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);& && && && &
}复制代码
main函数前是函数声明,main函数函数体中都是调用初始化配置函数,然后进入死循环,等待中断响应。
在线时间1 小时
主题帖子好友
初级会员, 积分 53, 距离下一级还需 147 积分
初级会员, 积分 53, 距离下一级还需 147 积分
支持一个,学习
blank0.png (123 Bytes, 下载次数: 0)
17:17 上传
在线时间893 小时
ST金币1342
主题帖子好友
赞,思路很清晰。
另贴代码的时候用专用的代码格式可能看起来更好!
在线时间201 小时
主题帖子好友
金牌会员, 积分 2796, 距离下一级还需 2204 积分
金牌会员, 积分 2796, 距离下一级还需 2204 积分
在线时间249 小时
ST金币2485
主题帖子好友
金牌会员, 积分 3682, 距离下一级还需 1318 积分
金牌会员, 积分 3682, 距离下一级还需 1318 积分
在线时间175 小时
ST金币1208
主题帖子好友
金牌会员, 积分 2686, 距离下一级还需 2314 积分
金牌会员, 积分 2686, 距离下一级还需 2314 积分
学习& && && && && && && && && && && &
在线时间148 小时
主题帖子好友
金牌会员, 积分 2200, 距离下一级还需 2800 积分
金牌会员, 积分 2200, 距离下一级还需 2800 积分
在线时间51 小时
主题帖子好友
中级会员, 积分 341, 距离下一级还需 159 积分
中级会员, 积分 341, 距离下一级还需 159 积分
在线时间17 小时
主题帖子好友
中级会员, 积分 258, 距离下一级还需 242 积分
中级会员, 积分 258, 距离下一级还需 242 积分
谢谢分享!
futu.png (129 Bytes, 下载次数: 0)
23:47 上传
在线时间36 小时
主题帖子好友
高级会员, 积分 615, 距离下一级还需 385 积分
高级会员, 积分 615, 距离下一级还需 385 积分
先顶再看,
站长推荐 /1
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered bySTM32-外部中断学习笔记 - CSDN博客
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[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&
//外部中断0服务程序
void EXTI0_IRQHandler(void)
delay_ms(10);//消抖
if(KEY2==1)
LED0=!LED0;
LED1=!LED1;
EXTI-&PR=1&&0;
//清除LINE0上的中断标志位
//外部中断15~10服务程序
void EXTI15_10_IRQHandler(void)
delay_ms(10);
if(KEY0==0)
LED0=!LED0;
}else if(KEY1==0)//按键1
LED1=!LED1;
EXTI-&PR=1&&13;
//清除LINE13上的中断标志位
EXTI-&PR=1&&15;
//清除LINE15上的中断标志位
//外部中断初始化程序
//初始化PA0,PA13,PA15为中断输入.
void EXTIX_Init(void)
RCC-&APB2ENR|=1&&2;
//使能PORTA时钟
JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD
GPIOA-&CRL&=0XFFFFFFF0;//PA0设置成输入
GPIOA-&CRL|=0X;
GPIOA-&CRH&=0X0F0FFFFF;//PA13,15设置成输入
GPIOA-&CRH|=0X;
GPIOA-&ODR|=1&&13;
//PA13上拉,PA0默认下拉
GPIOA-&ODR|=1&&15;
//PA15上拉
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);
//抢占2,子优先级2,组2
MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2
其中的两个函数:Ex_NVIC_Config(GPIO_A,0,RTIR);和MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);这两个函数都是在sys.c里定义,分别完成了步骤2、3、4.函数原型如下:
//外部中断配置函数
//只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个
//参数:GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
//该函数一次只能配置1个IO口,多个IO口,需多次调用
//该函数会自动开启对应中断,以及屏蔽线
//待测试...
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
u8 EXTADDR;
u8 EXTOFFSET;
EXTADDR=BITx/4;//得到中断寄存器组的编号
EXTOFFSET=(BITx%4)*4;
RCC-&APB2ENR|=0x01;//使能io复用时钟
AFIO-&EXTICR[EXTADDR]&=~(0x000F&&EXTOFFSET);//清除原来设置!!!
AFIO-&EXTICR[EXTADDR]|=GPIOx&&EXTOFFSET;//EXTI.BITx映射到GPIOx.BITx
//自动设置
EXTI-&IMR|=1&&BITx;//
开启line BITx上的中断
//EXTI-&EMR|=1&&BITx;//不屏蔽line BITx上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
if(TRIM&0x01)EXTI-&FTSR|=1&&BITx;//line BITx上事件下降沿触发
if(TRIM&0x02)EXTI-&RTSR|=1&&BITx;//line BITx上事件上升降沿触发
& & & & & & & &这个函数完成了两个步骤:
& & & & & & & &2、开启IO口复用时钟,设置IO口与中断线的映射关系
& & & & & & & &3、开启与该IO口相对的线上的中断/时间,设置触发条件
//设置NVIC
//NVIC_PreemptionPriority:抢占优先级
//NVIC_SubPriority
:响应优先级
//NVIC_Channel
//NVIC_Group
:中断分组 0~4
//注意优先级不能超过设定的组的范围!否则会有意想不到的错误
//组0:0位抢占优先级,4位响应优先级
//组1:1位抢占优先级,3位响应优先级
//组2:2位抢占优先级,2位响应优先级
//组3:3位抢占优先级,1位响应优先级
//组4:4位抢占优先级,0位响应优先级
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先
//CHECK OK
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
u8 IPRADDR=NVIC_Channel/4;
//每组只能存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//使能中断位(要清除的话,相反操作就OK)
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;
//使能io复用时钟
AFIO-&EXTICR[0]|=0X0020; //EXTI1映射到PC1(这句原子的程序里注释错了搞成了EXTI13)
EXTI-&IMR|=1&&1;
//开启line1上的中断
EXTI-&EMR|=1&&1;
//不屏蔽line1上的事件
EXTI-&FTSR|=1&&1;
//line1上事件下降沿触发 & & & & 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;,因为软件中断先于边沿中断处理。
本文已收录于以下专栏:
相关文章推荐
转自:/jeakon/archive//2816797.html
中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机...
STM32F1外部中断的使用
中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,...
1.GPIO 的正确设置GPIO_InitTypeDef GPIO_InitS
/* Enable GPIOD clock */
RCC_APB2PeriphClockCmd(RCC...
STM32的GPIO可以作为中断输入使用,这样增强了实时检测性,可以用于外部按键或是触控等使用。如果使用,其实也难,这里使用标准的固件库,因此,需要加入外部中断的库文件:stm32f10x_exti....
凡从事过ST MCU应用开发的人往往会遇到事件、中断事件 中断三个概念或术语。这三个概念彼此关联,有时会让人有点混淆或犯迷糊。
先拿一件生活中的事情打比方对上述三个概念做个基本的粗略理解,之后再分享...
中断学习之外部中断,多个外部中断的使用
中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加...
外部中断/事件控制器包括用于生成高达23个事件/中断的请求。每条中断线可独立配置选择类型(响应或挂起)和相应的触发事件(上升或下降或两者)。每一中断线可以独立屏蔽。...
这几天在用stm32读取FPGA中FIFO里的数据,遇到了不少的问题。其中有个自己觉得比较好玩的问题,就拿出来写写。其实这个问题也比较简单,开始我觉得没必要拿出来写,不过,想想后觉得还是写写吧,就当做...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)STM32外部中断详解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32外部中断详解
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 stm32f030 外部中断 的文章

 

随机推荐