stm32不能进入外部中断程序

2019-07-14 19:20发布

配置代码看了几遍好像也没问题。。

IO口配置:
  1. void AFIO_Configuration_EXTI ()//外部中断引脚配置 IO复用,开外部中断要开复用
  2. {
  3.         GPIO_InitTypeDef GPIO_initstructure;

  4.         GPIO_initstructure.GPIO_Pin = GPIO_Pin_0; //选择Px.0引脚为外部中断
  5.         GPIO_initstructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度 50Mhz
  6.         GPIO_initstructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 根据外部电路,这里的外部中断需要用到上拉
  7.        
  8.         GPIO_Init(GPIOB,&GPIO_initstructure);//GPIOB初始化
  9.        
  10.        
  11.         GPIO_initstructure.GPIO_Pin = GPIO_Pin_12; //板载led  这里用来测试中断程序
  12.         GPIO_initstructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度 50Mhz
  13.         GPIO_initstructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

  14.         GPIO_Init(GPIOB,&GPIO_initstructure);//GPIOB初始化
  15.        
  16.        
  17.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);//GIPO引脚中断线路选择
  18. }
复制代码

外部中断控制器配置:
  1. void EXTI_Configuration ()//外部中断配置
  2. {
  3.         EXTI_InitTypeDef EXTI_initstructure;
  4.        
  5.         EXTI_DeInit();//先重置为缺省
  6.        
  7.         EXTI_initstructure.EXTI_Line = EXTI_Line0;//中断线0
  8.         EXTI_initstructure.EXTI_Mode = EXTI_Mode_Interrupt;//用到的是中断模式
  9.         EXTI_initstructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
  10.         EXTI_initstructure.EXTI_LineCmd = ENABLE;//打开中断
  11.        
  12.         EXTI_Init(&EXTI_initstructure);//初始化外部中断控制器
  13.        
  14.         EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志位
  15. }
复制代码

NVIC配置:
  1. void NVIC_Configuration ()//NVIC配置
  2. {
  3.         NVIC_InitTypeDef NVIC_initsturcture;
  4.        
  5.         #ifdef VECT_TAB_RAM  //把中断向量放进RAM中   在RAM中debug要有这几句
  6.         NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0000000);
  7.         #else
  8.         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  9.         #endif
  10.        
  11.        
  12.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//选择第0组优先级组
复制代码开启时钟以及主函数:
  1. int main (void)          
  2. {                  
  3.         RCC_Configuration ();//配置好时钟
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);//设置GPIOA GPIOB 复用功能 使能外设时钟
  5.        
  6.         GPIO_Configuration_CH595 ();//配置好GPIO  CH595用到的引脚
  7.         EXTI_init();//外部中断初始化 EXTI相关配置都丟这个函数里了
  8.         while(1)
  9.         {
  10.                 GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET);//板载led亮
  11.                 anime ();
  12.                 EXTI_GenerateSWInterrupt(EXTI_Line0);//用软件产生中断测试
  13.         }       
  14. }
复制代码

中断函数:
  1. void EXTI0_IRQHandler(void)//外部中断0 入口函数
  2. {
  3.         GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_SET);//板载led灭
  4.         delay_ms(2000);
  5.         EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志
  6. }
复制代码

用了个软件中断都没法进入中断,不知哪里的问题


补充内容 (2017-8-17 18:58):
NVIC的代码漏了一些:

void NVIC_Configuration ()//NVIC配置
{
        NVIC_InitTypeDef NVIC_initsturcture;
       
        #ifdef VECT_TAB_RAM  //把中断向量放进RAM中   在RAM中debug要有这几句
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0000000);
        #else
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
        #endif
       
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//选择第0组优先级组
                                                                                                                                                                                                                                                */
        NVIC_initsturcture.NVIC_IRQChannel = EXTI0_IRQn;//外部中断线0中断
        NVIC_initsturcture.NVIC_IRQChannelPreemptionPriority = 0;//抢占式(主)优先级  最高
        NVIC_initsturcture.NVIC_IRQChannelSubPriority = 0;//响应(从)优先级  最高
        NVIC_initsturcture.NVIC_IRQChannelCmd = ENABLE;//打开NVIC
       
        NVIC_Init(&NVIC_initsturcture);//初始化NVIC
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。