野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12879|回复: 3

【新人求助】根据教程尝试编写了按键引发中断,但不成功,求教

[复制链接]
发表于 2018-5-1 21:51:41 | 显示全部楼层 |阅读模式
RT,基本程序是根据教程一步一步写的,但是按下按键后没有反应。

#include "stm32f10x.h"
#include "./led/bsp_led.h"
#include "./key/bsp_key.h"
int main(void)
{
        LED_GPIO_Config();
        EXTI_KEY_Config();
        while(1)
        {
        GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
        }
}
主程序里面我在循环里面加了句  “GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);”  是想开机后led就点亮,进入中断后另一个LED亮,
但是当我把  “EXTI_KEY_Config();”这句注释掉后,led灯才可以正常亮,但如果不注释的话,led无法开机点亮,同时按键也没反应。

求各位前辈指教,谢谢。


#include "./key/bsp_key.h"


static void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStruct;
        NVIC_PriorityGroupConfig(1);
        NVIC_InitStruct.NVIC_IRQChannel= KEY1_EXTI_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStruct);
        NVIC_InitStruct.NVIC_IRQChannel= KEY2_EXTI_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
        NVIC_Init(&NVIC_InitStruct);
        /*NVIC½á11ìå¡¢óÅÏè¼¶·Ö×é¡¢ÅäÖÃNVIC3õê¼»ˉ*/
}

void EXTI_KEY_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        EXTI_InitTypeDef EXTI_InitStruct;
       
       
        RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);
        RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
        RCC_APB2PeriphClockCmd(KEY1_AFIO_CLK,ENABLE);
       
        NVIC_Configuration();
       
       
        GPIO_InitStruct.GPIO_Mode                        =                        GPIO_Mode_IN_FLOATING;
        GPIO_InitStruct.GPIO_Pin                        =                        KEY1_GPIO_PIN;
        GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStruct);
       
        GPIO_EXTILineConfig(KEY1_GPIO_PortSource, KEY1_GPIO_PinSource);
        EXTI_InitStruct.EXTI_Line                        =                        KEY1_EXTI_LINE;
        EXTI_InitStruct.EXTI_Mode                        =                        EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger        =                        EXTI_Trigger_Rising;
        EXTI_InitStruct.EXTI_LineCmd        =                        ENABLE;
        EXTI_Init(&EXTI_InitStruct);
       

        GPIO_InitStruct.GPIO_Pin                        =                        KEY2_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode                        =                        GPIO_Mode_IN_FLOATING;
        GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStruct);
        GPIO_EXTILineConfig(KEY2_GPIO_PortSource, KEY2_GPIO_PinSource);
        EXTI_InitStruct.EXTI_Line                        =                        KEY2_EXTI_LINE;
        EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger        =                        EXTI_Trigger_Falling;
        EXTI_InitStruct.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStruct);
}






#ifndef                        __BSP_KEY_H
#define                        __BSP_KEY_H
#include                "stm32f10x.h"

#define        KEY1_EXTI_IRQn                EXTI0_IRQn
#define KEY1_GPIO_PIN                        GPIO_Pin_0
#define KEY1_GPIO_CLK                        RCC_APB2Periph_GPIOA
#define KEY1_AFIO_CLK                        RCC_APB2Periph_AFIO
#define KEY1_GPIO_PORT                GPIOA
#define        KEY1_EXTI_LINE                EXTI_Line0
#define        KEY1_GPIO_PortSource         GPIO_PortSourceGPIOA
#define        KEY1_GPIO_PinSource                GPIO_PinSource0
#define KEY1_IRQHandler       EXTI0_IRQHandler

#define        KEY2_EXTI_IRQn                EXTI15_10_IRQn
#define KEY2_GPIO_PIN                        GPIO_Pin_13
#define KEY2_GPIO_CLK                        RCC_APB2Periph_GPIOC
#define KEY2_GPIO_PORT                GPIOC
#define        KEY2_EXTI_LINE                EXTI_Line13
#define        KEY2_GPIO_PortSource         GPIO_PortSourceGPIOC
#define        KEY2_GPIO_PinSource                GPIO_PinSource13
#define KEY2_IRQHandler       EXTI15_10_IRQHandler


void EXTI_KEY_Config(void);

#endif

回复

使用道具 举报

发表于 2018-5-2 09:23:35 | 显示全部楼层
中断服务函数写了没
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-2 21:28:09 | 显示全部楼层
flyleaf 发表于 2018-5-2 09:23
中断服务函数写了没

不好意思……我找到错误了QAQ
NVIC_PriorityGroupConfig(1); 这句的形参弄错了。。。应该是NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
把这个改好就ok了。。。
所以还想请教下,为啥这句形参写错了,编译器没有报错?这种错误应该如何查找?谢谢
回复 支持 反对

使用道具 举报

发表于 2018-5-3 17:31:00 | 显示全部楼层
zyjzbqgz 发表于 2018-5-2 21:28
不好意思……我找到错误了QAQ
NVIC_PriorityGroupConfig(1); 这句的形参弄错了。。。应该是NVIC_Priorit ...

你这不是语法错误,这种错误编译器检查不出来,你跟踪一下NVIC_PriorityGroup_1,它是个宏定义,为0x600,就是个数字,你写个1也是个数字,满足函数NVIC_PriorityGroupConfig(uint32_t )的形参要求,当然不会报错。至于你在这里将形参写成1,如果不是因为粗心的话,那就是你没理解形参这个数字的意义,或者说没搞明白这个函数是如何利用形参来配置相关寄存器的。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 03:02 , Processed in 0.042059 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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