股票

STM32中断初始化设置

MCU为STM32F103C8T6
首先纠正几个错误关系:
1,中断线程与中断引脚是一一对应的,PA0、PB0…PG0对应的是EXTI_Line0,以此类推,不是随便关联起来就可以的;
2,相应的中断向量函数,EXTI0_IRQHandler~EXTI4_IRQHandler对应EXTI_Line0~EXTI_Line4,EXTI9_5_IRQHandler对应EXTI_Line5~EXTI_Line9,注意是一对多,同样EXTI15_10_IRQHandler对应EXTI_Line10~EXTI_Line15;
3,中断通道号EXTI15_10_IRQn不同头文件叫法不同,有的为EXTI15_10_IRQChannel;
4,使用中断必须开启引脚复用:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
5,中断处理函数中注意清除中断标志位,防止持续进入中断:EXTI_ClearITPendingBit(EXTI_Line10);

初始化代码:

  1. void EXTI15_10_Init(void)  
  2. {  
  3.     NVIC_InitTypeDef nvicConfig;  
  4.     GPIO_InitTypeDef GPIO_InitStruct;  
  5.   
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  
  8.   
  9.     /* Configure pin: IRQ */  
  10.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;  
  11.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;  
  12.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;  
  13.     GPIO_Init(GPIOB, &GPIO_InitStruct);  
  14.   
  15.     // Connect EXTI Line  
  16.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10);  
  17.   
  18.     {  
  19.         // Configure EXTI line  
  20.         EXTI_InitTypeDef extiConfig;  
  21.         extiConfig.EXTI_Line = EXTI_Line10;  
  22.         extiConfig.EXTI_Mode = EXTI_Mode_Interrupt;  
  23.         extiConfig.EXTI_Trigger = EXTI_Trigger_Falling;  
  24.         extiConfig.EXTI_LineCmd = ENABLE;  
  25.         EXTI_Init(&extiConfig);  
  26.     }  
  27.   
  28.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
  29.     nvicConfig.NVIC_IRQChannel = EXTI15_10_IRQn;  
  30.     nvicConfig.NVIC_IRQChannelPreemptionPriority = 0;  
  31.     nvicConfig.NVIC_IRQChannelSubPriority = 0;  
  32.     nvicConfig.NVIC_IRQChannelCmd = ENABLE;  
  33.     NVIC_Init(&nvicConfig);  
  34. }  

中断处理函数代码,位于文件stm32f10x_it.c中

  1. void EXTI15_10_IRQHandler(void) {  
  2.     static signed int i=1;  
  3.   if (EXTI_GetITStatus(EXTI_Line10) != RESET)  
  4.   {  
  5.   
  6.       if(i>0)  
  7.       {  
  8.         GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET);  // Led1 ON  
  9.         GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);    // Led2 ON  
  10.       }  
  11.       else  
  12.       {  
  13.           GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);  // Led2 ON  
  14.           GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_SET);    // Led2 ON  
  15.       }  
  16.     i *= -1;  
  17.   
  18.     EXTI_ClearITPendingBit(EXTI_Line10);  
  19.   }  
  20. }  
打赏
原文链接:,转发请注明来源!

发表评论