OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2998|回复: 7

新手请教这么程序哪里出现问题?写的按键0外部中断程序,执行后中断服务程序不能实现!哪里出现问题了呀?

[复制链接]

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
发表于 2017-3-22 12:59:33 | 显示全部楼层 |阅读模式
3金钱
#include "stm32f10x.h"
#include "delay.h"

//#define KEY0  PEin(4)
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define LEDO PBout(5)
#define LED1 PEout(5)

int main(void)
{
        EXTI_InitTypeDef EXTI_Initstrue;
        NVIC_InitTypeDef NVIC_Initstrue;
        GPIO_InitTypeDef GPIO_Initstruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB,ENABLE);//使能PE PB时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//配置外部EXTI4时钟
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);//映射GPIO->外部中断
       
        GPIO_Initstruct.GPIO_Pin=GPIO_Pin_4;
        GPIO_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Initstruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_Init(GPIOE,&GPIO_Initstruct);//配置KEY0(PE.4)上拉输入
        GPIO_SetBits(GPIOE,GPIO_Pin_4);
       
        GPIO_Initstruct.GPIO_Pin=GPIO_Pin_5;
        GPIO_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Initstruct.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE,&GPIO_Initstruct);//配置LED1(PE.5)推挽输出
        GPIO_Init(GPIOB,&GPIO_Initstruct);//配置LED0(PB.5)推挽输出
        GPIO_SetBits(GPIOB,GPIO_Pin_5);
        GPIO_SetBits(GPIOE,GPIO_Pin_5);

        EXTI_Initstrue.EXTI_Line=EXTI_Line4;
        EXTI_Initstrue.EXTI_LineCmd=ENABLE;
        EXTI_Initstrue.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_Initstrue.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_Init(&EXTI_Initstrue);                                                        //外部中断初始化

        NVIC_Initstrue.NVIC_IRQChannel=EXTI4_IRQn;
        NVIC_Initstrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Initstrue.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_Initstrue.NVIC_IRQChannelSubPriority=2;
        NVIC_Init(&NVIC_Initstrue);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                //中断优先级分组
       
        while(1)
        {
                LEDO=0;
                LED1=0;
        }
}

void EXTI4_IRQHandler()
{
        delay_ms(10);
        if(KEY0==0)
        {
                LEDO=0;  //点亮LED0;
                LED1=1;
        }
        EXTI_ClearITPendingBit(EXTI_Line4);
}


最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
509
金钱
509
注册时间
2016-11-16
在线时间
111 小时
发表于 2017-3-22 12:59:34 | 显示全部楼层
回复

使用道具 举报

2

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
509
金钱
509
注册时间
2016-11-16
在线时间
111 小时
发表于 2017-3-22 13:19:25 | 显示全部楼层
LEDO=0;
LED1=0;
在大循环里啊?

中断出来后不久瞬间置0了吗?
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
 楼主| 发表于 2017-3-22 13:48:58 | 显示全部楼层
wenzh3333 发表于 2017-3-22 13:19
LEDO=0;
LED1=0;
在大循环里啊?

如何修改呢
回复

使用道具 举报

2

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
509
金钱
509
注册时间
2016-11-16
在线时间
111 小时
发表于 2017-3-22 13:56:20 | 显示全部楼层
主函数的LEDO=0;
              LED1=0;
放while  的前面。。。  中断里判断再调整状态
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
 楼主| 发表于 2017-3-22 13:59:12 | 显示全部楼层
#include "stm32f10x.h"
#include "delay.h"

//#define KEY0  PEin(4)
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define LEDO PBout(5)
#define LED1 PEout(5)

int main(void)
{
        EXTI_InitTypeDef EXTI_Initstrue;
        NVIC_InitTypeDef NVIC_Initstrue;
        GPIO_InitTypeDef GPIO_Initstruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB,ENABLE);//使能PE PB时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//配置外部EXTI4时钟
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);//映射GPIO->外部中断
       
        GPIO_Initstruct.GPIO_Pin=GPIO_Pin_3;
        GPIO_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Initstruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_Init(GPIOE,&GPIO_Initstruct);//配置KEY0(PE.4)上拉输入
        GPIO_SetBits(GPIOE,GPIO_Pin_3);
       
        GPIO_Initstruct.GPIO_Pin=GPIO_Pin_5;
        GPIO_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Initstruct.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE,&GPIO_Initstruct);//配置LED1(PE.5)推挽输出
        GPIO_Init(GPIOB,&GPIO_Initstruct);//配置LED0(PB.5)推挽输出
        GPIO_SetBits(GPIOB,GPIO_Pin_5);
        GPIO_SetBits(GPIOE,GPIO_Pin_5);

        EXTI_Initstrue.EXTI_Line=EXTI_Line3;
        EXTI_Initstrue.EXTI_LineCmd=ENABLE;
        EXTI_Initstrue.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_Initstrue.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_Init(&EXTI_Initstrue);                                                        //外部中断初始化

        NVIC_Initstrue.NVIC_IRQChannel=EXTI3_IRQn;
        NVIC_Initstrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Initstrue.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_Initstrue.NVIC_IRQChannelSubPriority=2;
        NVIC_Init(&NVIC_Initstrue);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                //中断优先级分组
       
       
                LEDO=0;
                LED1=0;
        while(1);
       
}

void EXTI3_IRQHandler()
{
        delay_ms(10);
        if(KEY0==0)
        {
                LEDO=0;  //点亮LED0;
                LED1=1;
                delay_ms(1000);
        }
        EXTI_ClearITPendingBit(EXTI_Line3);
}
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
 楼主| 发表于 2017-3-22 13:59:38 | 显示全部楼层
wenzh3333 发表于 2017-3-22 13:56
主函数的LEDO=0;
              LED1=0;
放while  的前面。。。  中断里判断再调整状态

这样修改也还是不行
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
 楼主| 发表于 2017-3-22 14:51:25 | 显示全部楼层

果然是这个问题,谢谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-25 03:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表