野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9071|回复: 6

按键中断——新人求教

[复制链接]
发表于 2018-7-21 10:25:09 | 显示全部楼层 |阅读模式
编写了一段程序,通过中断的方式让K1,K2控制LED的亮灭,但是K1有效,K2无反应,下面是程序
回复

使用道具 举报

 楼主| 发表于 2018-7-21 10:25:35 | 显示全部楼层
#include "stm32f10x.h"  //相当于51单片机中的 #include<reg51.h>
#include "bsp_led.h"
#include "bsp_exti.h"

void Delay(uint32_t count)
{
        for(;count!=0;count--);
}

int main(void)
{
        //系统的时钟已经被配置成72M
        LED_GPIO_Config();
        EXTI_Key_Config();
        while(1)
        {
       
        }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-21 10:26:33 | 显示全部楼层
#include "bsp_exti.h"

static void EXTI_NVIC_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStruct;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        //K1
        NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;       
        NVIC_Init(&NVIC_InitStruct);
        //K2
        NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
        NVIC_Init(&NVIC_InitStruct);       
}

void EXTI_Key_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        EXTI_InitTypeDef EXTI_InitStruct;
       
        //配置中断优先级
        EXTI_NVIC_Config();
       
        //初始化按键K1、K2
        RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK,ENABLE);

        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStruct.GPIO_Pin = KEY1_INT_GPIO_PIN;        
        GPIO_Init(KEY1_INT_GPIO_PORT,&GPIO_InitStruct);       
               
        //初始化EXTI
        //K1
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
       
        EXTI_InitStruct.EXTI_Line=EXTI_Line0;
        EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStruct.EXTI_LineCmd=ENABLE;
       
        EXTI_Init(&EXTI_InitStruct);
        //K2
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStruct.GPIO_Pin = KEY2_INT_GPIO_PIN;        
        GPIO_Init(KEY2_INT_GPIO_PORT,&GPIO_InitStruct);

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);
       
        EXTI_InitStruct.EXTI_Line=EXTI_Line13;
        EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStruct.EXTI_LineCmd=ENABLE;
       
        EXTI_Init(&EXTI_InitStruct);       
       
}

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-21 10:26:57 | 显示全部楼层
#ifndef _BSP_EXTI_H
#define _BSP_EXTI_H

#include "stm32f10x.h"

#define KEY1_INT_GPIO_PORT                                GPIOA
#define KEY1_INT_GPIO_CLK                                        RCC_APB2Periph_GPIOA
#define KEY1_INT_GPIO_PIN                                        GPIO_Pin_0

#define KEY2_INT_GPIO_PORT                                GPIOC
#define KEY2_INT_GPIO_CLK                                        RCC_APB2Periph_GPIOC
#define KEY2_INT_GPIO_PIN                                        GPIO_Pin_13
       
void EXTI_Key_Config(void);

#endif /*_BSP_EXTI_H*/
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-21 10:27:25 | 显示全部楼层
void EXTI0_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
        {
                LED_TOGGLE;
        }
        EXTI_ClearITPendingBit(EXTI_Line0);
}

void EXTI13_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line13)!=RESET)
        {
                LED_TOGGLE;
        }
        EXTI_ClearITPendingBit(EXTI_Line13);
}
回复 支持 反对

使用道具 举报

发表于 2018-7-21 11:04:40 | 显示全部楼层
key2的中断服务函数不是EXTI13,是EXTI15_10_合在一起的
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-7-21 15:44:09 | 显示全部楼层
笑你像狗 发表于 2018-7-21 11:04
key2的中断服务函数不是EXTI13,是EXTI15_10_合在一起的

谢谢热心的大佬
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 23:37 , Processed in 0.038736 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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