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

2019-10-11 14:16发布

#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);
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
wenzh3333
1楼-- · 2019-10-11 16:07
delay_init();没加
wenzh3333
2楼-- · 2019-10-11 21:42
LEDO=0;
LED1=0;
在大循环里啊?

中断出来后不久瞬间置0了吗?
VU情
3楼-- · 2019-10-12 01:10
wenzh3333 发表于 2017-3-22 13:19
LEDO=0;
LED1=0;
在大循环里啊?

如何修改呢
wenzh3333
4楼-- · 2019-10-12 01:12
主函数的LEDO=0;
              LED1=0;
放while  的前面。。。  中断里判断再调整状态
VU情
5楼-- · 2019-10-12 05:33
 精彩回答 2  元偷偷看……
VU情
6楼-- · 2019-10-12 09:15
wenzh3333 发表于 2017-3-22 13:56
主函数的LEDO=0;
              LED1=0;
放while  的前面。。。  中断里判断再调整状态

这样修改也还是不行

一周热门 更多>