微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stm32不能进入外部中断程序

stm32不能进入外部中断程序

时间:10-02 整理:3721RD 点击:
配置代码看了几遍好像也没问题。
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
}

还是要靠自己啊。原来是Debug里的Reset没设置对。RAM中调试要选择SYSRESETREQ或者VECTRESET,其他两个不能进入中断的。

原来是仿真的的Reset设置错了,怪不得中断进步了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top