一个简单的外部中断的小程序,帮忙看下哪里错了,谢谢

2019-07-14 19:39发布

使用的是STM32f107vc芯片,想要达到的效果是LED1亮,按下Key1,LED1灭,再按下Key1,LED1灯亮,如此循环:
#include "stm32f10x.h"

#define BitBand(addr,n) *(volatile unsigned long*)((addr & 0xf0000000)+0x20000000+(addr & 0xfffff)*32+n*4) //位绑定公式

#define GPIOC_ODR_A (GPIOC_BASE+0x0c)
#define GPIOC_IDR_A (GPIOC_BASE+0x08)
#define GPIOD_ODR_A (GPIOD_BASE+0x0c)
#define GPIOD_IDR_A (GPIOD_BASE+0x08)

#define PCout(n) BitBand(GPIOC_ODR_A,n)
#define PCin(n)  BitBand(GPIOC_IDR_A,n)
#define PDout(n) BitBand(GPIOD_ODR_A,n)
#define PDin(n)  BitBand(GPIOD_IDR_A,n)


#define Key1 PCin(4)
#define LED1 PDout(2)

void RCC_Configuration(void);
void GPIO_Configuration(void);
void EXTI_Configuration(void);
void NVIC_Configuration(void);
int main(void)
{
        RCC_Configuration();
        GPIO_Configuration();
        EXTI_Configuration();
        NVIC_Configuration();
        LED1=0;  //开始点亮LED灯
        while(1);       
}

void RCC_Configuration(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}

void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD,&GPIO_InitStructure);
}

void EXTI_Configuration(void)
{
        EXTI_InitTypeDef EXTI_InitStructure;
        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);
}

void NVIC_Configuration(void)                                               
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource4);
        NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

void EXTI4_IRQHandler(void)
{
                delay_ms(10);
                if(Key1==0)  //判断是否有中断
                {
                        LED1=!LED1;    //LEd灯翻转
                }
                EXTI_ClearITPendingBit(EXTI_Line4); //清空中断标志位
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
Mr_RMS
1楼-- · 2019-07-16 00:00
爱在南方 发表于 2017-4-18 21:30
可能是你IO口配置的问题,模式设为_ipu看下,设为上拉

试过了,上下拉没用
大大大大大鸟
2楼-- · 2019-07-16 03:32
如果软件没有问题的话,先用万用表测一下你那个设置的中断引脚到底有没有发生中断(电压的变化)。
Mr_RMS
3楼-- · 2019-07-16 09:16
 精彩回答 2  元偷偷看……
dyh0115
4楼-- · 2019-07-16 10:13
解决了吗? 我初学,和你碰到一样的问题,卡这过不去了。中断似乎没响应,不知道怎样去验证》
dyh0115
5楼-- · 2019-07-16 14:25
dyh0115 发表于 2017-11-14 21:58
解决了吗? 我初学,和你碰到一样的问题,卡这过不去了。中断似乎没响应,不知道怎样去验证》

自己解决了,太气人了,函数初始化没写在main里,初学没有注意书写格式,main函数下面的函数名有的在main函数前面声明了,有的在main里初始化了,以为是一样的,其实一个是声明,一个是初始化。
#include "stm32f10x.h"   
#include "stm32f10x_gpio.h"   
#include "stm32f10x_rcc.h"
#include "stm32f10x_exti.h"

void delay_ms(u16 time_ms)
{
                u16 i=0;
                while(time_ms --)
          {
                                i=12000;
                          while(i--);
                }
}

void key_gpio_init(void);
void NVIC_init (void );
void EXTI1_init(void );
               
int main(void)
{
    key_gpio_init();
    NVIC_init ();
    EXTI1_init();
    GPIO_SetBits (GPIOB,GPIO_Pin_8 );
          while(1);
}
风淡云轻2225
6楼-- · 2019-07-16 18:42
嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻

一周热门 更多>