stm32f103rct6 pdf最多能同时使用多少个外部中断

STM32中断嵌套及外部中断全程攻略
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
STM32中断嵌套及外部中断全程攻略
断断续续学习STM32一学期了,时间过的好快,现在对STM32F103系列单片机的中断嵌套及外部中断做一个总结,全当学习笔记。废话不多说,ARM公司的Cortex-m3 内核,支持256个中断,其中包含16个内核中断和240个外部中断,并且具有256级的可编程中断设置。在ST公司的STM32单片机中最多有84个中断,包括16个内核中断(这16个内部中断是任何半导体商也改不了的),和68个可屏蔽中断,具有16级可编程的中断优先级。但是在STM32F103系列中只有60个可屏蔽中断,(107系列有68个)。
针对这60个可屏蔽中断,重点掌握它的一个中断优先级寄存器组IPR,全称Interrupt Priority Registers。这个寄存器组包含15个32位的寄存器,一个可屏蔽中断占用8bit,那么一个寄存器可以控制4个可屏蔽中断,一共15*4=60。然而在这占用的8bit中又只使用了高4bit,这高4bit的分配才是STM32F103系列单片机中断嵌套的设置所在。STM32F103系列的中断嵌套分为5个组,分别是0、1、2、3、4&&这5个组,下面是5个组与中断嵌套的对应关系。
0位抢占优先级,4位响应优先级
1位抢占优先级,3位响应优先级
2位抢占优先级,2位响应优先级
3位抢占优先级,1位响应优先级
4位抢占优先级,0位响应优先级
对于抢占优先级和响应优先级,只需记住两点,第一、抢占任何优先级比都比所有响应优先级优先级高。只有抢占优先级更高的具有中断嵌套功能。(即打断其他正在执行的中断)。第二、数字越小优先级越高 ,抢占优先级和响应优先级都一样时,首先响应中断通道对应中断向量地址低的那个中断。
下面对0组和1组的情况做一个分析。
0组对应是0位抢占优先级,4位响应优先级,那么无抢占优先级,响应优先级可设置为0到15级(2的4次方种)中的任意一种。
1组对应是1位抢占优先级,3位响应优先级,那么抢占优先级只可设置为0级或者1级中的任意一种(2的1次方种),响应优先级可设置为0到7级(2的3次方种)中的任意一种。
上电复位时,中断配置为4组,并且60个外部中断都是抢占优先级为0级,无响应优先级。
所以可以看出判断两个中断的优先级时先看抢占优先级的高低,如果相同再看响应优先级的高低。如果全都相同最后看中断通道向量地址。
一般来说在使用过程中,一个系统使用一个组别就完全可以满足需要。所以在使用一个组别后一般不要在系统中再改动组别,骨灰级玩家可以去试试(小心芯片烧了)。
外部中断:
STM32F103的外部中断EXTI支持19个外部中断/事件请求。每个中断/事件都有独立的触发和屏蔽设置。
0到15线:对应外部I/O口输入中断
线16:接到PVD输出
线17:接到RCT闹钟事件
线18:接到USB唤醒事件
线16到线18我自己都没用过,主要对线0到15的I/O输入中断做一个总结,有个注意的地方是这0到15线的外部中断,其中0到4线,这5个外部中断都有自己单独的中断响应函数。5到9线公用一个中断服务函数,10到15线公用一个中断服务函数。
外部中断配置寄存器组EXTICR包含4个32位的寄存器,分别是EXTICR0、EXTICR1、EXTICR2、EXTICR3、但每一个寄存器只用了低16位,每4位控制一个I/O口,一个寄存器控制4个I/O口,EXTICR寄存器组控制16个I/O口,刚好一个GPIO的I/O口数。下面以 EXTICR0为例,用一个表格表示:
0000& & GPIOA
0000& & GPIOA
0000& & GPIOA
0000& & GPIOA
0001& & GPIOB
0001& & GPIOB
0001& & GPIOB
0001& & GPIOB
0010& & GPIOC
0010& & GPIOC
0010& & GPIOC
0010& & GPIOC
0011& & GPIOD
0011& & GPIOD
0011& & GPIOD
0011& & GPIOD
0100& & GPIOE
0100& & GPIOE
0100& & GPIOE
0100& & GPIOE
0101& & GPIOF
0101& & GPIOF
0101& & GPIOF
0101& & GPIOF
0110& & GPIOG
0110& & GPIOG
0110& & GPIOG
0110& & GPIOG
比如配置GPIOA.0就是将EXTICR0的低4位配置成0000,若配置GPIOB.1就是配置EXTICR0的4到7位,为0001。
这里有一个问题,如果要配置GPIOA.0和GPIOB.0,会引起冲突,不知道是不是分时配置解决的。我用的固体库的方式,不需要考虑这些,呵呵。注意使用固件库时中断复位函数是写在stm32f10x_it.c这个文件里的。
下面结合外部中断附上固件库版本的程序:
主函数里:
void NVIC_Configuration(void)
NVIC_InitTypeDef NVIC_InitS
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);& && && & //设置为优先级组2
NVIC_InitSructure.NVIC_IRQChannel = EXTI15_10_IRQn;& && & //定义外部中断线13中断通道
NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority = 0;& && &&&//抢占优先级0
NVIC_InitSructure.NVIC_IRQChannelSubPriority = 0;& && && && && && && &&&//响应优先级0
NVIC_InitSructure.NVIC_IRQChannelCmd = ENABLE;& && && && && && && && && && & //使能指定通道
NVIC_Init(&NVIC_InitSructure);& && && && && && && && && && && && && && && && && && && && && && && &
NVIC_InitSructure.NVIC_IRQChannel = EXTI15_10_IRQn;& && &&&//定义外部中断线15中断通道
NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelCmd = ENABLE;& && && && && && && && && && & //使能指定通道
NVIC_Init(&NVIC_InitSructure);
NVIC_InitSructure.NVIC_IRQChannel = EXTI0_IRQn;& && &&&//定义外部中断线0中断通道
NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelCmd = ENABLE;& && && && && && && && && && & //使能指定通道
NVIC_Init(&NVIC_InitSructure);
void EXTI_Configuration(void)
&&EXTI_InitTypeDef EXTI_InitS& && && && && && && && && && && && && && && && && & //初始化结构
&&GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource13);&&//指明当前哪个引脚为外部中断触发引脚
&&GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);
&&EXTI_ClearITPendingBit(EXTI_Line13);& && && && && && && && && && && && &&&//清除中断标志位 EXTI_Line13对应相应的中断线13
&&EXTI_ClearITPendingBit(EXTI_Line15);
&&EXTI_InitStructure.EXTI_Mode =EXTI_Mode_I& && && && && && && && && & //选择中断模式请求
&&EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_F& && && && && && &&&//下降沿触发
&&EXTI_InitStructure.EXTI_Line = EXTI_Line13|EXTI_Line15;&&// 选择待使能的外部中断线
&&EXTI_InitStructure.EXTI_LineCmd = ENABLE;& && && && && && && && && && && && && && && && && && &&&// 定义选中线的新状态&&使能
&&EXTI_Init(&EXTI_InitStructure);& && && && && && && &//把EXIT_InitStructure中的每一个参数按缺省值填入
&&GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);& &&&//指明当前哪个引脚为外部中断触发引脚
&&EXTI_ClearITPendingBit(EXTI_Line0);&&
&&EXTI_InitStructure.EXTI_Mode =EXTI_Mode_I& && && && && && && && && & //选择中断模式请求
&&EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_R& && && && && && &&&//上升沿触发
&&EXTI_InitStructure.EXTI_Line = EXTI_Line0;& && && && &// 选择待使能的外部中断线
&&EXTI_InitStructure.EXTI_LineCmd = ENABLE;& && && && && && && && && && && && && && && && && && &&&// 定义选中线的新状态&&使能
&&EXTI_Init(&EXTI_InitStructure);& && && && && && && &//把EXIT_InitStructure中的每一个参数按缺省值填入
stm32f10x_it.c这个文件里
void EXTI15_10_IRQHandler(void)
& && && && &&&if(EXTI_GetITStatus(EXTI_Line13)!=RESET)
& && &&&{& && && && && &GPIO_WriteBit( GPIOA,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8))); //LED0翻转
& && && && && && && & EXTI_ClearITPendingBit(EXTI_Line13);
& && && && & if(EXTI_GetITStatus(EXTI_Line15)!=RESET)
& && &&&{& && && && && &GPIO_WriteBit( GPIOD,GPIO_Pin_2,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2))); //LED0翻转
& && && && && & EXTI_ClearITPendingBit(EXTI_Line15);&&
void EXTI0_IRQHandler(void)
& && && & if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
{ GPIO_WriteBit( GPIOA,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8))); //LED0翻转
& & GPIO_WriteBit( GPIOD,GPIO_Pin_2,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2))); //LED0翻转
&&EXTI_ClearITPendingBit(EXTI_Line0);& &
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights Reserved查看: 1747|回复: 6
最近用到stm32的外部中断的时候,又碰到了一个奇怪的问题,百思不得其解,求大神指导
主题帖子精华
中级会员, 积分 321, 距离下一级还需 179 积分
在线时间6 小时
& & & &最近,使用stm32的外部中断,EXTI15_10_IRQHandler死活不受控制,便又折腾了半天发现了一个奇怪的事,我试过了EXTI0_IRQHandler、EXTI2_IRQHandler、EXTI3_IRQHandler,外部中断都没有问题,可是EXTI0_IRQHandler,我没有给信号也不停的往中断跑,代码如下:
void EXTIx_Init(void)
EXTI_InitTypeDef EXTI_InitS
NVIC_InitTypeDef NVIC_InitS
GPIO_InitTypeDef GPIO_InitS
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); &//使能PA端口时钟 复用功能
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //选中管脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_3|GPIO_Pin_14; //选中管脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
&//上拉输RU
GPIO_Init(GPIOA,&GPIO_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//选择中断分组2
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
&//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&//中断优先级初始化
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
&//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&//中断优先级初始化
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
&//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&//中断优先级初始化
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
&//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&//中断优先级初始化
NVIC_Init(&NVIC_InitStructure);
//GPIO 中断线以及中断初始化配置,下降沿触发
EXTI_ClearITPendingBit(EXTI_Line0);
EXTI_ClearITPendingBit(EXTI_Line2);
EXTI_ClearITPendingBit(EXTI_Line3);
EXTI_ClearITPendingBit(EXTI_Line14);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);//GPIOa2
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource3);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource14);
EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line2|EXTI_Line3|EXTI_Line14;//|EXTI_Line15; &//中短线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_I
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_F
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
void EXTI2_IRQHandler(void)
if(EXTI_GetITStatus(EXTI_Line2) !=RESET)
TIMxCHx_PinLv_Count++;
EXTI_ClearITPendingBit(EXTI_Line2); & //清除line2上的中断标志
void EXTI0_IRQHandler(void)
if(EXTI_GetITStatus(EXTI_Line0) !=RESET)
TIMxCHx_PinLv_Count++;
EXTI_ClearITPendingBit(EXTI_Line0); & //清除line2上的中断标志
void EXTI3_IRQHandler(void)
if(EXTI_GetITStatus(EXTI_Line3) !=RESET)
TIMxCHx_PinLv_Count++;
EXTI_ClearITPendingBit(EXTI_Line3); & //清除line2上的中断标志
void EXTI15_10_IRQHandler(void)
if(EXTI_GetITStatus(EXTI_Line13) !=RESET)
TIMxCHx_PinLv_Count++;
EXTI_ClearITPendingBit(EXTI_Line13);
if(EXTI_GetITStatus(EXTI_Line14) !=RESET)
TIMxCHx_PinLv_Count++;
EXTI_ClearITPendingBit(EXTI_Line14);
if(EXTI_GetITStatus(EXTI_Line15) !=RESET)
TIMxCHx_PinLv_Count++;
EXTI_ClearITPendingBit(EXTI_Line15);
EXTI0_IRQHandler、EXTI2_IRQHandler、EXTI3_IRQHandler这三个已经实测,都没有问题,可是EXTI15_10_IRQHandler不受控制,一样的初始化代码,实在是搞不明白了,求大神们指点啊
/programs/view/h5G_H9Kpk04/?bid=03&pid=1&resourceId=_05_01
主题帖子精华
在线时间579 小时
PA14&&用做了下载接口&&&&关闭JTAG&和SW才能做IO口用&&&你可以试试PB14
主题帖子精华
金钱116568
在线时间884 小时
所有中断我都用过,没发现你说的问题。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
中级会员, 积分 321, 距离下一级还需 179 积分
在线时间6 小时
回复【3楼】正点原子:
---------------------------------
你也是用的库函数么,难道是我的芯片坏了,不过哪几个io输出高低电平受控制
/programs/view/h5G_H9Kpk04/?bid=03&pid=1&resourceId=_05_01
主题帖子精华
金钱116568
在线时间884 小时
回复【4楼】华夏小川:
---------------------------------
我用寄存器的。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
高级会员, 积分 606, 距离下一级还需 394 积分
在线时间46 小时
回复【5楼】正点原子:
---------------------------------
原子老大::昨天下单买了&F103RCT6&的开发板,,
就是&相中&你的&“寄存器版本”。。(重庆)。。
说起:ST的库,就老火,,无法&完全&脱离硬件。
还不如:跟着&原子老大&学习&寄存器编程。小开发足够。
主题帖子精华
金钱116568
在线时间884 小时
回复【6楼】caosix:
---------------------------------
谢谢支持
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
Powered by查看: 5395|回复: 13
stm32f103rct6最多能同时使用多少个外部中断?
主题帖子精华
初级会员, 积分 153, 距离下一级还需 47 积分
在线时间23 小时
在同一个板子上,stm32f103rct6最多可以连接使用多少个外部中断?EXTI0~4有独立的中断服务函数、EXTI5~9共用一个、EXTI10~14共用一个,那么怎么样使用尽可能多的外部中断,而且不会出现几个外部中断占用一个中断函数的情况呢?
7个,也就是0~4,5_9,10_15。
共7个中断服务函数。所以最多同时7个。
主题帖子精华
金钱116568
在线时间884 小时
7个,也就是0~4,5_9,10_15。
共7个中断服务函数。所以最多同时7个。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
在线时间849 小时
即使公用一个中断函数,也可以区分开。没什么可怕的。
主题帖子精华
初级会员, 积分 153, 距离下一级还需 47 积分
在线时间23 小时
回复【2楼】xuande:
---------------------------------
请问怎么区分?谢谢
主题帖子精华
金牌会员, 积分 1982, 距离下一级还需 1018 积分
在线时间320 小时
具体情况具体分析啊,中断函数里面有标志位可以区分开是哪条线发生中断的
思想很重要,无论做人还是编程!
主题帖子精华
在线时间849 小时
如果占用同一个中断,那就查几个端口的输入电平,IDR&寄存器。
主题帖子精华
初级会员, 积分 153, 距离下一级还需 47 积分
在线时间23 小时
回复【2楼】xuande:
---------------------------------
今天做了这样的实验&将PC6&nbspC7&nbspC8都连接一个按键作为外部中断输入端,结果出现这样的情况:按三个中的任意一个按键,都会进中断,但是进中断函数后&&无法判断是哪个触发了中断,有时按PC6按键&结果程序跳进了if(EXTI_GetITStatus(EXTI_Line7)&!=&RESET)这里&或者if(EXTI_GetITStatus(EXTI_Line8)&!=&RESET)&&&请问这是什么问题?我的程序是不是哪里错了?&&请有经验的大指点一下&&&谢谢
&&&&GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,&GPIO_PinSource6);
&&&&GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,&GPIO_PinSource7);
&&&&GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,&GPIO_PinSource8);
&& EXTI_InitStructure.EXTI_Line=EXTI_Line6|EXTI_Line7|EXTI_Line8;
&& EXTI_InitStructure.EXTI_Mode&=&EXTI_Mode_I
&& EXTI_InitStructure.EXTI_Trigger&=&EXTI_Trigger_F//下降沿触发
&& EXTI_InitStructure.EXTI_LineCmd&=&ENABLE;
&& EXTI_Init(&EXTI_InitStructure); & //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel&=&EXTI9_5_IRQn;
//使能按键所在的外部中断通道
&& NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority&=&0x02; //抢占优先级2,&
&& NVIC_InitStructure.NVIC_IRQChannelSubPriority&=&0x01;
//子优先级1
&& NVIC_InitStructure.NVIC_IRQChannelCmd&=&ENABLE;
//使能外部中断通道
&& NVIC_Init(&NVIC_InitStructure);&
&void&EXTI9_5_IRQHandler(void)
{
/*
delay_ms(10);&&&//消抖
if(KEY0==0) {
LED0=!LED0;
}
& &EXTI_ClearITPendingBit(EXTI_Line5);&&&&//清除LINE5上的中断标志位&&
*/
&&if(EXTI_GetITStatus(EXTI_Line6)&!=&RESET)
&&{
&&
&EXTI_ClearFlag(EXTI_Line6);
&&&&&EXTI_ClearITPendingBit(EXTI_Line6);
&&}
&&if(EXTI_GetITStatus(EXTI_Line7)&!=&RESET)
&&{
&&
&&&&EXTI_ClearFlag(EXTI_Line7);
&&&&EXTI_ClearITPendingBit(EXTI_Line7);
&&}
&&if(EXTI_GetITStatus(EXTI_Line8)&!=&RESET)
&&{
&&
EXTI_ClearFlag(EXTI_Line8);
&&&&EXTI_ClearITPendingBit(EXTI_Line8);
主题帖子精华
在线时间849 小时
难道是几个按键联动了?查一下。
另外,只留一个按钮的判断,其他&if&都屏蔽,试试。
主题帖子精华
初级会员, 积分 153, 距离下一级还需 47 积分
在线时间23 小时
回复【7楼】xuande:
---------------------------------
按键没有联动
只留一个按钮判断&&其它if都屏蔽&&&也是这情况&&&比如我屏蔽了if(EXTI_GetITStatus(EXTI_Line7)&!=&RESET)&和if(EXTI_GetITStatus(EXTI_Line8)&!=&RESET)&&&留任何一个按键&按下后都触发了中断&&并且进入if(EXTI_GetITStatus(EXTI_Line6)&!=&RESET)
主题帖子精华
初级会员, 积分 92, 距离下一级还需 108 积分
在线时间0 小时
楼主问题是否解决?
平凡的有点不正常
主题帖子精华
新手上路, 积分 7, 距离下一级还需 43 积分
在线时间0 小时
回复【7楼】xuande:
---------------------------------
按键没有联动
只留一个按钮判断&&其它if ...
楼主问题解决了吗?我也碰到了,能否分享一下
主题帖子精华
中级会员, 积分 213, 距离下一级还需 287 积分
在线时间42 小时
我也遇到了,照理说分别判断中断标志,不应该1个中断触发所有中断服务函数
有朋友能解决吗
主题帖子精华
新手上路, 积分 7, 距离下一级还需 43 积分
在线时间0 小时
我的stm32f103rct6只有GPIOA的外部下降沿中断可用,GPIOC的下降沿捕获不到怎么回事呢
主题帖子精华
初级会员, 积分 158, 距离下一级还需 42 积分
在线时间7 小时
STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。
希望与更多的电子爱好者交朋友
Powered by21ic官方微信-->
后使用快捷导航没有帐号?
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
请完成以下验证码
查看: 3237|回复: 42
stm32外部中断超强干扰
&&未结帖(10)
主题帖子积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
出来工作后一直在做硬件兼软件工程师,虽然技术不怎么行但是一直坚持着不断学习的态度技术也逐步提高,鉴于市场需要公司需开发一款具有彩屏LCD并且多串口通信的产品,首先想到stm32,虽然自己没用过,但是毕业后看到网上一大堆人就对stm32夸上天了,想必肯定是个性价比高的东西,适合开发。
& & & & 说干就干,边查资料边设计,最终板子出来了,还算是满意,虽然很多线错了,二话不说拿起烙铁和刀片重新接起来,于是乎产品的各个功能都逐步测试完成,FSMC彩屏,120个LED灯,6个硅胶按键,IIC的存储器和RTC时钟,SPI的ADC和U盘存储,各种232和485和继电器都测试完毕,最后把CAN通信也测试完了,只剩下外部按键中断,这个简单的东西本不想再去测试等到完成后完善一下程序就OK了。这是个懒人毛病,作为下定决心做一款国内最出色的产品绝不能这么马虎,于是又细心地去测试。
& & & & 我使用的是stm32f103vet6,开启了PC0,PC1,PC2,PC3的外部中断,有按键按下就能引起这四个脚的中断。我发现三脚手指随便碰一下他就有反应,怎么回事?把0,1,2的中断都关闭,只剩下3的,还是一样,随便碰一下就会有中断。然后接上拉,不行!然后把按键去掉,只剩下一根PC3引脚的导线,用镊子碰一下电源地,还有中断,让他显示中断次数,发现用镊子碰一下地都能引起几十次的中断!碰一下中断脚旁边的引脚也是几十次的中断!OMG!这个中断的抗干扰也太他娘的垃圾了吧?先不怀疑别人,自己多试试,拿到网上购买的开发板,什么“七星虫”,“科技老顽童”,“野火IOS”,无一例外都是这样,开启某一个脚的外部中断接上拉,只要用镊子碰一下他旁边的引脚就会引起无数个中断。第二天叫同事拿去测试,同事说没问题呀!喜出望外。我也拿去测试,确实没问题,后来发现原来没接上拉电阻,把2K的上拉电阻街上去后在测试,于是又重现昨日的现象。怀疑电源问题,开发板的都是5V用ASMV的,我自己的9V用lmV。开发板换了不同的各种5V电源还是一样凡是接了上拉就会有干扰。
& & & & 这个问题~~~百度下发现只有少数的人反应这个问题,难道这么明显的只有少数人测试出来吗?各种纠结中?翻*墙出去看看,发现就中国人很多使用ST公司的芯片,老外很少使用。当初谁把stm的牛逼给吹上去的?
& & & & 现在只能硬着头皮应付中断的问题,尝试换下GD32f103vet6的国产芯片。期待着测试结果
主题帖子积分
高级技术员, 积分 951, 距离下一级还需 49 积分
高级技术员, 积分 951, 距离下一级还需 49 积分
主题帖子积分
专家等级:结帖率:100%打赏:8.88受赏:31.38
主题帖子积分
高级技术员, 积分 951, 距离下一级还需 49 积分
高级技术员, 积分 951, 距离下一级还需 49 积分
楼主你进入外部中断后应该清除中断标志位呀。在没有找到故障原因时断然评价ST好像有点委屈人家了。
EXTI_ClearITPendingBit(EXTI_LineX);
主题帖子积分
资深工程师, 积分 15381, 距离下一级还需 4619 积分
资深工程师, 积分 15381, 距离下一级还需 4619 积分
主题帖子积分
专家等级:结帖率:89%打赏:0.00受赏:40.00
主题帖子积分
资深工程师, 积分 15381, 距离下一级还需 4619 积分
资深工程师, 积分 15381, 距离下一级还需 4619 积分
按键是低有效,还是高有效?
有事请找 xuander
主题帖子积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:43.00
主题帖子积分
这样碰一下进入中断也正常;
你有看过老外的IO电路怎么处理的吗?
做的好,加光耦隔离,加ESD保护,加滤波,加施密特触发器
欢迎进入21IC ST、机器人等版块
电子工程师群(北京):
电子工程师群(深圳):
电子工程师群1:1897584;
物联网群:;智能机器人群:; AGV及立体仓库群:;
主题帖子积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:43.00
主题帖子积分
老外使用的也不少吧;
欢迎进入21IC ST、机器人等版块
电子工程师群(北京):
电子工程师群(深圳):
电子工程师群1:1897584;
物联网群:;智能机器人群:; AGV及立体仓库群:;
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
stm32比gd32要稳定吧,你的强干扰是不是程序写的有问题
主题帖子积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
楼主你进入外部中断后应该清除中断标志位呀。在没有找到故障原因时断然评价ST好像有点委屈人家了。
EXTI_Cl ...
void EXTI3_IRQHandler(void)
& & & & if(EXTI_GetITStatus(EXTI_Line3) != RESET) //确保是否产生了EXTI Line中断
& & & & & & & & EXTI_ClearITPendingBit(EXTI_Line3);& &&&//清除中断标志位
& & & & }&&interrupt_count++;
有清除呀!我确实找不到原因,我说的这个现象你也可以试下,希望大家一起找原因。
主题帖子积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
这样碰一下进入中断也正常;
你有看过老外的IO电路怎么处理的吗?
做的好,加光耦隔离,加ESD保护,加滤波 ...
我现在已经没有加入按键,当初我也是怀疑按键的干扰,后来拆除按键还是有干扰。我在测试的是单一个引脚开了中断,加了上拉电阻,用手拿着镊子或者直尺去触碰他旁边的引脚会引起他自己的中断。我也怀疑我的板子有问题,换了其他几家的板子做一样的实验也是有一样的问题。
主题帖子积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
按键是低有效,还是高有效?
开启的中断是下降沿中断,加了上拉电阻。现在没有接按键,只是测试单独引脚的干扰。
主题帖子积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
stm32比gd32要稳定吧,你的强干扰是不是程序写的有问题
void NVIC_Configuration(void)
&&NVIC_InitTypeDef NVIC_InitS
&&/* Configure one bit for preemption priority */
&&NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
&&/* 配置中断源 */
&&NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&&NVIC_Init(&NVIC_InitStructure);
&&* &&配置 PC3 为线中断口,并设置中断优先级
&&* @param&&无
&&* @retval 无
void EXTI_PC3_Config(void)
& & & & GPIO_InitTypeDef GPIO_InitS
& & & & EXTI_InitTypeDef EXTI_InitS
& & & & /* config the extiline clock and AFIO clock */
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE);
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & /* config the NVIC */
& & & & NVIC_Configuration();
& & & & /* EXTI line gpio config*/& & & &
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;& && &
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;& & & &&&// 上拉输入
&&GPIO_Init(GPIOC, &GPIO_InitStructure);
& & & & /* EXTI line mode config */
&&GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3);
&&EXTI_InitStructure.EXTI_Line = EXTI_Line3;
&&EXTI_InitStructure.EXTI_Mode = EXTI_Mode_I
&&EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_F //下降沿中断
&&EXTI_InitStructure.EXTI_LineCmd = ENABLE;
&&EXTI_Init(&EXTI_InitStructure);
int main(void)
& & & & USART_Config();
& & & & /* exti line config */
& & & & EXTI_PC3_Config();
& & & & /* wait interrupt */
& & & & while(1)& && && && && && && && && &
& & & & & & & & printf(&interrupt_count: %d &,interrupt_count);
& & & & & & & & delay_ms(1000);
int interrupt_
void EXTI3_IRQHandler(void)
& & & & if(EXTI_GetITStatus(EXTI_Line3) != RESET) //确保是否产生了EXTI Line中断
& & & & & & & & EXTI_ClearITPendingBit(EXTI_Line3);& &&&//清除中断标志位
& & & & }interrupt_count++;&&
这是我的简单测试程序,没有接按键,只是加了上拉电阻,用手拿着镊子触碰一下旁边的引脚,就会几十次的进入中断。
软件要消抖呀。&
主题帖子积分
资深工程师, 积分 15381, 距离下一级还需 4619 积分
资深工程师, 积分 15381, 距离下一级还需 4619 积分
主题帖子积分
专家等级:结帖率:89%打赏:0.00受赏:40.00
主题帖子积分
资深工程师, 积分 15381, 距离下一级还需 4619 积分
资深工程师, 积分 15381, 距离下一级还需 4619 积分
没有这样测过,
但也属于正常。
1、毕竟不是经常用手碰。
2、按键必须加消抖动处理。
有事请找 xuander
主题帖子积分
高级工程师, 积分 7597, 距离下一级还需 403 积分
高级工程师, 积分 7597, 距离下一级还需 403 积分
主题帖子积分
专家等级:结帖率:56%打赏:0.00受赏:15.00
主题帖子积分
高级工程师, 积分 7597, 距离下一级还需 403 积分
高级工程师, 积分 7597, 距离下一级还需 403 积分
楼主设计开发板?搞那么多功能
本人熟悉STM32、PIC、AVR等嵌入式软件开发;联系方式:.
主题帖子积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
没有这样测过,
但也属于正常。
这个产品是工业现场使用的,用手触碰出现那么多干扰,那使用现场有伺服电机和各种大功率电器会不会造成更大的干扰呢?之前是使用光耦隔离加RC滤波的出现无数次进入中断,现在使用按键芯片代替了。我用示波器测试过,引脚上没有任何跳动,stm能把最小的尖峰毛刺捕抓到当作中断进入。另请教下stm产品要加强抗干扰有什么建议?
主题帖子积分
资深工程师, 积分 15381, 距离下一级还需 4619 积分
资深工程师, 积分 15381, 距离下一级还需 4619 积分
主题帖子积分
专家等级:结帖率:89%打赏:0.00受赏:40.00
主题帖子积分
资深工程师, 积分 15381, 距离下一级还需 4619 积分
资深工程师, 积分 15381, 距离下一级还需 4619 积分
感觉:手引起的干扰会比现场强,建议放现场试,用手没意义。
抗干扰是个综合治理的问题,很难说出来。
道理上,干扰源、干扰路径、受干扰一方,堵住一个就行,多个更好。
有时候这个方法有用,有时候又无效。
总之:遇到了只能反复折腾,解决为止。
不是我故弄玄虚,真实体会。
有事请找 xuander
主题帖子积分
主题帖子积分
专家等级:结帖率:46%打赏:135.80受赏:168.50
主题帖子积分
楼主乃神人,测试方法我是非常赞成的.反正我这么多年我都不会,向搂主学习
←← +→→←←
主题帖子积分
资深技术员, 积分 327, 距离下一级还需 173 积分
资深技术员, 积分 327, 距离下一级还需 173 积分
主题帖子积分
专家等级:结帖率:80%
主题帖子积分
资深技术员, 积分 327, 距离下一级还需 173 积分
资深技术员, 积分 327, 距离下一级还需 173 积分
在中断里面加消抖动吧,这个不能说明ST的中断就有问题,只能是太灵敏了
主题帖子积分
资深工程师, 积分 18379, 距离下一级还需 1621 积分
资深工程师, 积分 18379, 距离下一级还需 1621 积分
主题帖子积分
专家等级:结帖率:70%打赏:0.00受赏:51.68
主题帖子积分
资深工程师, 积分 18379, 距离下一级还需 1621 积分
资深工程师, 积分 18379, 距离下一级还需 1621 积分
我现在已经没有加入按键,当初我也是怀疑按键的干扰,后来拆除按键还是有干扰。我在测试的是单一个引脚开 ...
没有上拉,或浮置的原因,
主题帖子积分
资深工程师, 积分 18379, 距离下一级还需 1621 积分
资深工程师, 积分 18379, 距离下一级还需 1621 积分
主题帖子积分
专家等级:结帖率:70%打赏:0.00受赏:51.68
主题帖子积分
资深工程师, 积分 18379, 距离下一级还需 1621 积分
资深工程师, 积分 18379, 距离下一级还需 1621 积分
消抖是必需的,手接触跟按键按下,有好多暂态过程反复。
主题帖子积分
初级工程师, 积分 2198, 距离下一级还需 802 积分
初级工程师, 积分 2198, 距离下一级还需 802 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2198, 距离下一级还需 802 积分
初级工程师, 积分 2198, 距离下一级还需 802 积分
按键我不喜欢中断。那又不是个什么紧急事件。搞那么复杂干什么。
我习惯于在系统的TICK的最后写一个函数把按键全检查一遍。10ms一次吧。连续N次检测到认为是有按键按下。连去抖等待都省了。
一个U16就搞定了,最高位做标志,剩下的计数&
缺点是每个热键得有一个计数器。&
主题帖子积分
初级技术员, 积分 1039, 距离下一级还需 -939 积分
初级技术员, 积分 1039, 距离下一级还需 -939 积分
主题帖子积分
专家等级:结帖率:92%
主题帖子积分
初级技术员, 积分 1039, 距离下一级还需 -939 积分
初级技术员, 积分 1039, 距离下一级还需 -939 积分
楼上方法和我的一样啊,我要抢先申请个专利
技术新星奖章
人才类勋章
时间类勋章
技术高手奖章
人才类勋章
晶莹之水滴
发帖类勋章
技术领袖奖章
人才类勋章
时间类勋章
坚毅之洋流
发帖类勋章
荣誉元老奖章
等级类勋章
技术导师奖章
人才类勋章
时间类勋章
沉静之湖泊
发帖类勋章
突出贡献奖章
等级类勋章
技术奇才奖章
人才类勋章
精华达人奖章
等级类勋章
甘甜之泉水
发帖类勋章
时间类勋章
希望之星奖章
等级类勋章}

我要回帖

更多关于 stm32f103rct6原理图 的文章

更多推荐

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

点击添加站长微信