STM32中断触发

[复制链接]
945|8
 楼主| monkeypony 发表于 2015-5-25 10:49 | 显示全部楼层 |阅读模式
使用PB1作为外部中断触发,按一次按键灯处于亮状态,在按一次灯灭。

1、先配置GPIO端口、复用管脚外设时钟使能GPIO_Config();
  1. void GPIO_Config(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure;
  4.    
  5.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
  6.    
  7.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
  8.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//PB1复用管脚时钟使能
  9.    
  10.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  11.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  12.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.     GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//配置推挽输出,灯太亮,刺眼,故意把配置OD门,亮度暗一点
  14.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//由于配置OD输出,顾这要上拉
  15.     GPIO_Init(GPIOD,&GPIO_InitStructure);
  16.    
  17.     //配置PB1管脚作为触发输入,因为PB1管脚直接接开关按钮到地,所以内部上拉让其管脚处于高电平状态,当开关按下时,PB1管脚被拉低,通过下降沿进行触发
  18.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  19.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  20.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  21.     GPIO_Init(GPIOB,&GPIO_InitStructure);
  22. }


 楼主| monkeypony 发表于 2015-5-25 10:50 | 显示全部楼层
2、配置嵌套向量中断控制NVIC_Config(void),使用不同通道时得注意,EXTI0~EXTI4对应的是EXTI0_IRQn、EXTI1_IRQn、EXTI2_IRQn、EXTI3_IRQn和EXTI4_IRQn,EXTI5~EXTI9都用EXTI9_5_IRQn这个通道,EXTI10~EXTI15都用EXTI15_10_IRQn这个通道。
  1. void NVIC_Config(void)
  2. {
  3.     NVIC_InitTypeDef NVIC_InitStructure;
  4.    
  5.     #ifdef  VECT_TAB_RAM  
  6.     /* Set the Vector Table base location at 0x20000000 */
  7.     NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  8.     #else  /* VECT_TAB_FLASH  */
  9.     /* Set the Vector Table base location at 0x08000000 */
  10.     NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
  11.     #endif
  12.    
  13.     NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //由于使用的是PB1,对应的是EXTI1通道
  14.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  15.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  16.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断使能
  17.     NVIC_Init(&NVIC_InitStructure);   
  18. }
 楼主| monkeypony 发表于 2015-5-25 10:50 | 显示全部楼层
3、中断管脚配置EXTI_Config(void)
  1. void EXTI_Config(void)
  2. {
  3.     EXTI_InitTypeDef EXTI_InitStructure;
  4.    
  5.     //PB1作为外部中断,得相连接
  6.     SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource1);
  7.    
  8.     EXTI_InitStructure.EXTI_Line = EXTI_Line1;//通道
  9.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断
  10.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿
  11.     EXTI_InitStructure.EXTI_LineCmd    = ENABLE;//使能
  12.     EXTI_Init(&EXTI_InitStructure);
  13. }
 楼主| monkeypony 发表于 2015-5-25 10:50 | 显示全部楼层
5、主函数调用上面几个函数
  1. int main(void)
  2. {
  3.     Clock_Config();
  4.     GPIO_Config();
  5.     NVIC_Config();
  6.     EXTI_Config();
  7.         
  8.   while (1)
  9.   {
  10.         
  11.   }
  12. }
 楼主| monkeypony 发表于 2015-5-25 10:51 | 显示全部楼层
6、找中断函数名,函数名都已固定好,可以到startup_stm32f2xx.s中查找相关中断函数名,这里用的是EXTI1_IRQHandler()
  1. __Vectors       DCD     __initial_sp               ; Top of Stack
  2.                 DCD     Reset_Handler              ; Reset Handler
  3.                 DCD     NMI_Handler                ; NMI Handler
  4.                 DCD     HardFault_Handler          ; Hard Fault Handler
  5.                 DCD     MemManage_Handler          ; MPU Fault Handler
  6.                 DCD     BusFault_Handler           ; Bus Fault Handler
  7.                 DCD     UsageFault_Handler         ; Usage Fault Handler
  8.                 DCD     0                          ; Reserved
  9.                 DCD     0                          ; Reserved
  10.                 DCD     0                          ; Reserved
  11.                 DCD     0                          ; Reserved
  12.                 DCD     SVC_Handler                ; SVCall Handler
  13.                 DCD     DebugMon_Handler           ; Debug Monitor Handler
  14.                 DCD     0                          ; Reserved
  15.                 DCD     PendSV_Handler             ; PendSV Handler
  16.                 DCD     SysTick_Handler            ; SysTick Handler

  17.                 ; External Interrupts
  18.                 DCD     WWDG_IRQHandler                   ; Window WatchDog                                       
  19.                 DCD     PVD_IRQHandler                    ; PVD through EXTI Line detection                        
  20.                 DCD     TAMP_STAMP_IRQHandler             ; Tamper and TimeStamps through the EXTI line            
  21.                 DCD     RTC_WKUP_IRQHandler               ; RTC Wakeup through the EXTI line                       
  22.                 DCD     FLASH_IRQHandler                  ; FLASH                                          
  23.                 DCD     RCC_IRQHandler                    ; RCC                                             
  24.                 DCD     EXTI0_IRQHandler                  ; EXTI Line0                                             
  25.                 DCD     EXTI1_IRQHandler                  ; EXTI Line1     //这里有,把EXTI1_IRQHandler 拷贝下来                                
  26.                 DCD     EXTI2_IRQHandler                  ; EXTI Line2                                             
  27.                 DCD     EXTI3_IRQHandler                  ; EXTI Line3                                             
  28.                 DCD     EXTI4_IRQHandler                  ; EXTI Line4
 楼主| monkeypony 发表于 2015-5-25 10:51 | 显示全部楼层
7、写中断函数,把拷贝的函数名copy到stm32f2xx_it.c文件中的任意位置
  1. int flag = 0;//定义全局变量
  2. void EXTI1_IRQHandler()
  3. {
  4.     EXTI_ClearITPendingBit(EXTI_Line1); //清除中断挂起位,方便下次中断进入,因中断产生,该位会自动置位,所以这里得手动清除
  5.     if(!flag)
  6.     {
  7.         flag = ~flag;
  8.         GPIO_SetBits(GPIOD,GPIO_Pin_12);
  9.         GPIO_SetBits(GPIOD,GPIO_Pin_13);
  10.         GPIO_SetBits(GPIOD,GPIO_Pin_14);
  11.         GPIO_SetBits(GPIOD,GPIO_Pin_15);
  12.     }
  13.     else
  14.     {
  15.         flag = ~flag;
  16.         GPIO_ResetBits(GPIOD, GPIO_Pin_12);
  17.         GPIO_ResetBits(GPIOD, GPIO_Pin_13);
  18.         GPIO_ResetBits(GPIOD, GPIO_Pin_14);
  19.         GPIO_ResetBits(GPIOD, GPIO_Pin_15);
  20.     }   
  21. }
 楼主| monkeypony 发表于 2015-5-25 10:51 | 显示全部楼层
OK,到此,中断处理函数就写好了,按一次按键灯处于亮状态,在按一次灯灭
蜕变吧 发表于 2015-6-21 09:16 | 显示全部楼层
外部中断不是一定要开启AFIO时钟么?怎么没见开启呢?
tongbu2015 发表于 2015-6-21 21:09 | 显示全部楼层
//配置PB1管脚作为触发输入,因为PB1管脚直接接开关按钮到地,所以内部上拉让其管脚处于高电平状态,当开关按下时,PB1管脚被拉低,通过下降沿进行触发
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOB,&GPIO_InitStructure);

这样的设计值得注意的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

715

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部