• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

不知什么原因外部中断服务函数进不去呢?

大老张1 2017-02-20 浏览量:1377
#include "stm32f10x.h" 

void gpio_init()//PA0为外部中断触发脚,PA2控制led
{
  GPIO_InitTypeDef GPIO_InitStructure; 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_ResetBits(GPIOA , GPIO_Pin_2);
}

void EXTI_init()//PA0与EXTI_Line0连通
{
  EXTI_InitTypeDef EXTI_InitStructure;
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // 管脚选择
  EXTI_ClearITPendingBit(EXTI_Line0);
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;// EXTI_Trigger_Rising
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure); 
}

void NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  NVIC_InitStructure.NVIC_IRQChannel = EXTI_Line0; //通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

int main(void) 

gpio_init();
  EXTI_init();
  NVIC_Config();
  while(1);


void EXTI0_IRQHandler(void) 

if( EXTI_GetITStatus(EXTI_Line0) != RESET ) 

EXTI_ClearITPendingBit(EXTI_Line0); 

GPIO_SetBits(GPIOA , GPIO_Pin_2); 
}  

这是中断服务函数,我硬件仿真过,进不来
为什么外部中断服务函数进不去呢?
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 外部中断也应该需要开启时钟吧,问题应该在你的exti的初始化上,你试一下这个RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE)
    • 发布于 2017-02-20
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:6
  • 又是一大堆的程序                           
    • 发布于2017-02-20
    • 举报
    • 评论 0
    • 0
    • 0

  • 一,你没说清楚PA0是否挂载按键,按键另外一端是Vcc还是接地

    默认为外部中断挂载按键

    若PA0挂载了按键且按键另外一端接地,则应设置PA0为上拉输入,触发方式为下降沿触发

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
      GPIO_Init(GPIOA, &GPIO_InitStructure);


    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;

    若PA0挂载了按键且按键另外一端接Vcc,则应设置PA0为下拉

    输入,触发方式为上升沿触发

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
      GPIO_Init(GPIOA, &GPIO_InitStructure);


    EXTI_InitStructure.EXTI_Trigger =  EXTI_Trigger_Rising;

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;


    修改中断handler函数

    void EXTI0_IRQHandler(void) 

    if( EXTI_GetITStatus(EXTI_Line0) != RESET ) 

    EXTI_ClearITPendingBit(EXTI_Line0); 

    GPIO_SetBits(GPIOA , GPIO_Pin_2); 
    }  


    定义PA2LED翻转函数

    void Toggle_PA2()
    {
    if(GPIO_ReadOtputDataBit (GPIOA,GPIO_Pin_2)==1)
    {
        GPIO_WriteBit(GPIOA,GPIO_Pin_2,0);
    }
    if(GPIO_ReadOtputDataBit (GPIOA,GPIO_Pin_2)==0)

    {

     GPIO_WriteBit(GPIOA,GPIO_Pin_2,1);

    }
    }


     (若PA0挂载按键且另一端接地,PA0为上拉输入的情况)

    void EXTI0_IRQHandler(void)
    {
      delay_ms(10);    //消抖
    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)
    {  

    Toggle_PA2();

    }
    EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位
    }

    (若PA0挂载按键且另一端接Vcc,PA0为下拉输入的情况)

    void EXTI0_IRQHandler(void)
    {
      delay_ms(10);    //消抖
    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
    {  

    Toggle_PA2();

    }
    EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位
    }


    • 发布于2017-02-20
    • 举报
    • 评论 0
    • 0
    • 0

  • NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    • 发布于2017-02-20
    • 举报
    • 评论 0
    • 0
    • 0

  • 有问题要学会调试,把无关的东西挑出来,然后用最简单的程序逐步排除错误
    • 发布于2017-02-20
    • 举报
    • 评论 0
    • 0
    • 0

  • 嗨,這行有錯誤喔

    NVIC_InitStructure.NVIC_IRQChannel = EXTI_Line0; //通道
    改成

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; 
    以上希望有解決您的問題

    • 发布于2017-02-20
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

不知什么原因外部中断服务函数进不去呢?