网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月12日漏签0天
单片机吧 关注:212,067贴子:1,047,465
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 6回复贴,共1页
<<返回单片机吧
>0< 加载中...

stm32设置两个按键外部中断,只有一个有效

  • 只看楼主
  • 收藏

  • 回复
  • 汉语神J无奈
  • 下士
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
把两个按键设置中断,分别是Line2和Line4,现在只有Line2有效,把Line2删了,Line4也会有效,但怎么才能让两个都有效呢?是哪里设置错了,还是内部冲突了?
下面是程序:
main()函数已设置:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
#include "exti.h"
void exti_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin=k_left;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
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_PortSourceGPIOE, GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
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_PortSourceGPIOE, GPIO_PinSource4);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
下面是中断入口函数:
void EXTI2_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line2)==SET)
{
EXTI_ClearITPendingBit(EXTI_Line2);
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET)
{
key=0.1;
}
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
}
}
void EXTI4_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line4)==SET)
{
EXTI_ClearITPendingBit(EXTI_Line4);
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET)
{
key=0.2;
}
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
}
}


  • 风筝飞越夜阳
  • 新兵
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
同样的问题。请问有新发现么?


2025-08-12 14:18:58
广告
不感兴趣
开通SVIP免广告
  • 勤奋的梦游中
  • 新兵
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
同求


  • 我晕掉了
  • 列兵
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
同求


  • 南有乔木Lsy
  • 新兵
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
同求


  • 阿拉摆
  • 下士
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你这个代码问题很大啊!
1.你没有进行中断分组。即使用NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x)//x可为0,1,2,3,4;
2.你既然是使用串口输入模式,就不要增加GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;语句,这个是输出速度。
3.最关键的一点,也是你问题的关键:你既然在外部中断中使用了EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling上升沿中断,那你的GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;这句话还使用串口上拉输入?相当于你的串口已经是1了,你还能让他变1?应该使用GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;串口下拉输入,这样串口一直是0,你输入个上升沿进入外部中断。
也许可以认为你在松手的一瞬间会有一个0变成1的过程进入外部中断,但是你的while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);这个语句,也就是说当你松开按键时会进入中断,相当于进入中断后,串口就没有输入了,应该是浮空状态(检查一下你的电路),这时候你来一句while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);就把代码卡在这儿了,因为你的GPIOE_Pin_2没有输入。
这也就是整个运行只进入外部中断2,因为在外部中断2中卡在了while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0),而删除中断2后,可以进入中断4的原因了。
描述的可能不清楚,谢谢!


  • 阿拉摆
  • 下士
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
将GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU都改成GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD,如果电路没问题的话,按下按键后,串口被3.3V拉高的话,程序应该就没问题了。
删除while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)也可以,但是偏离你的本意的,你现在进入串口的原因是松开按键,而本意应该是按下按键进入中断。所以还是使用上面的更改方法。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 6回复贴,共1页
<<返回单片机吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示